Junit5的TestReporter是线程安全的吗?
Is Junit5's TestReporter thread-safe?
下面的代码是否可以让两个线程最终同时修改 TestReporter 实例?
@Test
public void someTest(TestReporter testReporter) {
// do some stuff
CompletableFuture.allOf(
CompletableFuture.runAsync(() -> {
// do task A
testReporter.publishEntry("taskA", "valueA");
}),
CompletableFuture.runAsync(() -> {
// do task B
testReporter.publishEntry("taskB", "valueB");
})
).join();
}
TLDR:是
正确答案当然是:视情况而定。
JUnit 5 被设计为允许并行测试执行。
报告测试结果(以及发布报告条目)的整个机制是通过事件传播完成的,既不共享可变状态,也不同步底层 ReportEntry
的事件或实例。
鉴于没有棘手的错误 testReporter.publishEntry(..)
因此应该是线程安全的。
这里是 "BUT":JUnit 5 平台允许第 3 方挂钩事件监听,例如在测试开始、测试结束或测试发布一些额外数据时生成自己的报告或做其他事情。那些第 3 方 TestExecutionListener
实现可以做他们想做的事,并且它们可能 不是 是线程安全的。
下面的代码是否可以让两个线程最终同时修改 TestReporter 实例?
@Test
public void someTest(TestReporter testReporter) {
// do some stuff
CompletableFuture.allOf(
CompletableFuture.runAsync(() -> {
// do task A
testReporter.publishEntry("taskA", "valueA");
}),
CompletableFuture.runAsync(() -> {
// do task B
testReporter.publishEntry("taskB", "valueB");
})
).join();
}
TLDR:是
正确答案当然是:视情况而定。
JUnit 5 被设计为允许并行测试执行。
报告测试结果(以及发布报告条目)的整个机制是通过事件传播完成的,既不共享可变状态,也不同步底层 ReportEntry
的事件或实例。
鉴于没有棘手的错误 testReporter.publishEntry(..)
因此应该是线程安全的。
这里是 "BUT":JUnit 5 平台允许第 3 方挂钩事件监听,例如在测试开始、测试结束或测试发布一些额外数据时生成自己的报告或做其他事情。那些第 3 方 TestExecutionListener
实现可以做他们想做的事,并且它们可能 不是 是线程安全的。