1

我正在使用 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

4 回答 4

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() {
    …
}

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

于 2014-09-18T21:11:25.033 回答
0

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

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

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

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

因此,如果编译器尝试执行“testUpdate”测试,则会在执行中添加一个限制。testUpdate 函数取决于“testAdd”函数。所以编译器将首先执行“testAdd”,然后继续执行“testUpdate”函数。

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

于 2014-06-22T12:59:38.383 回答
0

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

请参阅如何在 JUnit4 中按特定顺序运行测试方法?

于 2014-09-24T14:50:21.740 回答
0

首先,让测试相互依赖通常是不好的做法,但我意识到这是一个最纯粹的观点,如果达到那种状态真的很慢以至于你必须继续下去,那么我会说你应该看看在我个人在这篇文章中提供的答案中,我会选择第二个选项,因为注释使它变得很好和明确。

于 2014-06-20T21:57:09.470 回答