我可以看到工作的唯一可能方法是拥有多个<test>
元素实例。
问题在于您必须为每个<test>
元素指定要运行的方法。我创建了一个测试类,其中包含一个静态初始化程序和两个测试。通过以下<junit>
任务,我能够做你想做的事:
<junit fork="yes">
<classpath>
<path refid="classpath" />
</classpath>
<formatter type="xml"/>
<test name="TestSimple" methods="testOne" toDir="firstRun" />
<test name="TestSimple" methods="testTwo" toDir="secondRun" />
</junit>
根据我从构建日志中得到的信息,很明显它们运行在两个不同的 JVM 中:
test:
...
[junit] Executing 'C:\Program Files\Java\jdk1.7.0_25\jre\bin\java.exe' with arguments:
[junit] '-classpath'
...
[junit] 'org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner'
[junit] 'TestSimple'
[junit] 'methods=testOne'
...
[junit] Executing 'C:\Program Files\Java\jdk1.7.0_25\jre\bin\java.exe' with arguments:
[junit] '-classpath'
...
[junit] 'org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner'
[junit] 'TestSimple'
[junit] 'methods=testTwo'
...
[junit] Test TestSimple FAILED
我还看到了System.out
我在每个测试报告中放入静态初始化程序的语句。
这里的重要细节是,您必须使用 属性 使每个<test>
标签将其报告重定向到不同的目录,toDir
或者使用 属性 更改输出文件的名称outfile
。这是因为报告文件名使用了类的名称,而不是您正在运行的方法。这意味着第二次运行将覆盖第一次运行的报告。
在您的特定情况下,您可以<batchtest>
对所有可以在同一 JVM 中运行而不会出现问题的测试使用 a 并添加<exclude>
标签以避免运行有问题的测试。<test>
然后为每个有问题的测试添加一个特定的标签。
他们这样做是因为该methods
属性专门设计用于重新运行特定方法或单独运行太慢的测试。从文档中:
方法属性在以下场景中很有用:
- 测试方法失败,您想重新运行测试方法以测试修复或在 Java 调试器下重新运行测试,而无需等待其他(可能长时间运行的)测试方法完成。
- 一种或多种测试方法的运行速度比预期的要慢,您希望在 Java 分析器下重新运行它们(在执行其他测试方法时没有运行分析器的开销)。
但是就个人而言,并且来自与您之前遇到相同问题的人,静态初始化程序很糟糕!我会非常努力地尽快摆脱它们。引用@PeterNiederwieser 的话,每组测试都有一个新的 JVM 会使测试套件的运行速度变得非常慢!