参数化测试
参数化测试和普通测试稍微不同的地方在于,一个测试方法需要接收至少一个参数,然后,传入一组参数反复运行。
JUnit提供了一个注解,用来进行参数化测试。
假设我们想对Math.abs()
进行测试,先用一组正数进行测试:
再用一组负数进行测试:
@ParameterizedTest
@ValueSource(ints = { -1, -5, -100 })
void testAbsNegative(int x) {
}
注意到参数化测试的注解是@ParameterizedTest
,而不是普通的@Test
。
要用参数化测试的方法来测试,我们不但要给出输入,还要给出预期输出。因此,测试方法至少需要接收两个参数:
@ParameterizedTest
assertEquals(result, StringUtils.capitalize(input));
}
现在问题来了:参数如何传入?
最简单的方法是通过@MethodSource
注解,它允许我们编写一个同名的静态方法来提供测试参数:
上面的代码很容易理解:静态方法testCapitalize()
返回了一组测试参数,每个参数都包含两个String
,正好作为测试方法的两个参数传入。
如果静态方法和测试方法的名称不同,@MethodSource也允许指定方法名。但使用默认同名方法最方便。
@ParameterizedTest
void testCapitalize(String input, String result) {
}
如果有成百上千的测试输入,那么,直接写@CsvSource
就很不方便。这个时候,我们可以把测试数据提到一个独立的CSV文件中,然后标注上@CsvFileSource
:
JUnit只在classpath中查找指定的CSV文件,因此,test-capitalize.csv
这个文件要放到test
目录下,内容如下:
apple, Apple
HELLO, Hello
JUnit, Junit
下载练习:参数化测试StringUtils (推荐使用快速下载)
使用参数化测试,可以提供一组测试数据,对一个测试方法反复测试。
参数既可以在测试代码中写死,也可以通过@CsvFileSource
放到外部的CSV文件中。