在 JUnit5 中,可以将@Test
替换成@ParameterizedTest
,这样就可以使用不同的参数、多次循环运行测试方法。
@ValueSource
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @DisplayName("this is demo 1") @ParameterizedTest @ValueSource(ints = { 1, 2, 3 }) public void test_Demo1(int arg) { int expected = 2; assertEquals(expected, arg, "You are not such 2"); }
@DisplayName("this is demo 2") @ParameterizedTest(name = "{index} ==> the testcase is running") @ValueSource(strings = {"1", "2", "3,4"}) public void test_Demo2(String arg) { assertNull(arg, "不应空虚");
String expected = "2"; assertEquals(expected, arg, "You are not such 2"); }
|
在@ValueSource
中,可以使用 strings、ints 等等。但是,我个人更**倾向于使用strings
**,因为 String 可以隐式转换为很多格式,这样传参更灵活一些。
1 2 3 4 5 6 7 8 9 10 11
| @ParameterizedTest @ValueSource(strings = {"true", "false"}) public void test_Demo3(boolean arg) { assertTrue(arg); }
@ParameterizedTest @ValueSource(strings = {"0", "1.1", "2.2"}) public void test_Demo4(BigDecimal arg) { assertEquals(BigDecimal.ZERO, arg); }
|
String 可以自动转换成哪些格式?
@CsvSource
1 2 3 4 5 6 7 8
| @ParameterizedTest @CsvSource({ " 85, 体育, true", "99.5, '语,数,外', false", }) public void test_Demo5(BigDecimal score, String subject, boolean isWin) {
}
|
ArgumentsAccessor 参数聚合器
通过ArgumentsAccessor
一次接收多个参数。
1 2 3 4 5 6 7 8 9 10
| @ParameterizedTest @CsvSource({ " 85, 体育, true", "99.5, '语,数,外', false", }) public void test_Demo6(ArgumentsAccessor args) { args.get(0 , BigDecimal.class); args.get(1, String.class); args.get(2, Boolean.class); }
|
ArgumentsAccessor doc api
@CsvFileSource
和@CsvSource
的区别,从 csv 文件读取测试数据,传参等用法相同。
1 2 3 4
| @ParameterizedTest @CsvFileSource(resources = "/login-data.csv", numLinesToSkip = 1) void test_Demo7(ArgumentsAccessor args) { }
|