首页 > 解决方案 > 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();
    }

标签: javamultithreadingunit-testingjunit5

解决方案


TLDR:是的

正确答案当然是:视情况而定。

JUnit 5 旨在允许并行测试执行。报告测试结果(以及发布报告条目)的整个机制是通过事件传播完成的,既不共享可变状态,也不同步底层的事件或实例ReportEntry。鉴于没有棘手的错误testReporter.publishEntry(..),因此应该是线程安全的。

这里是“BUT”:JUnit 5 平台允许第 3 方挂钩事件监听,例如在测试开始、测试结束或测试发布一些附加数据时生成他们自己的报告或做其他事情。那些 3rd 方TestExecutionListener实现可以做他们想做的事,而且它们可能不是线程安全的。


推荐阅读