我有 UI 测试项目和具有相同技术堆栈(JAVA1.8、Cucumber-JVM、JUnit、Maven)的 API 测试项目,这两个项目都向我展示了这个问题。可能是因为两者都存在相同的依赖关系。

我已经使用 maven-surefire-plugin 内置功能 <rerunFailingTestsCount>1</rerunFailingTestsCount> 使用了 Flaky 测试重新运行机制。另外,我根据 <groupId>io.cucumber</groupId> 而不是 <groupId>info.cukes</groupId> 添加了 cucumber 依赖项。这两者都有自己版本的cucumber-java 和cucumber-jvm 依赖项。

我的 POM.XML 看起来像这样。

<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 {
}

但是我不需要这个第二个运行者,因为重新运行机制绝对出色,只有一个运行者在上面。甚至,不需要在第一个运行器中生成 rerun.txt 文件。 maven-surefire 插件 (v_2.21.0) 和 io.cucumber v_2.4.0 中的内置机制完美运行,如果任何场景在第一次执行期间失败,它会自动重新运行,而不会将其记录在 rerun.txt 文件中。

##问题是##

我的功能文件中有 5 个场景。如果他们都在第一次运行中通过。它成功地生成了带有显示所有 5 个场景的 Cucumber.json 报告的报告。
但是,如果(比如说)5 个场景中有 2 个失败,并且这些在重新运行机制中自动执行,则cucumber.json 报告文件仅记录这两个场景的结果,而不是所有 5 个场景的结果。如果这 2 个场景通过重新运行,则总体构建 PASSES 或如果这 2 个场景失败则 FAIL。这是正确的,但我的问题是cucumber.json 被重新运行机制覆盖了。
我尝试使用 maven-cucumber-reporting 插件 v_3.16.0 但它实际上读取了cucumber.json 文件本身,因此没有解决我的问题。任何帮助,将不胜感激。

最佳答案

好消息是你没有做错任何事!

坏消息是您观察到的结果完全符合预期。这是链接不同工具 ( Surefire --> JUnit --> Cucumber ) 的自然结果,否则这些工具彼此不知道。从 Cucumber 的角度来看,重新运行似乎是一个全新的执行,因此它会很高兴地覆盖旧报告。只有在链的开始,才有可能创建准确的报告。

因此,您的选择从最少到最多,从最差到最好的质量是:

  • 使用 Surefire 生成的报告。
  • 编写您自己的插件来附加结果而不是覆盖它们。
  • 参与 Cucumber 项目并帮助从根本上解决这个问题。

  • 编辑:删除了使用 cucumber-jvm-parallel-plugin 为每个场景创建单独单元测试的建议。这实际上行不通。

    关于java - Cucumber.json 报告被重新运行场景报告覆盖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50115819/

    10-17 00:39