我有以下报告代码:
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
线程中。
与其像这样添加,我不想直接使用它,以减少代码行。
答案 0 :(得分: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 3
。 TestNG 包含框中的测试报告。他们很穷,但现成的。如果您只想稍微改善一下,可以在TestNG上使用ReportNG。 配置非常容易:Configuring ReportNG with TestNG for HTML Reports。
它没有得到维护,但是它使TestNG报告确实令人眼花candy乱,易于理解。
无论如何,我的建议是使用TestNGListener
获取有关测试用例执行的信息。并详细了解良好的编程习惯。
答案 1 :(得分:1)
使用TestNG / jUnit(或您正在使用的其他运行器框架)侦听器,这是一个很好的示例。 不要将所有内容都放在一个类中。
https://www.swtestacademy.com/extent-reports-version-3-reporting-testng/
答案 2 :(得分:0)
问题在于扩展范围报告实例的刷新。 我正在使用ThreadLocal存储扩展报告实例,并刷新了错误的实例。
答案 3 :(得分:0)
我使用了Extent Reports几次,但后来从TestProject自动化平台中找到了不错的SDK。它是免费的,所以我建议所有对报告感到厌倦的人都推荐它。 这是它的样子
reporter.step("Outbound date selected", selectedMonth.equals(months[monthFromIndex]), TakeScreenshotConditionType.Always);
和步骤报告的屏幕截图