重要性:★★★★☆
有时候,为了能够全面证明代码的正确性,我们需要使用多组不同的数据去测试同一个方法(例如用不同的取款金额去测试取款的结果)。如果针对每组数据分别写一个测试方法,就会非常繁琐。
通过使用@ParameterizedTest
注解取代@Test
注解,我们可以使用不同的参数值多次调用同一个测试方法,这就是参数化测试。当执行参数化测试的时候,还需要至少定义一个参数源,用来为测试方法提供参数值。
下面是简单的参数化测试例子:
@ParameterizedTest
@ValueSource(strings = {
"racecar", "radar", "able was I ere I saw elba" })
void palindromes(String candidate) {
assertTrue(StringUtils.isPalindrome(candidate));
}
1. 添加依赖项
要编写参数化测试,必须在项目中添加junit-jupiter-params
依赖项。
在maven项目中,需要在pom.xml
文件中的<dependencies>
节添加下面的依赖:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.6.2</version>
<scope>test</scope>
</dependency>
在gradle项目中,需要在build.gradle
文件中的dependencies
节添加以下内容:
testCompile 'org.junit.jupiter:junit-jupiter-params:5.6.2'
如果项目中已经定义了junit-jupiter
依赖项,就不需要添加junit-jupiter-params
依赖项了。因为前者对后者有传递性依赖。
2. 定义参数源
JUnit Jupiter提供了一些内建的参数源注解。
2.1 @ValueSource
通过指定一个由简单值字面量组成的数组提供参数源。当使用@ValueSource
时,测试方法只能有一个来自参数源的参数(依赖注入的其他参数不算)。
@ValueSource
支持以下的数据类型:
- short
- byte
- int
- long
- float
- double
- char
- boolean
- java.lang.String
- java.lang.Class
例如,下面的代码示例会分别以1,2,3作为参数值调用参数化测试方法testWithValueSource()
各一次。
package yang.yu.tdd.parameterized;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.assertj.core.api.Assertions.assertThat;
public class ParameterizedDemo {
@ParameterizedTest
@ValueSource(ints = {
1, 2, 3 })
void testWithValueSource(int argument) {
assertThat(argument).isGreaterThan(0).isLessThan(4);
}
}
2.2 @NullSource
、@EmptySource
和@NullAndEmptySource
为了测试被测类方法在接收各种“坏”输入值时方法的行为,我们要给参数化测试方法提供能够提供代表null和空值的参数值。
@NullSource
:给参数化测试方法提供null作为参数值。这个注解不能用于提供基本类型的值。@EmptySource
:为参数化测试方法提供代表空(empty)
的值作为参数值。支持以下类型:java.lang.String
,java.util.List
,java.util.Set
,java.util.Map
, 基本类型数组 (例如int[]
,char[][]
, 等等), 对象数组 (例如String[]
,Integer[][]
等等,但不支持上述类型的子类型。对于字符串,会提供空字符串;对于各种集合、Map和数组,提供不包含任何元素的空集合、空Map和空数组。@NullAndEmptySource
: