前面的测试方法入参都只有一个,在面对多个入参的测试方法时,@CsvSource就派上用场了,演示代码如下所示,可见数据是普通的CSV格式,每条记录有两个字段,对应测试方法的两个入参:
@Order(12) @DisplayName("CSV格式多条记录入参") @ParameterizedTest @CsvSource({ "apple1, 11", "banana1, 12", "'lemon1, lime1', 0x0A" }) void csvSourceTest(String fruit, int rank) { log.info("csvSourceTest, fruit [{}], rank [{}]", fruit, rank); }执行结果如下,通过日志可以确定,每条记录的两个字段能匹配到测试方法的两个入参中:
另外@CsvSource还提供了一个属性nullValues,作用是将指定的字符串识别为null,下面这个设置就是把CSV数据中所有的NIL识别为null,再传给测试方法:
@Order(13) @DisplayName("CSV格式多条记录入参(识别null)") @ParameterizedTest @CsvSource(value = { "apple2, 21", "banana2, 22", "'lemon2, lime2', 0x0A", "NIL, 3" }, nullValues = "NIL" ) void csvSourceWillNullTokenTest(String fruit, int rank) { log.info("csvSourceWillNullTokenTest, fruit [{}], rank [{}]", fruit, rank); }执行结果如下,可见字符串NIL到测试方法后已变成null:
Csv文件数据源@CsvSource解决了测试方法入参有多个字段的问题,但是把作为入参的测试数据写在源文件中似乎不合适,尤其是数据量很大的情况下,这种场景适合用@CsvFileSource,该注解用于指定csv文件作为数据源,注意numLinesToSkip属性指定跳过的行数,可以用来跳过表头:
@Order(14) @DisplayName("CSV文件多条记录入参") @ParameterizedTest @CsvFileSource(files = "src/test/resources/two-column.csv", numLinesToSkip = 1) void csvFileTest(String country, int reference) { log.info("csvSourceTest, country [{}], reference [{}]", country, reference); }在src/test/resources/创建文件two-column.csv,内容如下:
Country, reference Sweden, 1 Poland, 2 "United States of America", 3上述代码执行结果如下,代码中没有测试数据,显得更加简洁一些:
期待《进阶》篇至此,咱们队JUnit5的参数化测试(Parameterized)有了初步的了解,可以通过各种数据源注解给测试方法制造更多的参数,但仅掌握这些还是不够的,依然有一些问题待解决,例如更自由的数据源定制、跟完善的多字段处理方案等等,下一篇《进阶》咱们一起来体验更多参数化测试的高级功能;
你不孤单,欣宸原创一路相伴Java系列
Spring系列
Docker系列
kubernetes系列
数据库+中间件系列
DevOps系列
欢迎关注公众号:程序员欣宸微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos