我正在使用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>
答案 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将比调整所有你的方法更容易目前的测试在不同的框架恕我直言。