为了账号安全,请及时绑定邮箱和手机立即绑定

范围报告问题 并行测试

范围报告问题 并行测试

慕丝7291255 2021-11-17 17:27:12
我有以下报告代码: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我正在尝试使用 TestNG 进行并行测试(并且将来必须使用 Selenium 网格和酱汁)。我执行了 2 个测试用例,然后在报告中只添加了一个测试用例结果。我已经使用 threadPool隔离了extentTest,extentReporter和WebDriver实例。下面用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线程。而不是像这样添加我想直接使用它以减少代码行。
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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


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


为了使用TestNG生成报告,我建议从TestNG listener获取有关测试执行的信息。就像是:


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)));

}

你不能用一种方法做所有的事情!你违反了单一职责原则。您createInstanceReport()正在一个地方完成所有工作(设置报告详细信息、设置系统信息、将执行的测试用例附加到报告)。您必须将此逻辑重新设计为一些逻辑分离的操作。用下一行重新设计你的问题后:


Reporting.extentReports.set(extentReports)


可以成功消失。


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

配置起来非常简单:使用 TestNG 为 HTML 报告配置 ReportNG。


它没有得到维护,但它使 TestNG 报告真正引人注目且易于理解。


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


查看完整回答
反对 回复 2021-11-17
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2021-11-17
?
呼如林

TA贡献1798条经验 获得超3个赞

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


查看完整回答
反对 回复 2021-11-17
  • 3 回答
  • 0 关注
  • 177 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信