一个测试观察程序,用于报告 JUnit 套件中各个测试的结果
所以我有一套房,像这样:
@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);
        }
    };
}
上面的代码有效,但问题是它会导致我的观察者报告套件的结果,而不是单个测试。此外,如果测试失败,套件仍会报告通过。我的观察者是这样的:
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(每个测试都有单独的报告,不需要),但如上所述,这在套件级别上不起作用,我真的不确定如何使其工作。我想我可以收集所有测试的列表,然后在套件中结束测试并刷新它们,这将允许DisgreeReport给我所有测试的报告。但是,我无法具体获得单个测试结果 - 我将得到一个测试,displayName() = 套件名称。
我如何跟踪各个测试,然后在所有测试完成后刷新它们,并让DemitsWatcher在测试的基础上处理通过/失败,而不是只为套件处理一次?