gpt4 book ai didi

java - 一名测试观察员报告 JUnit Suite 中各个测试的结果

转载 作者:搜寻专家 更新时间:2023-10-30 19:47:23 26 4
gpt4 key购买 nike

所以我有一个套件,像这样:

@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 报告套件的结果,而不是单个测试的结果。此外,如果测试失败,套件仍会报告为已通过。我的观察者是这样的:

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 在逐个测试的基础上处理通过/失败,而不是只为套件一次?

最佳答案

我使用一个 RunListener 实现,它将结果记录在一个文件中。首先,我有一个为每个测试套件调用的测试运行器类:

public Result run(String suite) {
Class<?> suiteClass = null;
try {
suiteClass = Class.forName(suite);
} catch (ClassNotFoundException ex) {
return null;
}
JUnitCore core = new JUnitCore();
this.testRun = new TestRun(testLogging, suite);
core.addListener(new TestRunListener(testLogging, testRun));
Result result = core.run(suiteClass);
return(result);
}

TestRun 类是一个自定义类,它只计算已开始、通过、失败、忽略的测试的数量。

TestRunListener 实现 org.junit.runner.notification.RunListener,并根据回调(例如 testFailure()、testFinished() 等)跟踪有关测试状态的信息。

@Override
public void testFailure(Failure failure) throws Exception {
classLogger.log(Level.CONFIG, failure.getMessage());
classLogger.log(Level.CONFIG, failure.getTestHeader());
classLogger.log(Level.CONFIG, failure.getTrace());
classLogger.log(Level.CONFIG, failure.getDescription().getDisplayName());
if (failure.getException() != null) {
classLogger.log(Level.CONFIG, failure.getException().getMessage());
}
super.testFailure(failure);

Description description = failure.getDescription();
Test test = processTestResult(TestStatus.FAIL, description);
if (test == null) {
classLogger.log(Level.SEVERE, "TEST IS NULL:" + description.getDisplayName());
return;
}

classLogger.log(Level.CONFIG, failure.getMessage()+ " " + description.getDisplayName());

test.setFailureMessage(description.getDisplayName());
test.setFailureException(failure.getException());
LogRecord record = new LogRecord(Level.CONFIG, failure.getMessage());
record.setParameters(new Object[] { test, failure });
testFailuresLogger.log(record);
}

关于java - 一名测试观察员报告 JUnit Suite 中各个测试的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35000531/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com