一般实践认为,自动化测试应能够独立运行且无特定顺序,并且测试结果不应依赖于先前测试的结果。 但是在某些情况下,可以证明特定的测试执行顺序是正确的,尤其是在集成或端到端测试中。
默认情况下,在JUnit 5中,测试方法的执行在构建之间是可重复的,因此是确定性的,但是该算法是故意不明显的(作为库状态的作者)。 幸运的是,可以使用内置方法定购器或通过创建自定义定购器来调整执行顺序以适应我们的需求。
org.junit.jupiter.api.TestMethodOrder
为了更改测试执行顺序,我们需要使用org.junit.jupiter.api.TestMethodOrder
注释测试类,并将方法排序器的类型作为参数传递。 从JUnit 5.4开始,有三个内置的方法排序器: OrderAnnotation
, Alphanumeric
和Random
。 通过实现org.junit.jupiter.api.MethodOrderer
接口,我们还可以轻松创建自己的自定义方法org.junit.jupiter.api.MethodOrderer
器。
使用
package pl.codeleak.samples.junit5.basics; 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 ) class TestExecutionOrderWithOrderAnnotation { @Order ( 1 ) @Test void aTest() {} @Order ( 2 ) @Test void bTest() {} @Order ( 3 ) @Test void cTest() {} }
字母数字顺序
@TestMethodOrder (MethodOrderer.Alphanumeric. class ) class AlphanumericTestExecutionOrder { @Test void aTest() {} @Test void bTest() {} @Test void cTest() {} }
随机排序
如果要确保生成之间的方法执行顺序不确定,则随机排序可能很有用。
@TestMethodOrder (MethodOrderer.Random. class ) class AlphanumericTestExecutionOrder { @Test void aTest() {} @Test void bTest() {} @Test void cTest() {} }
随机方法订购者使用System.nanoTime()
作为种子,但是可以使用junit.jupiter.execution.order.random.seed
配置属性对其进行更改。 此属性的值应返回可以使用Long.valueOf(String)
进行转换的任何String
。
配置种子的一种方法是在junit-platform.properties
配置文件中提供配置属性:
junit.jupiter.execution.order.random.seed= 42
定制订购
可以通过实现org.junit.jupiter.api.MethodOrderer
接口并将其作为@TestMethodOrder
的参数来创建自定义方法@TestMethodOrder
。
下面的示例是一个方法排序器,它按名称的长度对方法进行排序:
class MethodLengthOrderer implements MethodOrderer { private Comparator<MethodDescriptor> comparator = Comparator.comparingInt(methodDescriptor -> methodDescriptor.getMethod().getName().length()); @Override public void orderMethods(MethodOrdererContext context) { context.getMethodDescriptors().sort(comparator); } }
并使用:
@TestMethodOrder (MethodLengthOrderer. class ) class CustomTestExecutionOrder { @Test void aTest() {} @Test void abTest() {} @Test void abcTest() {} }
摘要
在某些情况下,有一种在JUnit 5中调整测试执行顺序的方法会很有用,我很高兴看到此功能。 我相信在大多数情况下,内置方法订购者将绰绰有余。 如果没有,那么有一种实现自定义方法的简便方法。
在GitHub上找到本文中使用的示例(以及更多): https : //github.com/kolorobot/junit5-samples/tree/master/junit5-basics
翻译自: https://www.javacodegeeks.com/2019/03/test-execution-order-junit-5.html