问题描述
在使用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. 在该类中,根据需要实现testStarted
、testFailed
和testFinished
等方法,以输出与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