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

472

我希望按特定顺序执行被标记为 @Test 的测试方法。

例如:

public class MyTest {
    @Test public void test1(){}
    @Test public void test2(){}
}

我希望每次运行MyTest时,都能确保在运行test2()之前先运行test1(),但我找不到类似于@Test(order=xx)的注解。

我认为这是JUnit的一个重要功能,如果JUnit的作者不想要有序功能,那么为什么呢?


103
不应编写需要按特定顺序执行的测试,这是非常不好的实践。每个测试都应该能够独立运行。 - Apfelsaft
6
在Java 7之前,几乎所有的Java虚拟机都会按照一定顺序返回方法。但是并没有得到保证。而Java 7及以后的版本的虚拟机则可以以非确定性的顺序返回方法。 - Matthew Farwell
19
绕过问题。从测试用例中删除@Test,将它们转换为私有函数,然后创建一个单一的测试用例,并按顺序调用私有函数。 - Simon Guo
17
如果从测试用例中移除@Test注解,将会影响JUnit报告。顺便提一句,强制执行特定的顺序是单元测试的坏习惯,但不一定是集成测试的坏习惯。最好的选择(虽然不完美)是使用@FixMethodOrder(MethodSorters.NAME_ASCENDING)为类进行注释,并保留所有测试方法的@Test注解,并根据期望的执行顺序按字母顺序重命名它们,例如t1_firstTest()t2_secondTest()等。 - MisterStrickland
9
谈论单元测试需要独立的问题很容易,但按特定顺序运行测试仍有非常好的理由。在我的情况下,我为每个可能的输入参数值运行三个独立的测试。对于每个可能的值,我想比较这三个测试,如果它们在输出中被分组在一起,这样做会更容易。这还有助于我识别测试失败中的模式。因此,感谢那些实际回答了问题的人。 - MiguelMunoz
显示剩余9条评论
23个回答

0

我已经阅读了一些答案并同意这不是最佳实践,但是按字母顺序升序排序测试的最简单方法 - 也是JUnit默认运行测试的方式。

所以只需按您想要的字母顺序命名测试即可。还请注意,测试名称必须以单词“test”开头。只需注意数字即可

test12将在test2之前运行

所以:

testA_MyFirstTest testC_ThirdTest testB_ATestThatRunsSecond


0
我最初认为我的测试没有按顺序运行,但事实上混乱出现在我的异步作业中。当使用并发时,您还需要在测试之间执行并发检查。
在我的情况下,作业和测试共享一个信号量,因此下一个测试会挂起,直到正在运行的作业释放锁定。
我知道这与本问题不完全相关,但也许可以帮助找到正确的问题。

0

如果你想在JUnit 5中按特定顺序运行测试方法,可以使用以下代码。

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class MyClassTest { 

    @Test
    @Order(1)
    public void test1() {}

    @Test
    @Order(2)
    public void test2() {}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接