如何在单个集成测试文件中控制测试执行的顺序?

时间:2014-06-20 19:39:58

标签: maven junit integration-testing maven-failsafe-plugin

我正在使用Maven 3.0.3,Failsafe插件v2.17和JUnit 4.11。目前,我按以下顺序进行了测试集成测试

@RunWith(SpringJUnit4ClassRunner.class)
public class MyTests {

    @Test
    public final void testAdd() {
        …
    }

    @Test
    public final void testUpdate() {
        …
    }

    @Test
    public final void testDelete() {
        …
    }

目前,当我通过Maven运行测试作为“mvn clean install”运行的一部分时,“testDelete”将在“testAdd”或“testUpdate”之前运行。如果我将名称更改为“testZZZDelete”,那么它最后会运行,但我不喜欢它。

如何让测试按照我在文件中指定的顺序运行?我的故障安全配置是这样的:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.17</version>
        <configuration>
                <reuseForks>true</reuseForks>
                <argLine>-Xmx4096m -XX:MaxPermSize=512M ${itCoverageAgent}</argLine>
        </configuration>
        <executions>
                <execution>
                        <goals>
                                <goal>integration-test</goal>
                                <goal>verify</goal>
                        </goals>
                </execution>
        </executions>
</plugin>

4 个答案:

答案 0 :(得分:6)

简短的回答:不,除了重命名测试以便按顺序执行之外,无论如何都没有。您可以使用@FixMethodOrder(NAME_ASCENDING)注释来确保按字母顺序执行 测试。

答案很长:我确定您知道,surefire / failsafe允许您通过runOrder配置参数订购测试。它控制每个测试类的执行顺序。所以你可以在foobar.Test2之前运行类foobar.Test1或者反过来。

对于类中方法的执行顺序,您面临的问题是JVM不会按照与文件中声明的顺序相同的顺序返回方法列表。对于Java 6,返回它们的顺序通常是声明的顺序,但是这已经改变了java 7.因此,随着JUnit 4.11的发布,默认顺序被更改为基于方法名称的哈希,给出确定性但不可预测的排序。这就是为什么你要在其他任何东西之前运行testDelete。

After a long discussion,我们将FixMethodOrder注释添加到JUnit 4.11,以允许某人至少能够重命名他们的方法。这似乎适用于SpringJUnit4ClassRunner - 至少使用最新版本4.1.0.RELEASE。我没有尝试过其他版本。

因此,为了获得可预测的排序,您可以在必要时重命名要按所需顺序执行的方法,并将@FixMethodOrder注释添加到类中。

@RunWith(SpringJUnit4ClassRunner.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MyTests {

@Test
public final void step1Add() {
    …
}

@Test
public final void step2Update() {
    …
}

@Test
public final void step3Delete() {
    …
}

有关详细信息,请参阅Has JUnit4 begun supporting ordering of test? Is it intentional?

答案 1 :(得分:0)

首先,让测试依赖彼此通常是不好的做法,但我意识到这是一个最纯粹的观点,如果到达那个状态真的很慢,你必须继续,那么我会说你应该看看这个post个人提供的答案,我会选择第二个选项作为注释,使其变得美观和明确。

答案 2 :(得分:0)

我认为TestNg提供了一个以用户定义的顺序执行测试的选项。

@Test(dependsOnMethods='testAdd')
public final void testAdd() {
    …
}

@Test(dependsOnMethods='testAdd')
public final void testUpdate() {
    …
}

@Test(dependsOnMethods='testUpdate')
public final void testDelete() {
    …
} 

因此,如果编译器试图执行&#34; testUpdate&#34;测试,执行中添加了限制。 testUpdate函数取决于&#34; testAdd&#34;功能。因此编译器将首先执行&#34; testAdd&#34;然后继续执行&#34; testUpdate&#34;功能。

希望测试应该从JUNIT迁移到TestNg。

答案 3 :(得分:0)

这个JUnit补丁实现了这个功能https://github.com/adko-pl/junit/commit/4421261dbdcaed8ff0a82f4d5229ac8ad6c97543,认为似乎作者没有将命令参数添加到org.junit.Test注释中,使用修补的JUnit将比调整所有你的方法更容易目前的测试在不同的框架恕我直言。

请参阅How to run test methods in specific order in JUnit4?