如何在JUnit5中定义优先级

Faa*_*ass 1 java junit junit5

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

然后剩下的...

我检查过,有一个使用@Order()注释的选项,但我的想法不是像这样订购每个测试......我只想先运行登录,然后运行我需要运行所有其他测试的测试。因此,在前两个测试之后,其他测试的顺序并不重要。

Sla*_*law 5

首先,单元测试依赖于其他单元测试通常是糟糕的设计。JUnit 5 用户指南提到了这一点:

\n\n
\n

虽然真正的单元测试通常不应该依赖于它们的执行顺序,但有时有必要强制执行特定的测试方法执行顺序\xe2\x80\x89\xe2\x80\x94\xe2\x80\x89for例如,在编写集成测试功能测试时,测试的顺序很重要,尤其是与@TestInstance(Lifecycle.PER_CLASS).

\n
\n\n

考虑一下您正在做的是测试还是设置。如果登录操作只是为您的测试设置的,那么您应该在用@BeforeAll或注释的方法中执行此操作@BeforeEach,以在您的上下文中更有意义的为准。@AfterAll之后,您可能需要使用或进行清理@AfterEach,具体取决于您使用的“注释之前”。

\n\n

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

\n\n

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

\n\n
\n\n

也就是说,你想要的应该是可能的。您提到@Order但随后又说您对使用它犹豫不决,因为您不想订购每个方法,只需确保两个测试在所有其他测试之前运行。您不必向每个方法添加注释。如果您查看 的文档MethodOrderer.OrderAnnotation,您将看到:

\n\n
\n

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

\n\n

任何分配有相同顺序值的方法都将被任意相邻地排序。

\n\n

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

\n
\n\n

并来自Order.value()

\n\n
\n

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

\n
\n\n

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

\n\n
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)\nclass MyTests {\n\n    @Test\n    @Order(1)\n    void firstTest() {}\n\n    @Test\n    @Order(2)\n    void secondTest() {}\n\n    @Test\n    void testFoo() {}\n\n    @Test\n    void testBar() {}\n\n    // other tests...\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n