Java 如何通过使用TestWatcher来判断JUnit何时完成?
我需要:Java 如何通过使用TestWatcher来判断JUnit何时完成?,java,pdf,selenium,junit,Java,Pdf,Selenium,Junit,我需要: 观看测试 搜集信息 根据测试生成报告 测试将通过TeamCity开始。我创建了一个TestWatcher对象来监听测试结果,这个TestWatcher包含在每个包含测试的JUnit类中。我有一个监听器,可以在整个套件完成时监听,但我必须以编程方式添加它。由于我现在使用TeamCity运行测试并生成结果,我相信我已经失去了这种能力。我还被要求制作一份带有TeamCity结果的PDF报告。我只需要知道测试何时完成,这样我就可以知道何时开始构建报告。仅仅使用TestWatcher就可以实
- 观看测试
- 搜集信息
- 根据测试生成报告
@Rule
public TestWatcher watchman = new TestWatcher() {
private BaseTestResult currentTest;
private long startTime;
private long endTime;
@Override
protected void starting(Description d) {
startTime = System.currentTimeMillis();
currentTest = new BaseTestResult(d);
currentTest.setBrowser(type);
if (d.getAnnotation(TestDescription.class) != null) {
currentTest.setDescription(d.getAnnotation(
TestDescription.class).description());
}
currentTest.setSuite(d.getTestClass().getName());
}
@Override
protected void succeeded(Description d) {
currentTest.setSucceeded(true);
}
@Override
protected void failed(Throwable e, Description d) {
currentTest.setThrowable(e);
}
@Override
protected void finished(Description d) {
endTime = System.currentTimeMillis();
currentTest.setRuntime(endTime - startTime);
String fileName = d.getMethodName() + type + ".png";
File srcFile = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.FILE);
String filePath = "./screens/" + fileName;
try {
FileUtils.copyFile(srcFile, new File(filePath));
currentTest.setScreenshotPath(filePath);
} catch (IOException e) {
log.severe(e.toString());
}
if (currentTest.getSucceeded()) {
BaseListener.getSuiteResult().addPassed(currentTest);
} else {
BaseListener.getSuiteResult().addFailed(currentTest);
}
// Quit, the web driver
if (driver != null) {
driver.quit();
}
}
};
您可以这样做:
@ClassRule // the magic is done here
public static TestRule classWatchman = new TestWatcher() {
@Override
protected void starting(Description desc) {
System.out.println(desc.testCount()); // insert actual logic here
}
};
它监视整个班级,而不是每次考试。这意味着它在套件开始时提供套件中的测试数量。然后,每次调用BaseListener.getSuiteResult().addPassed(currentTest)时
或BaseListener.getSuiteResult().addFailed(currentTest)代码>您可以检查是否已经在套件中添加了测试数量(表示套件已完成)
或者,甚至更好
@ClassRule
public static TestRule classWatchman = new TestWatcher() {
@Override
protected void finished(Description desc) {
System.out.println("Suite completed!"); // insert actual logic here
}
};
如果您有多个包含测试的类,那么可以创建一个包含所有这些测试的AllMyTests类!然后,JUnit可以运行这个AllMyTests类。在本例中,@ClassRule将作为@SuiteRule(不存在)运行
这对我有用
@ClassRule
public Static TestWatcher watchman= new TestWatcher() {
@Override
protected void failed(Throwable e, Description description) {
logger.info(description.getMethodName()+"Failed!"+" "+e.getMessage());
}
@Override
protected void succeeded(Description description) {
logger.info(description.getMethodName()+" " + "success!");
}
@Override
protected void finished(Description desc) {
logger.info("Suite completed!");
}
};
顺便说一句,我刚刚意识到,我们都使用我们的测试观察者,以旧的方式命名为“观察者”:)谢谢你的回答,这绝对是朝着正确的方向迈出的一步。如果我有多个课程呢?我计划拥有多个测试类,并希望根据运行的所有测试类的结果构建一个报告。
@ClassRule
public Static TestWatcher watchman= new TestWatcher() {
@Override
protected void failed(Throwable e, Description description) {
logger.info(description.getMethodName()+"Failed!"+" "+e.getMessage());
}
@Override
protected void succeeded(Description description) {
logger.info(description.getMethodName()+" " + "success!");
}
@Override
protected void finished(Description desc) {
logger.info("Suite completed!");
}
};