gpt4 book ai didi

java - 如何在JUnit5中定义优先级

转载 作者:行者123 更新时间:2023-12-01 19:38:16 25 4
gpt4 key购买 nike

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

然后剩下的...

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

最佳答案

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

Although true unit tests typically should not rely on the order in which they are executed, there are times when it is necessary to enforce a specific test method execution order — for example, when writing integration tests or functional tests where the sequence of the tests is important, especially in conjunction with @TestInstance(Lifecycle.PER_CLASS).

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

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

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

<小时/>

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

MethodOrderer that sorts methods based on the @Order annotation.

Any methods that are assigned the same order value will be sorted arbitrarily adjacent to each other.

Any methods not annotated with @Order will be assigned a default order value of Integer.MAX_VALUE which will effectively cause them to appear at the end of the sorted list.

来自 Order.value() :

Elements are ordered based on priority where a lower value has greater priority than a higher value. For example, Integer.MAX_VALUE has the lowest priority.

这意味着您只需要使用 @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...

}

关于java - 如何在JUnit5中定义优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56602883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com