下面的代码是否很好,其中两个线程可能同时修改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();
}发布于 2020-06-19 10:20:33
TLDR:是
正确的答案当然是:视情况而定。
JUnit 5被设计为允许并行测试执行。报告测试结果的整个机制(以及发布报告条目)都是通过事件传播完成的,既不共享可变状态,也不对底层ReportEntry的事件或实例进行同步。由于没有棘手的bug,因此testReporter.publishEntry(..)应该是线程安全的。
下面是“但是”:JUnit 5平台允许第三方连接到事件侦听中,例如在测试开始、测试结束或测试发布额外数据时生成自己的报告或做其他事情。那些第三方TestExecutionListener实现可以做他们想做的事情,而且他们可能而不是是线程安全的。
https://stackoverflow.com/questions/62453916
复制相似问题