使用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贡献的代码作为解决方法,直到它上线。 命中命令如下所示。
- git clone -b tagwiseOutlinewiseIssueRerun https://github.com/sugatmankar/cucumber-jvm-parallel-plugin.git
- mvn clean install。
- 现在编辑项目pom文件并按照此处的说明使用。
- 此处使用此插件的示例。