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

Viv*_*wal 5 java testng junit4 maven maven-surefire-plugin

在我的项目中,当我设置重用 Forks=true 时,我必须将 forkCount 增加到测试类的数量。否则,它会抛出非法参数异常。另外,如果我设置了重用Forks=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>
Run Code Online (Sandbox Code Playgroud)

我怎样才能保持重用Fork=trueforkCount=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)
Run Code Online (Sandbox Code Playgroud)

Chr*_*oth 7

在我的项目中,当我设置重用 Forks=true 时,我必须将 forkCount 增加到测试类的数量。否则,它会抛出非法参数异常。

从堆栈跟踪来看,您的代码中似乎有一些东西导致抛出异常,但只有在重用 fork 时才会抛出异常。这意味着不同的测试在某种程度上并不是彼此隔离的,因此在同一测试过程中一个接一个地运行违反了一些假设。例如,也许一个测试会像单例一样初始化一些全局状态,然后该全局状态对于该过程中的下一次测试运行来说是不正确的。

另外,如果我设置了重用Forks=false,那么它也能正常工作。

通过设置reuseForksfalse,任何与像这样改变全局状态相关的问题都会被绕过。该进程在测试运行结束时被拆除,并为下一次测试运行启动一个具有新状态的新进程。

在这一点上,前进的道路高度依赖于你的代码库的细节以及它的测试是如何实现的。我看到两个选项:

  1. 调试您的测试以查找我描述的全局状态问题。在此异常之前附加断点可能会给您一个强烈的提示。
  2. 如果您已经知道代码库依赖于某些全局状态,并且快速更改该代码是不可行的,那么只需坚持使用reuseForksset to false。在许多情况下,额外的进程拆卸和启动不会对您的整体测试运行造成明显的性能影响。