我在Java项目中使用Junit构建了一些单元测试。
唯一的问题是我想定义测试的顺序/优先级。
我的意思是...我正在使用@BeforeAll
执行第一个测试,这是登录过程并获得对postlogin功能的访问权限。
但是在那之后,我想运行另一个特定的测试。
然后剩下的...
我检查了一下,可以选择使用@Order()
批注,但是我的想法不是要像这样订购每个测试...我只想先运行登录名,然后再运行一个我需要进行的测试运行所有其他。因此,经过前两次测试后,其他顺序无关紧要。
答案 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...
}