selenium,junit,cucumber,maven项目失败后如何调用函数

How to call a function after failure of selenium,junit,cucumber and maven project

我创建了一个 java cucumber maven 项目。现在我想添加一个侦听器或任何方式,以便在任何黄瓜 step/Test 失败时调用我的屏幕截图捕获功能。

我没有在 Junit 的 TestRunner class 中使用 @RunWith(Cucumber.class)。我已经集成了 @RunWith(ExtendedCucumberRunner.class)

第一次尝试: 在这里,我尝试在 ExtendedCucumberRunner class 中覆盖以下函数:-

import org.junit.runner.notification.Failure;

public void testFailure(Failure failure){
}

但是如果我试图覆盖错误显示为:

The method testFailure(Failure) of type ExtendedCucumberRunner must override or implement a supertype method.

第二次尝试:

我也试过扩展 RunListener class 还是不行。

我尝试添加 Lister 的代码如下:

import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;

import automationframework.AutomationLog;
import automationframework.ScreenshotAndTestNgReporterListener;

public class JUnitExecutionListener extends RunListener{
    /**
     *  Called when an atomic test fails.
     *  https://howtodoinjava.com/junit/how-to-add-listner-in-junit-testcases/
     * */
    @Override
    public void testFailure(Failure failure) throws java.lang.Exception{
        super.testFailure(failure);
        if (!failure.getDescription().isSuite()) {
            ScreenshotAndTestNgReporterListener.customScreenshot();
            AutomationLog.error("In Custom Failer Class of Junit");
            System.out.println("FAILED!!!!!"); //Here pass your screenshot capture event
        }
        ScreenshotAndTestNgReporterListener.customScreenshot();
        AutomationLog.error("In Custom Failer Class of Junit");
        System.out.println("FAILED!!!!!"); //Here pass your screenshot capture event
    }
}

第三次尝试:

我也尝试在 TestRunner 中添加以下规则 class

@Rule
public TestWatcher watchman= new TestWatcher() {
    private String watchedLog;
    @Override
    protected void failed(Throwable e, Description description) {
        ScreenshotAndTestNgReporterListener.customScreenshot();
        AutomationLog.error(e.getMessage());
        watchedLog+= description + "\n";
    }

    @Override
    protected void succeeded(Description description) {
        watchedLog+= description + " " + "success!\n";
       }
   };

我不想添加 @After 方法,因为即使任何测试用例成功,它也会每次调用。

我只想在测试用例失败时捕获屏幕截图

任何人都可以告诉我任何方法,以便我可以实现同样的目标吗?

正如@Grasshopper 正确指出的那样。在任何步骤定义中使用以下函数一次。 Cucumber 将识别钩子,并在每个测试用例 运行 之后 运行 下面的函数。如果它失败,场景将 运行 if 条件,您可以在其后 运行 编写任何您想要的代码。

参考:

代码:

@After
public void afterMethod(Scenario scenario) {
    if(scenario.isFailed()) {

    }
}

导入:

import cucumber.api.java.After;