使用cucumber-jvm重新尝试失败的黄瓜测试

我有一个Cucumber-JVM,JUnit,Selenium设置。 我通过在Eclipse中使用JUnit运行RunSmokeTests.java来启动运行。 我还设置了一个maven配置文件来从命令行运行测试,将来可能还有Jenkins。

当测试运行时,其中一些可能会失败,主要是由于应用程序花费的时间超过预期。 然后我必须重新运行这些场景。 目前我通过手动将@rerun标记附加到失败的标记然后运行RunReruns.java来运行RunReruns.java ,这类似于RunSmokeTest.java但使用@rerun标记。

随着自动化测试数量的增加,标记测试并开始运行并清除标签非常耗时。 有没有使用Cucumber-JVM重新运行失败测试的自动化方法?

RunSmokeTests.java

 package testGlueClasses; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @Cucumber.Options(features = "src/test/java", strict = true, format = { "html:target/CucumberReport", "json:target/JSON/Cucumber.json", "FrameworkCore.CustomTestReporter" }, tags = { "@SmokeTest" }, glue = { "FrameworkCore", "MyApp.Utils", "MyApp.StepDefinitions" }) public class RunSmokeTests { } 

Maven片段:

   smoke   **/RunSmokeTests.java    

我提出了另一种解决方案,使用maven和黄瓜重新运行失败的测试。

1)使用RunNotifier记录测试失败

 public class RerunningCucumber extends Cucumber { private final String className; @SuppressWarnings("rawtypes") public RerunningCucumber(Class clazz) throws InitializationError, IOException { super(clazz); className = clazz.getSimpleName(); } @Override public void run(RunNotifier notifier) { notifier.addListener(new RunListener(){ public void testFailure(Failure failure) throws Exception { Throwable error = failure.getException(); if (error instanceof AssertionError){ //Nothing. This is a normal failure. Continue return; } //No! A wild exception has appeared! //Let's run this test again. RerunningCucumber.addFile(className); } }); super.run(notifier); } private static final String filename = "target/rerun.properties"; private static final Set addedClasses = new HashSet(); public static synchronized void addFile(String className) throws IOException{ //First find the file if (addedClasses.contains(className)){ return; } File file = new File(filename); if (!file.exists()){ //Need to create the file PrintWriter writer = new PrintWriter(file, "UTF-8"); writer.print("retryclasses=**/"+className+".class"); writer.close(); } else { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file, true))); out.print(",**/"+className+".class"); out.close(); } addedClasses.add(className); } } 

2)使用自定义类作为黄瓜测试的跑步者。

这将运行测试,并且每当发生故障时,将失败的类输出到文件。 诀窍是保持function简短并创建大量测试类以避免重复测试。

 @RunWith(RerunningCucumber.class) @CucumberOptions(features = {"classpath:features/testFeature.feature}, format = { "html:target/cucumber-html-report/testFeature.html", "json:target/cucumber-json-report/testFeature.json"}, tags = {"@testFeature"}) public class RunTestFeature { } 

3)向maven添加Rerun配置文件。

这样做有三件事:1)它将失败的类加载到内存中,2)清除失败的类属性文件,3)仅重新运行从属性文件加载的失败的测试:

   retry    org.codehaus.mojo properties-maven-plugin 1.0-alpha-2    pre-clean  read-project-properties    target/rerun.properties       org.apache.maven.plugins maven-clean-plugin 2.6.1    target  rerun.properties       org.apache.maven.plugins maven-antrun-plugin 1.6   compile  run    Retrying the following classes: "${retryclasses}"       org.apache.maven.plugins maven-surefire-plugin 2.17   ${retryclasses}  true    test  test        

4)用法

首次试运行:

 mvn clean test 

下一个测试运行:

 mvn clean test -Pretry mvn clean test -Pretry mvn clean test -Pretry ... 

您可以根据需要重复多次,直到没有错误。

我手边没有可执行的示例,但您也可以在jvm上执行此操作。 有一个RerunFormatter写入一个文本文件,列出失败场景的文件和行号:

 @CucumberOptions(format = {"rerun:target/rerun.txt"}) 

您应该能够通过在@前面添加前缀来指定此文件作为另一个测试类的输入:

 @CucumberOptions(features = {"@target/rerun.txt"}) 

您可以使用cucumber-jvm-parallel-plugin贡献的代码作为解决方法,直到它上线。 命中命令如下所示。

  1. git clone -b tagwiseOutlinewiseIssueRerun https://github.com/sugatmankar/cucumber-jvm-parallel-plugin.git
  2. mvn clean install。
  3. 现在编辑项目pom文件并按照此处的说明使用。
  4. 此处使用此插件的示例。