【发布时间】:2016-01-25 19:16:58
【问题描述】:
所以我有一个套房,像这样:
@RunWith(Suite.class)
@Suite.SuiteClasses({TestClass1.class, TestClass2.class, TestClass3.class})
public class TestSuite {
static List<ExtentTest> extentTestList = new ArrayList<>();
@ClassRule
public static ExtentWatcher extentWatcher = new ExtentWatcher() {
@Override
protected void starting(Description description) {
extentTestList.addAll(extentWatcher.getTests());
}
@Override
protected void finished(Description description) {
extentWatcher.flushReports(extentTestList);
}
};
}
上面的代码有效,但问题是它导致我的 Watcher 报告套件的结果,而不是单个测试。此外,如果测试失败,套件仍会报告为通过。我的 Watcher 是这样的:
public class ExtentWatcher extends TestWatcher {
// A little set up to give the report a date in the file name
private DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
private Date date = new Date();
private String fileDate = dateFormat.format(date);
private String reportName = "./Test_Report_" + fileDate + ".html";
public ExtentReports extent;
ArrayList<ExtentTest> testList = new ArrayList<>();
public ExtentWatcher() {
extent = createReport();
}
// If test passed, watcher will record this with Extent Reports
@Override
protected void succeeded(Description description) {
ExtentTest test = extent.startTest(description.getDisplayName());
test.log(LogStatus.PASS, "Test Run Successful");
testList.add(test);
}
// Likewise in case of failure
@Override
protected void failed(Throwable e, Description description) {
ExtentTest test = extent.startTest(description.getDisplayName());
test.log(LogStatus.FAIL, "Test Failure: " + e.toString());
testList.add(test);
}
/**
* These methods do the legwork - this file is based off of an example I found @ www.kieftsoft.nl/?p=81
* Eventually we can add some screenshot logic here, but just a clean test report and version info will do
*/
private ExtentReports createReport() {
// Create the report - Extent just needs a little config
ExtentReports extent = new ExtentReports(reportName, false);
extent.config().reportName("Test Report: " + fileDate);
return extent;
}
public void flushReports(List<ExtentTest> testList) {
// This ends the test and then sends (flushes) everything to the html document
for(ExtentTest test : testList) extent.endTest(test);
extent.flush();
}
public List<ExtentTest> getTests() {
return testList;
}
}
此代码可以很好地注释为单个测试的@Rule(每个测试单独的报告,不可取),但如上所述,这不适用于套件级别,我真的不确定如何让它工作。我在想我可以收集所有测试的列表,然后在套件中结束测试并刷新它们,这将允许 ExtentReport 给我所有测试的报告。但是,我无法具体获取单个测试结果 - 我将返回一项测试,其中 displayName() = 套件名称。
如何跟踪单个测试,然后在所有测试完成后刷新它们,并让 ExtentWatcher 逐个测试地处理通过/失败,而不是只为套件处理一次?
【问题讨论】:
-
添加flushReports成功和失败后是否有效?
-
与问题无关 - 为什么不更新到最新版本?
-
不,如果我刷入成功或失败,我将获得每个测试的报告。我目前使用的是最新版本。
-
@SeeYaLater Automator:我遇到了同样的问题。有没有机会你能弄明白?
-
@user1466466 您是否尝试在
ExtentReports中也覆盖starting和finished?
标签: java junit annotations webdriver automated-tests