java - Junit5 的 TestReporter 线程安全吗?
问题描述
下面的代码在两个线程可能最终同时修改 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 方挂钩事件监听,例如在测试开始、测试结束或测试发布一些附加数据时生成他们自己的报告或做其他事情。那些 3rd 方TestExecutionListener
实现可以做他们想做的事,而且它们可能不是线程安全的。
推荐阅读
- javascript - 关于`new`关键字的Javascript原型问题
- python - 使用 bluepy 委托启用指示
- user-experience - 在 Godot 游戏引擎中切换到另一个场景时的幻灯片动画
- javascript - 无法使用 MySql 用 JQuery 动态替换图像 src
- java - 拉普拉斯滤波器产生奇怪的结果(Java)
- javascript - 将 div 从父网站复制到 iframe 中的文本区域
- node.js - Node-Red:将数据传递到 exec 的标准输入,而不是重新运行
- java - 如何使用流检查多个集合的字符串
- xamarin - 如果行定义中的所有行大小相等,我是否需要在 * 前面指定一个数字?
- haskell - Haskell - 生成长度为 k 的子集