JUnit5测试失败时如何截图

问题描述 投票:0回答:1

我正在尝试编写在测试失败时截取浏览器屏幕截图的功能。我关心的是:

  • 截取屏幕截图并将其添加到 Allure2 报告中。
  • 测试必须并行运行。
  • 报告中有关拆卸的信息

我尝试使用 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 的完美场所,但问题又是如何实现它...

java selenium junit5 allure parallel-testing
1个回答
0
投票

您可以使用 AfterTestExecutionCallback 来完成此操作。 并实现你内心的逻辑

@Override
  public void afterTestExecution(ExtensionContext context) throws Exception {
    if (context.getExecutionException().isPresent()) {
    takeScreenshot();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.