我们使用 maven-failsafe-plugin 与
<forkCount>
同时运行集成测试,因此我们将在不同进程中拥有多个 JVM 并行运行测试。
故障安全插件记录了所有测试的输出,但是不同分支的行混合在一起,很难理解发生了什么。
有没有一种方法可以将 Surefire 插件的日志输出写入文件(每个分叉进程一个文件),而不是将其打印到标准输出?感觉很奇怪,这不是一个常见问题。
被测应用程序是Spring Boot应用程序。
我知道我可以将每个测试的输出写入一个文件,并且它可以在
target/failsafe-reports/<SomeTest>.xml
中使用。这已经很好了,但是我们最近遇到了一个测试的数据泄露到另一个测试的情况,在这种情况下,每个分支都有一个日志文件会非常有帮助,这样人们就可以看到测试执行的顺序。
我考虑用 logback 替换 mvn 的 Slf4j SimpleLogger,因为使用 logback 应该是可能的,但据我所知,如果不修改 mvn 安装本身,这是不可能的,但我想仅将更改保留在本地项目。
我可以在被测试的应用程序内配置 logback 以记录到这些文件,但是这样我会丢失故障安全插件中的这些行,这些行也包含有价值的信息,并且对于了解实际发生的情况是必要的:
[INFO] Running <SomeTest>
,
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.856 s -- in <SomeTest>
最终我放弃了maven日志记录。相反,我在应用程序端解决了它:
我在
logback-test.xml
中创建了一个 src/test/resources/
配置文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<property name="LOG_FILE" value="target/failsafe-reports/logs/integration-tests-${PID:-0}.log"/>
<root level="${logback.level:-info}">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
它将为每个进程 ID 创建一个日志文件。
然后我还添加了一个 Spring bean,其方法用
@BeforeTestMethod
和 @AfterTestMethod
注释,对相应事件做出反应,以在测试开始和结束时添加到日志输出中。