TeamCity如何实时查看使用Maven、JUnit 4和Surefire的测试结果

77次阅读
没有评论

问题描述

在使用TeamCity时遇到了一个问题:在使用Maven、JUnit 4和Surefire进行构建时,Tests选项卡只在构建完成后才会显示测试结果。如果构建崩溃,即使在崩溃之前已经完成了一些测试,Tests选项卡也不会显示任何内容。原因是Surefire向TeamCity报告的信息如下:

##teamcity[importData tc:tags='tc:internal' type='surefire' path='.../target/surefire-reports/TEST-*.xml' whenNoDataPublished='nothing' logAsInternal='true']

因此,TeamCity无法在测试套件完成和XML文件写入之前知道测试的状态。

现在,TeamCity支持实时测试报告,可以通过以下消息进行报告:

##teamcity[testStarted name='MyTest.test1']##teamcity[testFailed name='MyTest.test1' message='failure message' details='message and stack trace']##teamcity[testFinished name='MyTest.test1']

然而,Surefire(负责在Maven中运行JUnit测试的框架)默认不输出这些消息。

用户希望能够实时查看测试结果,有以下三种选择:
1. 为JUnit/Surefire配置一个RunListener,以输出这些消息给TeamCity。但这样做可能会导致重复造轮子的问题,并且无法保证输出的消息与XML文件中的测试结果完全一致。
2. 修改测试代码,使其输出这些消息。虽然这样做很容易,因为用户的测试代码有一个共同的超类,但仍然存在重复造轮子的问题,并且可能与XML文件中的测试结果不一致。
3. 找到一种方法,要么配置Surefire输出这些消息,要么让TeamCity与Surefire通信以启用输出。用户意识到Surefire并不是一个完美的解决方案,但这个功能非常受欢迎,他希望能找到一些解决方案。

请帮助用户在这些选项之间做出选择。

解决方案

请注意以下操作注意版本差异及修改前做好备份。
用户可以选择以下解决方案之一来实现实时查看测试结果:

方案1:实现自己的RunListener

用户可以实现自己的RunListener,并将其作为编译和测试依赖添加到所有其他模块中,并在Maven Surefire插件配置中进行配置。这样就可以输出与TeamCity期望的消息格式相匹配的消息。

以下是实现自己的RunListener的步骤:
1. 创建一个Java类,实现JUnit的RunListener接口。
2. 在该类中,根据需要实现testStartedtestFailedtestFinished等方法,以输出与TeamCity期望的消息格式相匹配的消息。
3. 在Maven项目的pom.xml文件中,将该类作为编译和测试依赖添加到所有其他模块中。
4. 在Maven Surefire插件配置中,将该类配置为RunListener。

以下是一个示例的pom.xml文件配置:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M5</version>
      <configuration>
        <properties>
          <property>
            <name>listener</name>
            <value>com.example.MyRunListener</value>
          </property>
        </properties>
      </configuration>
    </plugin>
  </plugins>
</build>

在上面的示例中,我们将com.example.MyRunListener配置为Maven Surefire插件的监听器。

方案2:修改测试代码

用户可以修改测试代码,使其输出与TeamCity期望的消息格式相匹配的消息。由于用户的测试代码有一个共同的超类,因此这样做很容易。

以下是修改测试代码的步骤:
1. 打开测试代码的共同超类。
2. 在该类中,根据需要添加代码,以输出与TeamCity期望的消息格式相匹配的消息。

方案3:配置Surefire或与Surefire通信

用户可以尝试配置Surefire输出与TeamCity期望的消息格式相匹配的消息,或者让TeamCity与Surefire通信以启用输出。但需要注意,Surefire并不是一个完美的解决方案,可能需要一些额外的配置或插件来实现这个功能。

具体的配置或通信方式取决于Surefire和TeamCity的版本和集成方式。用户可以参考Surefire和TeamCity的官方文档,或者在相关的社区论坛或问答网站上寻求帮助。

请注意,无论用户选择哪种解决方案,都需要在实施之前进行充分的测试,以确保输出的消息与XML文件中的测试结果一致,并且不会导致任何问题或冲突。

以上是三种实现实时查看测试结果的解决方案,请根据用户的具体需求和项目情况选择合适的方案。

参考链接:
Stack Overflow: Surefire only reports first test suite from module to RunListener

正文完