android - 范围报告问题并行测试
问题描述
我有以下报告代码:
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 个测试用例,然后报告中只添加了一个测试用例结果。
我已经使用 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
线程。
我不想像这样添加,而是想直接使用它以减少代码行。
解决方案
如果我理解正确,您必须从所有已执行的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)
可以成功消失。
- 你必须考虑一个案例,为什么你需要使用 exact
Extent, Reports Version 3
。TestNG有来自盒子的测试报告。他们很穷,但他们是开箱即用的。如果你只想稍微改进一下,你可以使用ReportNG而不是 TestNG。
很容易配置:使用 TestNG for HTML Reports 配置 ReportNG。
它没有得到维护,但它使 TestNG 报告非常吸引人且易于理解。
无论如何,我的建议是TestNGListener
用于获取有关测试用例执行的信息。并阅读有关良好编程实践的更多信息。
推荐阅读
- python - numpy数组转换成矩阵
- javascript - 比较嵌套数组中的 n 和 n+1 并检查 n+1 是否在 n 的 500 范围内
- c - 隐式引用 seccomp
- r - 如何通过两个标识符将 data.table 中的列添加到第二个 data.table?
- node.js - 正斜杠和反斜杠令人困惑
- python - 检查列表中的拆分文本成员资格后如何从数据框中删除行?
- javascript - Echarts地图捏放大手机/平板电脑不工作
- azure-log-analytics - 规模集的日志分析查询
- android - 如何在回收站视图中更改列表中项目的文本?
- python - 如何为给定的方程写出完美的循环?