JUNIT测试类的执行顺序

November 11, 2022 作者: yijianhao 分类: java 浏览: 433 评论: 0

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
  • 在文件配置指定用来进行排序的类:
    junit.jupiter.testclass.order.default = \
    	org.junit.jupiter.api.ClassOrderer$<value>
    
    其中, 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值为:

  1. MethodSorters.DEFAULT 默认,以确定但不可预测的顺序对测试方法进行排序
  2. MethodSorters.NAME_ASCENDING 按方法名,按字符的字典顺序
  3. 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() {}
 }

参考文档:

  1. https://junit.org/junit5/docs/5.5.0/api/org/junit/jupiter/api/TestMethodOrder.html#value()
  2. https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order
  3. https://docs.gradle.org/current/userguide/java_testing.html#sec:test_detection
  4. https://junit.org/junit4/javadoc/4.12/org/junit/runners/MethodSorters.html
  5. https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order-classes

评论