如何使用Cucumber重新运行失败的场景?

如何使用Cucumber重新运行失败的场景?,cucumber,Cucumber,我用黄瓜做测试。如何仅重新运行失败的测试?使用重新运行格式化程序运行Cucumber: cucumber -f rerun --out rerun.txt 它将所有失败方案的位置输出到此文件 然后您可以使用 cucumber @rerun.txt 这是我简单而简洁的解决方案 步骤1:使用rerun:target/rerun.txt编写cucumber java文件,如下所述。Cucumber在rerun.txt中写入失败场景行号,如下所示 features/MyScenaios.featur

我用黄瓜做测试。如何仅重新运行失败的测试?

使用重新运行格式化程序运行Cucumber:

cucumber -f rerun --out rerun.txt
它将所有失败方案的位置输出到此文件

然后您可以使用

cucumber @rerun.txt

这是我简单而简洁的解决方案

步骤1:使用
rerun:target/rerun.txt
编写cucumber java文件,如下所述。Cucumber在
rerun.txt
中写入失败场景行号,如下所示

features/MyScenaios.feature:25
features/MyScenaios.feature:45
稍后,我们可以在步骤2中使用此文件。将此文件命名为
MyScenarioTests.java
。这是运行标记场景的主文件。如果您的场景测试用例失败,
MyScenarioTests.java
将在目标目录下写入/标记它们
rerun.txt

@RunWith(Cucumber.class)
@CucumberOptions(
    monochrome = true,
    features = "classpath:features",
    plugin = {"pretty", "html:target/cucumber-reports",
              "json:target/cucumber.json",
              "rerun:target/rerun.txt"} //Creates a text file with failed scenarios
              ,tags = "@mytag"
           )
public class MyScenarioTests   {

}
步骤2:创建另一个场景文件,如下所示。让我们将其称为
FailedScenarios.java
。每当您注意到任何失败的场景时,请运行此文件。此文件将使用
target/rerun.txt
作为运行场景的输入

@RunWith(Cucumber.class)
@CucumberOptions(
    monochrome = true,
    features = "@target/rerun.txt", //Cucumber picks the failed scenarios from this file 
    format = {"pretty", "html:target/site/cucumber-pretty",
            "json:target/cucumber.json"}
  )
public class FailedScenarios {

}

每次如果您注意到任何失败的场景,请在步骤2中运行该文件,您至少需要版本1.2.0才能使用@target/rerun.txt新功能。之后,只需创建一个在末尾运行并使用此文件的运行程序。此外,如果您使用的是Jenkins,您可以在随机故障功能上添加一个标签,这样构建就不会失败,除非运行两次。

我知道这很旧,但我首先找到了我的方法,然后找到了一个更为最新的答案(不是公认的Cyril Duchon Doris的答案):
task cucumber() {
    dependsOn assemble, compileTestJava
    doLast {
        javaexec {
            main = "io.cucumber.core.cli.Main"
            classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
            args = ['--plugin', 'json:target/cucumber-reports/json/cucumber.json',
                    '--plugin', "rerun:target/rerun.txt",
                    '--glue', 'steps',
                    'src/test/resources']
        }
    }
}

task cucumberRerunFailed() {
    doLast {
        javaexec {
            main = "io.cucumber.core.cli.Main"
            classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
            args = ['--plugin', 'json:target/cucumber-reports/json/cucumber.json',
                    '@target/rerun.txt']
        }
    }
}

自cucumber 3.0以来,您可以使用
--retry
指定重试失败场景的次数。

只要把它钉在你的cucumber命令上:
黄瓜--重试2

是否将所有命令放在一个cmd行中?您可以使用rake任务来运行这两个命令。之后,您可以将rake文件调用为:rake features:jenkins_with_rerun您可以使用&&将其全部放在一个cmd行中(如果您只想启动它并走开)cucumber-f rerun--out rerun.txt&&cumber@rerun。txt@JoeSusnick您不能使用&&因为如果第一个命令失败(您需要它的时候!),它将不会重新运行(仅在故障时重新运行)或;(始终重新运行).rerun.txt文本保存失败方案的功能文件名。如果我在一个功能文件中有两个方案,但其中一个失败,那么重新运行是否会在功能级别上执行,从而使传递的方案再次运行,而正如我所理解的,它不在方案级别上。是否有办法仅识别失败方案名而不是整个功能?我想知道我看到已经生成了rerun.txt,但仍然没有执行失败的场景。您必须使用
FailedScenarios
类来执行测试。换句话说,您需要右键单击
FailedScenarios
并点击run。我可以实现它。我已经在这里发布了我的答案。@vkrams从IDE运行时,这对我很有效。但是,当使用gradle从命令行运行时,
@target/rerun.txt
部分无法识别,我得到了
未定义的场景
消息。您是否遇到过类似的情况?我使用Eclipse尝试了与上面完全相同的步骤。我可以看到rerun.txt文件,其中包含说明:Login.feature:4可能这意味着该特定功能文件中的第四步。不幸的是,当我运行失败的场景类时,我得到:java.lang.IllegalArgumentException:在文件系统或类路径上都找不到:不是文件或目录:C:\Users\TTotth fejel\Git\TestAutomation\Cucumber\Login.feature,找不到:cl的资源asspath:Login.feature但如果类路径不包含该文件,则第一个测试永远无法运行。我如何调试该文件?或添加正确的类路径?请详细解释一下。我正在尝试通过Jenkins/命令行运行该文件。是否可以在runner中的@CucumberOptions中实现它?我通过Maven运行测试