- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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 ofInteger.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/
我是一名优秀的程序员,十分优秀!