JUNIT测试类的执行顺序
JUNIT测试类的执行顺序
发现java测试类是由gradle来完成
对于Junit, 默认情况下gradle会扫描以下类作为JUnit的测试类:
- 最终继承自 TestCase 或 GroovyTestCase
- 含有
@RunWith
注解 - 包含
@Test
注解的方法或者超类包含@Test
注解的方法
尽管测试类通常不应该依赖于它的执行顺序,但是junit5还是提供了对测试类进行排序的方案(junit5.8+):
- 先引入相关依赖:testImplementation(‘org.junit.jupiter:junit-jupiter-api:<版本号>’)
- 新建一个配置文件
src/test/resources/junit-platform.properties
- 在文件配置指定用来进行排序的类:
其中, value值为:junit.jupiter.testclass.order.default = \ org.junit.jupiter.api.ClassOrderer$<value>
- ClassName
- DisplayName
- OrderAnnotation: 根据含有
@Order
注解的类进行排序 - Random: 随机
也可以自己实现ClassOrderer接口去自定义排序方法,在配置中指定你写的排序类
- 如果指定了OrderAnnotation,则在测试类上标记
@Order
,数值越小执行越靠前,如果提示@Order
注解不能放在类上,是因为junit版本要大于等于5.8
对于具体gradle执行的测试类默认情况下到底先后顺序是如何的,可以在每个类测试前加上日志输出,就可以观察出类的执行顺序了:
test {
useJUnitPlatform()
beforeTest { descriptor ->
logger.lifecycle("Running test: " + descriptor)
}
}
在控制台中执行gradle clean && gradle test
命令,可以看到具体的输出结果
多次测试观察,数据结果均一致
结论是:按照包名的字典顺序去执行测试类
在测试类中的方法执行顺序则可以使用注解@FixMethodOrder(value)来进行规定,value值为:
- MethodSorters.DEFAULT 默认,以确定但不可预测的顺序对测试方法进行排序
- MethodSorters.NAME_ASCENDING 按方法名,按字符的字典顺序
- MethodSorters.JVM
也可以使用@order
注解对方法进行排序(junit 5.4+),
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class OrderedTests {
@Test
@Order(1)
void nullValues() {}
@Test
@Order(2)
void emptyValues() {}
@Test
@Order(3)
void validValues() {}
}
参考文档:
- https://junit.org/junit5/docs/5.5.0/api/org/junit/jupiter/api/TestMethodOrder.html#value()
- https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order
- https://docs.gradle.org/current/userguide/java_testing.html#sec:test_detection
- https://junit.org/junit4/javadoc/4.12/org/junit/runners/MethodSorters.html
- https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order-classes
评论