gpt4 book ai didi

java - JUnit5:指定多个@Nested 类的执行顺序

转载 作者:行者123 更新时间:2023-12-03 19:24:51 28 4
gpt4 key购买 nike

Junit5 是否对 @Nested 的执行顺序做出任何保证?在同一个父级中定义的类?通过我制作的一个简单示例,我注意到测试是按照与声明相反的顺序执行的,但是这种行为既没有记录在案(或者是吗?),也没有与 @Test 的方式一致。带注释的方法默认是有序的。

这也很烦人,因为显然我宁愿有一个非反向顺序,如果不是一种类似于 @TestMethodOrder 的配置方式的话。 .

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

class NestedOrderTest {
@Nested
class NestedTest1 {
@Test
void testSuccess1() {
System.out.println(1);
}
}

@Nested
class NestedTest2 {
@Test
void testSuccess2() {
System.out.println(2);
}
}

@Nested
class NestedTest3 {
@Test
void testSuccess3() {
System.out.println(3);
}
}
}

输出:
3
2
1

最佳答案

默认情况下,单元测试库不会尝试按照源文件中出现的顺序执行测试。
JUnit 5 作为 JUnit 4 以这种方式工作。为什么 ?因为如果顺序很重要就意味着它们之间有一些测试是耦合的,那就是 不适合单元测试 (重点是我的):

2.9. Test Execution Order

By default, test methods will be ordered using an algorithm that isdeterministic but intentionally nonobvious. This ensures thatsubsequent runs of a test suite execute test methods in the sameorder, thereby allowing for repeatable builds.


所以预计 @Nested JUnit 5 引入的特性遵循相同的默认方法。
但是对于集成测试,测试方法的顺序可能很重要 因为在执行的测试方法之间不一定清除状态。
因此,在 JUnit 5 中,您可以通过使用 @TestMethodOrder(OrderAnnotation.class) 注释测试类来设置执行顺序。并通过 @Order(numericOrderValue) 指定订单对于顺序重要的方法。
但是 @Order旨在装饰要测试的方法,而不是您想要的测试类本身:
@API(status = EXPERIMENTAL, since = "5.4")
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface Order {...}
您还可以注意到,这是一项实验性功能。
因此,您可以在此处订购的唯一内容是同一 @Nested 中的测试方法。范围,例如:
@Nested
class NestedTest1 {

@Order(3)
@Test
void success3() {
System.out.println(3);
}

@Order(2)
@Test
void success2() {
System.out.println(2);
}

@Order(1)
@Test
void success1() {
System.out.println(1);
}
}
输出 :

1

2

3


顺便说一下,指定 @TestMethodOrder(OrderAnnotation.class)看起来不需要(至少在我测试的 5.4.0 版本中)。

关于java - JUnit5:指定多个@Nested 类的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57762701/

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