4

我有一个 Ant 构建文件,它使用batchtestjunit 来测试所有的测试类。

假设我有一堂课

class MyTest{
    @BeforeClass
    public static void setUpBeforeClass(){
       //some stuff
    }

    @Test
    public void test1(){
    }

    @Test
    public void test2(){
    }
}

我知道 JUnit 会MyTest为每个测试方法创建一个新的类实例,但我想要的是应该为每个测试方法创建一个新的 VM。我希望每个测试方法都在一个单独的 VM 中运行,并希望类加载器MyTest为每个测试方法再次加载。那可能吗?

我试图阅读文档并尝试了这个解决方案:

<junit fork="yes" reloading="true" forkmode="perTest">
    <batchtest>
    </batchtest>
</junit>

但即使在为我的每个测试方法使用这些选项之后,该setUpBeforeClass方法也只被调用一次。难道我做错了什么?

编辑:

我为什么要这样做?

我的测试方法正在使用一些使用static东西的合作者,我希望static在每种方法上都清除这些东西。实际上,我面临一个问题,即测试在本地环境中通过而在生产中失败

4

1 回答 1

0

我可以看到工作的唯一可能方法是拥有多个<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 会使测试套件的运行速度变得非常慢!

于 2014-01-16T13:44:42.407 回答