当前位置: 首页 > 知识库问答 >
问题:

如何实现支持并行测试套件执行和动态命名报告生成的扩展报告

狄奕
2023-03-14

我已经构建了一个使用Selenium Grid和TestNG的小型测试框架,我想让它支持使用扩展报告3的并行执行报告,并根据将要运行的测试套件的名称创建一个本地动态命名文件。最终的想法是运行一个包含多个类的测试套件,每个类只包含一个测试,由@Test注释定义。

<suite>
 <test name="environment1">
  <parameter name="X" value="Y"/>
 <classes>
  <class name="Class containing Test A"/>
  <class name="Class containing Test B"/>
  <class name="Class containing Test C"/>
 </classes>
 </test>
</suite>

这些测试是UI测试,整个测试套件可能需要大约2个小时才能完成。当TestSuite完成时,将生成一个ExantReport html报告,其中包含每个测试的结果。

我想做的是,开始运行一个测试套件,然后开始运行另一个相同的测试套件,与第一个测试套件的执行并行,但是在不同的环境中,当它们完成时,我想有两个不同的报告。目前,如果我尝试简单地做到这一点,一个报告将覆盖另一个。

有人能告诉我如何实现这个目标吗?

下面,我提供了我的基本测试配置文件:

import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Parameters;

import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.markuputils.ExtentColor;
import com.aventstack.extentreports.markuputils.MarkupHelper;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.ITestResult;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;

public class TestSuiteBase {
    protected WebDriver driver;
    protected SearchPageFactory search;
    public static ExtentHtmlReporter htmlreporter;
    public static ExtentReports extent;
    public static ExtentTest test;

    @BeforeSuite
    public void SetUp() {
        htmlreporter = new ExtentHtmlReporter(System.getProperty("user.dir") + "/test-output/MyReport.html");
        System.out.println(System.getProperty("user.dir"));
        extent = new ExtentReports();
        extent.attachReporter(htmlreporter);
    }

    @Parameters({ "platform","browser", "url" })
    @BeforeClass(alwaysRun=true)
    public void setup(String platform, String browser, String url) throws MalformedURLException
    {       
        driver = getDriverInstance(platform, browser, url);
        search = PageFactory.initElements(driver, SearchPageFactory.class);
    }

    public static WebDriver getDriverInstance(String platform, String browser, String url)
            throws MalformedURLException {

        String nodeURL = "http://localhost:4444/wd/hub";
        WebDriver driver = null;
        DesiredCapabilities capabilities = new DesiredCapabilities();

        // Platforms
        if (platform.equalsIgnoreCase("Windows")) {
            capabilities.setPlatform(Platform.WINDOWS);
        }
        if (platform.equalsIgnoreCase("MAC")) {
            capabilities.setPlatform(Platform.MAC);
        }
        // Browsers
        if (browser.equalsIgnoreCase("chrome")) {
            capabilities = DesiredCapabilities.chrome();
        }
        if (browser.equalsIgnoreCase("firefox")) {
            capabilities = DesiredCapabilities.firefox();
        }
        if (browser.equalsIgnoreCase("ie")) {
            capabilities = DesiredCapabilities.internetExplorer();
        }

        driver = new RemoteWebDriver(new URL(nodeURL), capabilities);

        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        // Open the Application
        driver.get(url);
        return driver;
    }

    @AfterMethod
    public void getResult(ITestResult result) {
        if (result.getStatus()== ITestResult.FAILURE) {
            test.fail(MarkupHelper.createLabel(result.getName() + " Test case failed ", ExtentColor.RED));
            test.fail(result.getThrowable());
        } else if (result.getStatus()== ITestResult.SUCCESS){
            test.pass(MarkupHelper.createLabel(result.getName() + " Test case failed ", ExtentColor.GREEN));
        } else {
            test.skip(MarkupHelper.createLabel(result.getName() + " Test case failed ", ExtentColor.YELLOW));
            test.skip(result.getThrowable());
        }
    }

    @AfterSuite
    public void testDown() {
        extent.flush();
    }

    @AfterClass
    public void afterClass() {
        driver.quit();
    }
}

我是编程和自动化领域的新手,因此,任何有关这项工作的帮助或建议,特别是或一般,将不胜感激。提前感谢您!

共有1个答案

赫连冠玉
2023-03-14

如果您为每个类提供相同的报告名称,根据类功能为每个报告指定不同的名称,则可能会发生这种情况。

这三个类都应包含唯一的报告名称,

 <class name="Class containing Test A"/>
 <class name="Class containing Test B"/>
 <class name="Class containing Test C"/>
 类似资料:
  • 本文向大家介绍jmeter如何自动生成测试报告,包括了jmeter如何自动生成测试报告的使用技巧和注意事项,需要的朋友参考一下 1、准备.jmx脚本文件 2、在脚本文件路径下执行cmd命令: 参数解析:   ● -n: 非GUI模式执行JMeter   ● -t: 执行测试文件所在的位置   ● -l: 指定生成测试结果的保存文件,.jtl文件格式   ● -e: 测试结束后,生成测试报告   ●

  • 当类与 TestNG 并行运行时,我们不会获得范围报告,但 TestNG 报告会更新。请找到我正在使用的示例代码和版本。如果我们只运行一个类(TestClass1.java),则将生成范围报告。 硒版本3.4.0 范围报告版本:3.0.6 扩展报告库.java 测试类1.java TestClass2.java testng.xml

  • 我试图用ExtentReport和TestNG执行我的基本项目测试,但当我执行2个类时,ExtentTestManager中的“categoryName”。java由第二个测试填充,而第一个测试没有运行。我尝试实现一个LocalThread来完成这项任务,但我无法实现。。。 扩展测试管理器.java 范围曼安格.java 测试侦听器.java SearchInGoogleTest.java Tes

  • 如何为temyers/cucumberJVM并行插件配置扩展报告? 我们使用Teamyers Cumber JVM并行插件,使用Maven surefire插件并行运行Selenium Cumber测试。使用Cucumber JVM并行插件,我们绕过了传统Cucumber runner类的需求 对于每个并行运行,它都会生成单独的报告。 如何为其配置扩展报告。 谢谢

  • 我正在使用Junit运行cucumber宁静测试: 代码片段: 对于每个测试执行,都会生成单独的html报告,但不会直接使用HtmlAggregate StoryReport生成聚合(组合)报告(参考:https://github.com/serenity-bdd/serenity-core/issues/244) 这是我使用的代码片段,它被挂起并且聚合未完成。在所有cucumber宁静测试完成后

  • 我试图用TestNG.xml运行我的TestNG套件。我的套件中总共有四个类,但我只能用所有方法一次运行两个类。假设我在每个类中有3个方法,那么在TestNG套件中,如果我只添加两个类,TestNG.xml文件将用6个方法运行我的两个测试。现在,如果我尝试在testng.xml文件中添加第三个类,它将只运行每个类的第一个方法。这意味着现在它只运行3个方法(每个类一个)。我在我的项目下创建了一个源文