我有UI测试项目和具有相同技术堆栈的API测试项目(JAVA1.8,Cucumber-JVM,JUnit,Maven),这两个项目都向我展示了这个问题。可能是因为两者都存在相同的依赖关系。
我使用maven-surefire-plugin内置功能<rerunFailingTestsCount>1</rerunFailingTestsCount>
使用了Flaky测试重新运行机制。另外,我根据<groupId>io.cucumber</groupId>
而不是<groupId>info.cukes</groupId>
添加了黄瓜依赖项。这两个都有自己的cucumber-java和cucumber-jvm依赖版本。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<rerunFailingTestsCount>1</rerunFailingTestsCount>
</configuration>
<executions>
<execution>
<id>acceptance-test</id>
<phase>integration-test</phase>
<goals>
<goal>test</goal>
</goals>
<configuration>
<forkCount>1</forkCount>
<reuseForks>true</reuseForks>
<includes>
<include>**/*Runner.class</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-spring</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-jvm</artifactId>
<version>2.4.0</version>
<type>pom</type>
</dependency>
@RunWith(Cucumber.class)
@ContextConfiguration(locations = {"file:/src/test/resources/spring-config.xml"})
@CucumberOptions(
glue = "com.test.uitest",
features = "classpath:cucumber",
tags = {"~@ignore","@ui_home"},
monochrome = true,
plugin = {"pretty", "html:target/cucumber-reports",
"json:target/cucumber-reports/cucumber.json",
"rerun:target/rerun.txt"} //Creates a text file with failed scenarios
)
public class AllTestsRunner {
}
现在很明显,我需要让另一个跑者跟随其中的代码(根据StackOverflow上的其他论坛和主题)
@RunWith(Cucumber.class)
@CucumberOptions(
monochrome = true,
glue = "com.test.uitest",
features = "@target/rerun.txt", //Cucumber picks the failed scenarios from this file
format = {"pretty", "html:target/rerun-reports",
"json:target/cucumber-reports/rerun-report.json"}
)
public class FailedTestsRunner {
}
但是我不需要有这个第二名,因为重新运行机制绝对精彩,只有顶级的一名选手。甚至,也不需要在1st runner中生成rerun.txt文件.maven-surefire插件(v_2.21.0)中的内置机制以及io.cucumber v_2.4.0可以正常工作,如果任何场景在第一次执行时失败,它会自动重新运行而不会在rerun.txt文件中记录它。
我的功能文件中有5个场景。如果所有这些都在第一轮中通过。它使用cucumber.json报告成功生成报告,显示所有5个场景。
但是,如果(比如说)5个场景中有2个失败,并且这些场景在重新运行机制中自动执行,那么cucumber.json报告文件只记录这两个场景的结果而不是全部5个场景。总体构建PASSES如果这两个场景在重新运行或FAILs中传递,如果这两个场景失败。这是正确的,但我的问题是用重新运行机制覆盖了cucumber.json。
我试图使用maven-cucumber-reporting
插件v_3.16.0但它实际上读取了本身的cucumber.json文件,因此无法解决我的问题。任何帮助,将不胜感激。
答案 0 :(得分:2)
好消息是你没有做错任何事情!
坏消息是你观察到的结果完全符合预期。这是链接不同工具(Sub Macro1()
ActiveSheet.CheckBoxes.Add(171, 18, 72, 65.25).Select
Selection.Name = "CheckboxA"
ActiveSheet.CheckBoxes.Add(180, 81, 54, 54.75).Select
Selection.Name = "CheckboxB"
End Sub
)的自然结果,这些工具彼此之间没有意识到。从Cucumber的角度看,重新运行似乎是一个全新的执行,因此它将很乐意覆盖旧的报告。只有在链的开头,才有可能创建准确的报告。
因此,从最少努力,最差到最差到最佳质量的选择是:
使用Surefire生成的报告。
编写自己的插件,附加结果而不是覆盖它们。
编辑:删除了使用cucumber-jvm-parallel-plugin为每个方案创建单个单元测试的建议。这实际上不起作用。
答案 1 :(得分:1)
在这种情况下,AllTestsRunner
会重复运行,直到成功达到rerunFailingTestsCount
参数中提到的计数,或者在上次运行时失败。所以最后一次运行总是胜利。
surefire插件会在目标文件夹中创建自己的报告。两个报告是AllTestsRunner.txt
,这是摘要,TEST-AllTestsRunner.xml
包含详细信息。这两份报告都有关于所有运行的详细信息您可以创建一个自定义程序,将TEST-AllTestsRunner.xml
文件转换为所需的json。
有surefire report plugin读取上述xml文件并生成html报告。它将在站点文件夹中创建报告并使用mvn站点运行。也许这有用。