失败后继续运行黄瓜步骤

时间:2013-03-08 16:20:19

标签: cucumber gherkin cucumber-jvm cucumber-junit

即使其中一个步骤失败,有没有办法继续执行Cucumber Steps。在我目前的设置中,当一个步骤失败时,黄瓜会跳过剩下的步骤....我想知道是否有一些方法可以让黄瓜跑步者设置好...

我可以评论失败的步骤但是当你不知道哪一步会失败时它不实用...如果我可以继续剩下的步骤我会一次性知道完整的失败测试集......而不是进入循环过周期......

环境:黄瓜JVM,R,Java,Ibatis,Spring Framework,Maven

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

一种方法是捕获所有断言错误,并在最后一步决定是否失败或通过测试用例。在这种情况下,您可以定制它,比如在任何步骤检查以查看是否存在多于n个错误并且测试失败,如果是这样的话。

这就是我所做的:

  1. 在@Before中为测试用例初始化一个StringBuffer for Errors
  2. 捕获Assertion Errors并添加到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());  
        }
    
  4. 检查@After中的StringBuffer或测试用例的最后一步,确定是否可以传递或失败,如下所示:

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

    唯一的问题是,在报告中,所有步骤都显示为绿色,但测试用例看起来失败了。然后,您可能必须查看错误字符串以了解哪个步骤失败。只要存在断言错误,您就可以向String添加额外信息,以帮助您轻松找到该步骤。

答案 2 :(得分:0)

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

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();
    }
}