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

Dav*_*ave 1 junit integration-testing maven 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() {
        …
    }
Run Code Online (Sandbox Code Playgroud)

目前,当我作为“ mvn全新安装”运行的一部分通过Maven运行测试时,在“ testAdd”或“ testUpdate”之前先运行“ testDelete”。如果我将名称更改为“ 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>
Run Code Online (Sandbox Code Playgroud)

Mat*_*ell 6

简短的回答:不,除了重命名测试之外,别无他物,以便它们按顺序执行。您可以使用@FixMethodOrder(NAME_ASCENDING)注释,以确保测试按字母顺序执行。

长答案:我确定您知道,surefire / failsafe提供了通过runOrder配置参数对测试进行排序的选项。这控制了每个测试类的执行顺序。因此,您可以在foobar.Test2之前运行类foobar.Test1,反之亦然。

对于类中方法的执行顺序,您面临的问题是JVM不会以文件中声明的顺序返回方法列表。在Java 6中,返回它们的顺序通常是声明的顺序,但是在Java 7中却有所改变。因此,随着JUnit 4.11的发布,默认顺序已更改为基于方法名称的哈希,给出确定性但不可预测的排序。这就是为什么要先运行testDelete的原因。

经过长时间的讨论,我们在FixMethodOrderJUnit 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() {
    …
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见JUnit4是否开始支持测试顺序?这是故意的吗?