目录
Spring Boot 通过 JUnit5 提供的@TestMethodOrder
注解控制测试执行顺序,共有五种内置的排序方式。
一、内置排序方式
1. 方法名字母数字排序
将测试类上@TestMethodOrder
注解参数值设置为MethodOrderer.Alphanumeric.class
,自 JUnit 5.7 版本开始标记为DEPRECATED
,建议使用MethodOrderer.MethodName.class
代替。
2. 按照@DisplayName
排序
将测试类上@TestMethodOrder
注解参数值设置为MethodOrderer.DisplayName.class
。
package com.example.demo;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(MethodOrderer.DisplayName.class)
public class UnitTest {
@Test
@DisplayName("The second test")
public void test1() {
System.out.println("Test 1");
}
@Test
@DisplayName("The third test")
public void test2() {
System.out.println("Test 2");
}
@Test
@DisplayName("The first test")
public void test3() {
System.out.println("Test 3");
}
}
测试输出:
Test 3
Test 1
Test 2
3. 按照方法名排序
将测试类上@TestMethodOrder
注解参数值设置为MethodOrderer.MethodName.class
。
package com.example.demo;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(MethodOrderer.MethodName.class)
public class UnitTest {
@Test
public void testC() {
System.out.println("Test C");
}
@Test
public void testX() {
System.out.println("Test X");
}
@Test
public void testA() {
System.out.println("Test A");
}
@Test
public void test0() {
System.out.println("Test 0");
}
@Test
public void testB() {
System.out.println("Test B");
}
}
测试输出:
Test 0
Test A
Test B
Test C
Test X
4. 按照@Order
排序
- 将测试类上
@TestMethodOrder
注解参数值设置为MethodOrderer.OrderAnnotation.class
; - 为测试方法添加
@Order(X)
注解,参数值X
是整数,整数越小越先执行。
package com.example.demo;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class UnitTest {
@Test
@Order(1)
public void test1() {
System.out.println("Test 1");
}
@Test
@Order(2)
public void test2() {
System.out.println("Test 2");
}
@Test
@Order(3)
public void test3() {
System.out.println("Test 3");
}
@Test
@Order(0)
public void test0() {
System.out.println("Test 0");
}
}
测试输出:
Test 0
Test 1
Test 2
Test 3
5. 随机排序
将测试类上@TestMethodOrder
注解参数值设置为MethodOrderer.Random.class
。
package com.example.demo;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(MethodOrderer.Random.class)
public class UnitTest {
@Test
public void test1() {
System.out.println("Test 1");
}
@Test
public void test2() {
System.out.println("Test 2");
}
@Test
public void test3() {
System.out.println("Test 3");
}
@Test
public void test0() {
System.out.println("Test 0");
}
}
每次测试输出结果可能不同。
二、自定义排序
自定义排序必须实现MethodOrderer
接口。
package com.example.demo;
import org.junit.jupiter.api.MethodDescriptor;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.MethodOrdererContext;
public class CustomOrder implements MethodOrderer {
@Override
public void orderMethods(MethodOrdererContext context) {
context.getMethodDescriptors().sort(
(MethodDescriptor x, MethodDescriptor y) -> y.getMethod().getName()
.compareToIgnoreCase(x.getMethod().getName()));
}
}
指定@TestMethodOrder
注解参数为自定义排序类。
package com.example.demo;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(CustomOrder.class)
public class UnitTest {
@Test
public void testC() {
System.out.println("Test C");
}
@Test
public void testX() {
System.out.println("Test X");
}
@Test
public void testA() {
System.out.println("Test A");
}
}
测试输出结果和自定义排序匹配(方法名称倒序)。
Test X
Test C
Test A
三、设置默认排序
package com.example.demo;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class UnitTest {
@Test
@DisplayName("Test 3")
public void testC() {
System.out.println("Test C");
}
@Test
@DisplayName("Test 2")
public void testX() {
System.out.println("Test X");
}
@Test
@DisplayName("Test 1")
public void testA() {
System.out.println("Test A");
}
}
以上测试如果不设置默认排序,输出结果为:
Test A
Test C
Test X
如果要设置默认排序,需要在src/test/resources
目录下新增junit-platform.properties
文件,文件内容为:
junit.jupiter.testmethod.order.default = org.junit.jupiter.api.MethodOrderer$DisplayName
再次执行测试,输出结果为:
Test A
Test X
Test C
注意:按照此方法设置的默认排序只对不带@TestMethodOrder
注解的测试生效,且junit-platform.properties
文件中指定的类必须实现MethodOrderer
接口。
作者:又语
链接:https://juejin.cn/post/7041886698464083998
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。