【问题标题】:Extent Report Issue Parallel testing范围报告问题并行测试
【发布时间】:2019-03-19 13:03:15
【问题描述】:

我有以下报告代码:

public class Reporting {
    private ExtentHtmlReporter extentHtmlReporter;

    private static ThreadLocal<ExtentReports> extentReports = new ThreadLocal<>();
    private static ThreadLocal<ExtentTest> extentTest = new ThreadLocal<>();

    public synchronized ExtentTest createInstanceReport(String testCaseName) {
        System.out.println(extentReports.get());

        new File(Constants.userDir + "/Reports/").mkdirs();

        // To generate report with name
        extentHtmlReporter = new ExtentHtmlReporter(
                Constants.userDir + "/Reports/" +
                        "ExecutionReport_" + new SimpleDateFormat(
                        Constants.date).format(new Date()) + ".html");

        // Setting Document Title
        extentHtmlReporter.config().setDocumentTitle("Demo");
        // Setting Report Name
        extentHtmlReporter.config().setReportName("Demo Automation");
        // Setting Theme
        extentHtmlReporter.config().setTheme(Theme.STANDARD);
        // Setting Chart location
        extentHtmlReporter.config().setTestViewChartLocation(ChartLocation.TOP);
        // Setting Chart visibility
        extentHtmlReporter.config().setChartVisibilityOnOpen(false);
        // Setting Time stamp
        extentHtmlReporter.config().setTimeStampFormat("yyyy-MM-dd HH:mm:ss");
        // Setting append exist as true
        extentHtmlReporter.setAppendExisting(true);
        ExtentReports extentReports = new ExtentReports();
        extentReports.attachReporter(extentHtmlReporter);

        // Setting system info
        extentReports.setSystemInfo("Name",
                BaseTest.prop.getProperty(Constants.testerName));
        extentReports.setSystemInfo("Environment",
                BaseTest.prop.getProperty(Constants.environment));
        extentReports.setSystemInfo("Browser",
                BaseTest.prop.getProperty(Constants.browser));
        Reporting.extentReports.set(extentReports); // Instead of using here extentReport thread like this, Can anyone suggest to use it directly

        // Add test case name in report
        ExtentTest extentTest = Reporting.extentTest.get();
        extentTest = Reporting.extentReports.get().createTest(testCaseName);
        Reporting.extentTest.set(extentTest);

        // Assigning categories
        extentTest.assignCategory(MultiFunction.getProp()
                .getProperty(Constants.browser));

        System.out.println(Reporting.extentReports.get());
        System.out.println(Reporting.extentTest.get());

        return extentTest;
    }

    public synchronized ExtentTest getExtentTest() {
        return extentTest.get();
    }

    public synchronized ExtentReports getInstanceReport() {
        return extentReports.get();
    }

    public synchronized void remove() {
        extentReports.remove();
        extentTest.remove();
    }
}

我正在尝试使用 TestNG 进行并行测试(将来必须使用 Selenium 网格和酱汁)。我执行了 2 个测试用例,然后只在报告中添加了一个测试用例结果。

我已经使用线程池隔离了extentTestextentReporterWebDriver 实例。

使用extentHtmlReporter 实例在下面尝试:

1) Tried to make it static(no luck)  
2) Tried to make it local (the same behaviour, getting only 1 test case result)
3) Tried as a non-static global variable ( no luck)

您能建议如何解决上述问题吗?

请注意:只生成一份报告。但是当我尝试在调试模式下运行并行测试用例时,会为这两个测试用例生成报告。我认为是因为一个测试用例克服了它杀死某个实例(在非调试模式下运行时)

另外,我想在我的代码中重新设计以下位置:

对于extentRpeort,我使用的是:

Reporting.extentReports.set(extentReports);

extentReport 实例添加到我的extentReport 线程。
而不是像这样添加我想直接使用它以减少代码行。

【问题讨论】:

  • 是否生成了两个不同的报告?
  • 不只有一份报告。但是当我尝试在调试模式下运行并行测试用例时,会为两个测试用例生成报告
  • 当你调用方法 createInstanceReport()
  • @PrashantJeetSingh 请在发布之前格式化您的代码!很难阅读。另外,考虑如何为您的问题使用突出显示。它可以帮助人们更快地阅读和理解您的问题。
  • 不清楚您是否找到了解决方案,但如果没有,请同时查看:stackoverflow.com/questions/52759135/…。您可能需要稍微修改一下以满足您的需要。

标签: android java selenium selenium-webdriver automation


【解决方案1】:

使用 TestNG/jUnit(或您正在使用的其他运行器框架)侦听器,这是一个很好的示例。 不要把所有东西都放在一个类中。

https://www.swtestacademy.com/extent-reports-version-3-reporting-testng/

【讨论】:

  • 嘿 infern0,实际上我想要一个类中的所有报告代码和逻辑,如果您看到代码,我只有一种方法可以处理所有事情,其余 2 种方法仅用于获取实例
  • 您不必每次都创建实例,只需为其添加一个新测试即可。没有必要把所有东西都放在一个班级里。
  • 这就是为什么我担心它会创建两个不同的目录。您需要在创建新文件之前放置目录是否存在。
【解决方案2】:

如果我理解正确,您必须从所有已执行的 TestNG 案例中生成报告。

但是,从您共享的代码中,很明显您会遇到一些问题。你犯了一些严重的错误,结果很明显:

  • 为了使用 TestNG 生成报告,我建议从 TestNG 侦听器 获取有关测试执行的信息。比如:

    public final class TestNGListener extends TestListenerAdapter implements IInvokedMethodListener, ISuiteListener {
    
    @Override
    public void onStart(ITestContext context) {
        Logger.info(buildMessage(Logger.PREFIX_TEST_STARTED, context.getName()));
    }
    
    @Override
    public void onFinish(ITestContext context) {
        Logger.info(buildMessage(Logger.PREFIX_TEST_FINISHED, context.getName()));
    }
    
    @Override
    public void onTestStart(ITestResult result) {
        Logger.info(buildMessage(Logger.PREFIX_METHOD_STARTED, getMethodName(result)));
    }
    
    @Override
    public void onTestSuccess(ITestResult result) {
        Logger.info(buildMessage(Logger.PREFIX_METHOD_SUCCESS, getMethodName(result)));
        processTestResult(result);
    }
    
    @Override
    public void onTestFailure(ITestResult result) {
        Logger.info(buildMessage(Logger.PREFIX_METHOD_FAILED, getMethodName(result)));
    }
    
  • 你不能用一种方法做所有事情!你打破了Single Responsibility Principle。您的createInstanceReport() 正在一个地方完成所有工作(设置报告详细信息、设置系统信息、附加已执行的测试用例以进行报告)。您必须将此逻辑重新设计为一些逻辑上的单独操作。用下一行重新设计你的问题后:

Reporting.extentReports.set(extentReports)

可以成功消失。

  • 你必须考虑一个案例,为什么你需要完全使用Extent, Reports Version 3TestNG 有来自盒子的测试报告。他们很穷,但他们是开箱即用的。如果您只想稍微改进一下,您可以使用 ReportNG 而不是 TestNG。

很容易配置:Configuring ReportNG with TestNG for HTML Reports

它没有得到维护,但它使 TestNG 报告非常吸引人且易于理解。

无论如何,我的建议是使用TestNGListener 来获取有关测试用例执行的信息。并阅读有关良好编程实践的更多信息。

【讨论】:

    【解决方案3】:

    问题在于范围报告实例的刷新。 我使用 ThreadLocal 来存储范围报告实例并且正在刷新错误的实例。

    【讨论】:

      猜你喜欢
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多