如何在JUnit5中定义优先级

时间:2019-06-14 17:37:34

标签: java junit junit5

我在Java项目中使用Junit构建了一些单元测试。 唯一的问题是我想定义测试的顺序/优先级。 我的意思是...我正在使用@BeforeAll执行第一个测试,这是登录过程并获得对postlogin功能的访问权限。 但是在那之后,我想运行另一个特定的测试。

然后剩下的...

我检查了一下,可以选择使用@Order()批注,但是我的想法不是要像这样订购每个测试...我只想先运行登录名,然后再运行一个我需要进行的测试运行所有其他。因此,经过前两次测试后,其他顺序无关紧要。

1 个答案:

答案 0 :(得分:3)

首先,使单元测试依赖于其他单元测试通常是不好的设计。 JUnit 5 User Guide提到了这一点:

  

尽管真正的单元测试通常不应依赖于它们执行的顺序,但有时还是有必要强制执行特定的测试方法执行顺序。例如,例如,编写集成测试功能测试,其中测试的顺序很重要,尤其是与@TestInstance(Lifecycle.PER_CLASS)结合使用。

考虑您正在做的是测试还是设置。如果登录操作只是针对您的测试设置的,则应使用带有@BeforeAll@BeforeEach注释的方法来执行此操作,以您认为更合适的方式进行。之后,您可能需要使用@AfterAll@AfterEach进行清理,具体取决于您使用的“注释前”。

如果您实际上是在尝试对登录代码进行测试,请尝试将这些测试与其他测试分开。您可以通过将它们移动到单独的类文件中,或者甚至利用@Nested类(如果适用)来实现此目的。而不是让以后的测试要求 real 登录,您应该使用 fake 登录。换句话说,模拟以后测试所需的依赖关系。这将消除测试间依赖的情况。并且不要害怕为每个测试重新“登录”(例如,使用@BeforeEach);如果您使用的是模拟程序,那么它应该不会太昂贵。

注意:从JUnit 5.4开始,如果先前的测试使用TestWatcher扩展名失败,您甚至可以中止某些测试,如this Q&A中所述。但是,使用这种方法似乎更适合集成测试,而不是单元测试


也就是说,您想要的应该是可能的。您提到@Order,但随后又说您犹豫使用它,因为您不想订购每种方法,只需确保先运行两个测试即可。您不必将注释添加到每个方法。如果您查看MethodOrderer.OrderAnnotation的文档,则会看到:

  

MethodOrderer,用于根据@Order注释对方法进行排序。

     

任何分配了相同顺序值的方法都将彼此相邻地任意排序。

     

任何未用@Order注释的方法都将被分配默认顺序值Integer.MAX_VALUE,这将有效地使它们出现在排序列表的末尾。

并且来自Order.value()

  

元素根据优先级排序,其中较低的值具有比较高的值更高的优先级。例如,Integer.MAX_VALUE的优先级最低。

这意味着您只需要用@Order注释两个测试,其余的就不用管了。所有没有@Order批注的测试方法都可以按任何顺序运行,但是在前两个测试之后。

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class MyTests {

    @Test
    @Order(1)
    void firstTest() {}

    @Test
    @Order(2)
    void secondTest() {}

    @Test
    void testFoo() {}

    @Test
    void testBar() {}

    // other tests...

}