maven surefire:我们什么时候被迫设置reuseForks = false?

时间:2016-01-08 19:19:59

标签: java maven testng junit4 maven-surefire-plugin

在我设置 reuseForks = true 的项目中,我必须将forkCount增加到测试类的数量。否则,它会抛出非法的例外。 此外,如果我设置 reuseForks = false ,那么它也可以正常工作。

目前我有以下配置,因为测试类的数量少于10个。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <reuseForks>true</reuseForks>
                <forkCount>10</forkCount>
            </configuration>
        </plugin>

如何保持 reuseFork = true forkCount = 1

编辑:在reuseFork = true和forkCount = 1

上的StackTrace
    checkForReturnEventsPresent on checkForReturnEventsPresent(com.eras.senders.OMSReturnEventDataSenderTest)(com.eras.senders.OMSReturnEventDataSenderTest)  Time elapsed: 0.014 sec  <<< FAILURE!
java.lang.IllegalArgumentException: null
    at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:115)
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeMulti(TestNGDirectoryTestSuite.java:212)
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:108)
    at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:111)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)

1 个答案:

答案 0 :(得分:3)

  

在我的项目中,当我设置reuseForks = true时,我必须将forkCount增加到测试类的数量。否则,它会抛出非法的例外。

从堆栈跟踪中,代码中出现的某些内容导致抛出异常,但仅在重用forks时才会抛出异常。这意味着不同的测试在某种程度上不会彼此隔离,因此在同一测试过程中一个接一个地运行违反了一些假设。例如,也许一个测试初始化​​一些全局状态,如单例,然后该全局状态对于该过程中的下一次测试运行不正确。

  

此外,如果我设置reuseForks = false,那么它也可以正常工作。

通过将reuseForks设置为false,可以绕过与此类变更全局状态相关的任何问题。在测试运行结束时,该过程将被拆除,并且下一次测试运行将启动具有新状态的新进程。

此时,前进的路径高度依赖于代码库的细节以及如何实现其测试。我看到两个选项:

  1. 调试你的测试,寻找像我所描述的全局状态问题。在此异常之前附加断点可能会给您一个强烈的提示。
  2. 如果您已经知道代码库依赖于某种全局状态,并且快速更改该代码是不可行的,那么只需将reuseForks设置为false即可。在许多情况下,额外的进程拆卸和启动不会对整个测试运行产生明显的性能影响。