【问题标题】:Can i run Junit dynamic tests produced by @TestFactory concurrently?我可以同时运行 @TestFactory 生成的 Junit 动态测试吗?
【发布时间】:2019-04-17 14:54:15
【问题描述】:

我正在使用 Junit 的 Discovering Tests 功能,并且我还有一个类,它引入了一些 @TestFactory 方法,每个方法都会产生大量的动态测试。我的第一个想法是“能够同时运行这些会很棒。”,所以我添加了

.configurationParameter(
               "junit.jupiter.execution.parallel.enabled", "true"
           )

致我的LauncherDiscoveryRequestBuilder,我用@Execution(ExecutionMode.CONCURRENT) 注释了我持有工厂的测试类。到目前为止一切都很好,但我最终每个@TestFactory 方法都在不同的线程上运行,但是由单个@TestFactory 生成的所有动态测试共享同一个线程(产生这些测试的@TestFactory 线程在其上运行)。

我的问题是 - 我可以并行运行 @TestFactory 生成的动态测试吗?这个也试过了

@TestFactory
@Execution(ExecutionMode.CONCURRENT)

但结果是一样的。

【问题讨论】:

    标签: java junit5


    【解决方案1】:

    是的,您可以同时执行动态测试。

    这是来自 JUnit 5 用户指南的 dynamicNodeSingleContainer() 测试工厂的修改版本

    @TestFactory
    @Execution(ExecutionMode.CONCURRENT)
    DynamicNode dynamicNodeSingleContainer() {
        return dynamicContainer("palindromes",
            Stream.of("racecar", "radar", "mom", "dad")
                .map(text -> dynamicTest(text, () -> {
                    assertTrue(isPalindrome(text));
                    System.err.println(Thread.currentThread().getName());
                })
        ));
    }
    

    当我执行它时,我看到以下输出表明 4 个动态测试在不同的线程中同时执行。

    ForkJoinPool-1-worker-5
    ForkJoinPool-1-worker-11
    ForkJoinPool-1-worker-7
    ForkJoinPool-1-worker-9
    

    【讨论】:

    • 看来问题出在我工厂的内容上,因为我尝试了您的示例并且它按预期工作。不同的工人正在选择不同的动态测试。在我的情况下,工人总是一样的。
    • 我发现了问题,它在我的实现中。 Junit 完全能够并行运行动态测试。很抱歉浪费了您的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2014-09-23
    相关资源
    最近更新 更多