5

即使其中一个步骤失败,是否有任何方法可以继续执行 Cucumber Steps。在我当前的设置中,当一个步骤失败时,黄瓜会跳过剩余的步骤..我想知道是否有某种方法可以调整黄瓜跑步者的设置..

我可以注释掉失败的步骤,但是当你不知道哪个步骤会失败时它不实用......如果我可以继续剩下的步骤,我会一次知道完整的失败测试集......而不是循环往复...

环境:Cucumber JVM、R、Java、Ibatis、Spring Framework、Maven

4

3 回答 3

3

在 step 失败后继续执行 step 不是一个好主意,因为 step 失败可能会给 World 带来不变的违反。更好的策略是增加场景的粒度。不要用多个“Then”语句编写单个场景,而是使用示例列表分别测试每个后置条件。有时,场景大纲和示例列表可以整合类似的故事。https://docs.cucumber.io/gherkin/reference/#scenario-outline

有一些关于添加功能以标记某些步骤以在失败后继续进行的讨论。https://github.com/cucumber/cucumber/issues/79

于 2013-03-09T16:27:43.820 回答
0

一种方法是捕获所有断言错误,并在最后一步决定是失败还是通过测试用例。在这种情况下,您可以对其进行定制,例如,在任何步骤检查是否有超过 n 个错误,如果是,则测试失败。

这是我所做的:

  1. 为测试用例的 @Before 中的错误初始化 StringBuffer
  2. 捕获断言错误并添加到 StringBuffer,这样它们就不会被抛出并终止测试用例。
  3. 检查 StringBuffer 以确定测试用例是否失败。

    StringBuffer verificationErrors;
    
    // Initialize your error SringBuffer here
    
    @Before
    public void initialize() {
        verificationErrors = new StringBuffer();
    }
    // The following is one of the steps in the test case where I need to assert     something
    
    @When("^the value is (\\d+)$")
    public void the_result_should_be(int arg1) {
        try  {
            assertEquals(arg1, 0);
        }
        catch(AssertionError ae) {
            verificationErrors.append("Value is incorrect- "+ae.getMessage());  
        }
    

在@After 或者测试用例最后一步检查StringBuffer,判断是否可以通过,如下:

if (!(verificationErrors.size()==0)) {
   fail(verificationErrors.toString());
}

唯一的问题是,在报告中,所有步骤看起来都是绿色的,但测试用例看起来失败了。然后您可能需要查看错误字符串以了解哪些步骤失败了。每当出现断言错误时,您都可以向字符串添加额外信息,以帮助您轻松找到该步骤。

于 2013-03-09T16:36:46.923 回答
0

使用SoftAssert累积所有断言失败。然后将您的步骤定义类标记为@ScenarioScoped,并在步骤定义类中添加一个标记为@After 的方法,在其中执行 mySoftAssert.assertAll();

IE

import io.cucumber.guice.ScenarioScoped;
import io.cucumber.java.After;
import io.cucumber.java.Before;
import io.cucumber.java.en.Then;

@ScenarioScoped
public class MyStepDefinitions {

SoftAssert mySoftAssert=new SoftAssert();

    @Then("check something")
    public void checkSomething() {
       mySoftAssert.assertTrue(actualValue>expectedMinValue);
    }

    @After
    public void afterScenario(Scenario scenario) throws Exception {
        mySoftAssert.assertAll();
    }
}
于 2020-12-17T15:16:27.833 回答