java - 如何获取在 Java 中 Cucumber 测试失败时抛出的异常?

标签 java cucumber

我可以使用以下方法对测试失败执行操作:

@After
public void afterTest(Scenario scenario) {
    if (scenario.isFailed()) {
        /*Do stuff*/
    }
}

但是,我需要执行的某些操作取决于抛出的异常以及抛出异常的上下文。有没有办法获取导致测试失败的Throwable?例如,在 JUnit 中,我会通过扩展 TestWatcher 并向我的测试添加规则来做到这一点:

@Override
protected void failed(Throwable e, Description description) {
    /*Do stuff with e*/
}

但是 cucumber-junit 实现不允许使用规则,因此该解决方案不适用于 Cucumber。

我认为我不需要解释为什么在测试失败时访问抛出的异常会有用,但是我仍然会提供一个示例:

我的测试环境并不总是稳定的,所以我的测试随时可能会意外失败(没有特定的地方我可以 try catch 异常,因为它随时可能发生)。发生这种情况时,我需要重新安排测试以进行另一次尝试,并记录事件,以便我们可以获得一些关于环境不稳定性的良好统计数据(时间、频率、持续时间等)

最佳答案

Frank Escobar 建议的解决方法的问题:

通过使用反射进入框架内部,您依赖于实现细节。这是一种不好的做法,当框架更改其实现时,您的代码可能会中断,正如您将在 Cucumber v5.0.0 中观察到的那样。

Cucumber 中的 Hook 旨在操纵场景前后的测试执行上下文。他们不会报告测试执行本身。报告是横切关注点,最好使用插件系统进行管理。

例如:

package com.example;

import io.cucumber.plugin.ConcurrentEventListener;
import io.cucumber.plugin.event.EventPublisher;
import io.cucumber.plugin.event.Result;
import io.cucumber.plugin.event.Status;
import io.cucumber.plugin.event.TestCase;
import io.cucumber.plugin.event.TestCaseFinished;

public class MyTestListener implements ConcurrentEventListener {
    @Override
    public void setEventPublisher(EventPublisher publisher) {
        publisher.registerHandlerFor(TestCaseFinished.class, this::handleTestCaseFinished);
    }

    private void handleTestCaseFinished(TestCaseFinished event) {
        TestCase testCase = event.getTestCase();
        Result result = event.getResult();
        Status status = result.getStatus();
        Throwable error = result.getError();
        String scenarioName = testCase.getName();
        String id = "" + testCase.getUri() + testCase.getLine();
        System.out.println("Testcase " + id + " - " + status.name());
    }
}

当使用 JUnit 4 和 TestNG 时,您可以使用以下方式激活此插件:

@CucumberOptions(plugin="com.example.MyTestListener")

对于 JUnit 5,您可以将其添加到 junit-platform.properties:

cucumber.plugin=com.example.MyTestListener 

或者如果您正在使用 CLI

--plugin com.example.MyTestListener 

关于java - 如何获取在 Java 中 Cucumber 测试失败时抛出的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42542557/

相关文章:

java - Android loopj Async Http 在 1.4.5 更新后崩溃

java - 什么时候接口(interface)中的方法被 'both'覆盖并实现?

java - size() 函数在 Processing 3.0 中不起作用

java - Drools API 混淆

cucumber - 如何在Cucumber中访问方案和示例名称?

ruby-on-rails - 无法批量分配 protected 属性

java - cucumber Java : Does not recognize a Long data type

Java 应用程序不知道正在打开的文件的名称 - Mac OS X

ruby - 无方法错误 : undefined method `expect' when trying to use it within a SitePrism class

ruby - 如何使用 Site Prism 从下拉列表中选择项目?