我正在尝试编写在测试失败时截取浏览器屏幕截图的功能。我关心的是:
我尝试使用 JUnit API 来实现 Test Watcher。我有一个这样的问题,当它将驱动程序传递给 testFailed 方法(只是为了在测试失败的情况下执行 SS)时,我无法使用 @AfterEach 注释来关闭驱动程序,因为否则,驱动程序将为 NULL。
测试继承的BaseTest类包含来自JUnit5的注释并在这里初始化Driver,我想在这里将其关闭。该类还由 CustomTestWatcher 类 扩展,它实现了 Test Watcher
@ExtendWith(CustomTestWatcher.class)
public class TestBase {
protected WebDriver driver;
@BeforeAll
public static void beforeAll() {
AllureFeatures.generateEnvironmentVariablesForAllure(); // generate enviroments.xml for allure report purposes
}
@BeforeEach
public void setupDriver() {
WebDriverThreadLocal.setDriver();
this.driver = WebDriverThreadLocal.getDriver();
driver.get(BASE_URL);
}
@AfterEach
public void closeDriver() {
WebDriverThreadLocal.teardown();
}
自定义测试观察者类 我不喜欢这个解决方案。它针对每个测试状态(禁用、成功、中止、失败)在 4 个位置重复代码。我更喜欢使用 @AfterEach 注释,不幸的是,我不知道如何...Tear-down 也不会在报告中可见。
public class CustomTestWatcher implements TestWatcher {
@Override
public void testDisabled(ExtensionContext context, Optional<String> reason) {
WebDriverThreadLocal.teardown();
}
@Override
public void testSuccessful(ExtensionContext context) {
WebDriverThreadLocal.teardown();
}
@Override
public void testAborted(ExtensionContext context, Throwable cause) {
WebDriverThreadLocal.teardown();
}
@Override
public void testFailed(ExtensionContext context, Throwable cause) {
ScreenShotCreator.takeScreenShot(WebDriverThreadLocal.getDriver()); // pass the driver and do SS
WebDriverThreadLocal.teardown();
}
我还读到 Allure 有一个 TestLifecycleListener 接口,您可以在其中重写 BeforeTestStop 方法,看起来是执行 SS 的完美场所,但问题又是如何实现它...
您可以使用 AfterTestExecutionCallback 来完成此操作。 并实现你内心的逻辑
@Override
public void afterTestExecution(ExtensionContext context) throws Exception {
if (context.getExecutionException().isPresent()) {
takeScreenshot();
}
}