JUnit5学习之七:参数化测试(Parameterized Tests)进阶

简介: JUnit5学习之七:参数化测试(Parameterized Tests)进阶
  1. 参数化测试(Parameterized Tests)进阶
  2. 综合进阶(终篇)


[](

)本篇概览


本文是《JUnit5学习》系列的第七篇,前文咱们对JUnit5的参数化测试(Parameterized Tests)有了基本了解,可以使用各种数据源控制测试方法多次执行,今天要在此基础上更加深入,掌握参数化测试的一些高级功能,解决实际问题;


本文由以下章节组成:


  1. 自定义数据源
  2. 参数转换
  3. 多字段聚合
  4. 多字段转对象
  5. 测试执行名称自定义


[](

)源码下载

  1. 如果您不想编码,可以在GitHub下载所有源码,地址和链接信息如下表所示:


| 名称 | 链接 | 备注 |


| :-- | :-- | :-- |


| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |


| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |


| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |


2.这个git项目中有多个文件夹,本章的应用在junitpractice文件夹下,如下图红框所示:

20200926101440540.jpg


3.junitpractice是父子结构的工程,本篇的代码在parameterized子工程中,如下图:

20201005184402302.jpg


[](

)自定义数据源

  1. 前文使用了很多种数据源,如果您对它们的各种限制不满意,想要做更彻底的个性化定制,可以开发ArgumentsProvider接口的实现类,并使用@ArgumentsSource指定;
  2. 举个例子,先开发ArgumentsProvider的实现类MyArgumentsProvider.java:


package com.bolingcavalry.parameterized.service.impl;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
import java.util.stream.Stream;
public class MyArgumentsProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
return Stream.of(“apple4”, “banana4”).map(Arguments::of);
}
}


3.再给测试方法添加@ArgumentsSource,并指定MyArgumentsProvider:

@Order(15)
@DisplayName(“ArgumentsProvider接口的实现类提供的数据作为入参”)
@ParameterizedTest
@ArgumentsSource(MyArgumentsProvider.class)
void argumentsSourceTest(String candidate) {
log.info(“argumentsSourceTest [{}]”, candidate);
}


  1. 执行结果如下:


[](

)参数转换

  1. 参数化测试的数据源和测试方法入参的数据类型必须要保持一致吗?其实JUnit5并没有严格要求,而事实上JUnit5是可以做一些自动或手动的类型转换的;
  2. 如下代码,数据源是int型数组,但测试方法的入参却是double:


@Order(16)
@DisplayName(“int型自动转为double型入参”)
@ParameterizedTest
@ValueSource(ints = { 1,2,3 })
void argumentConversionTest(double candidate) {
log.info(“argumentConversionTest [{}]”, candidate);
}


3.执行结果如下,可见int型被转为double型传给测试方法(Widening Conversion):

20201006122222100.jpg


4.还可以指定转换器,以转换器的逻辑进行转换,下面这个例子就是将字符串转为LocalDate类型,关键是@JavaTimeConversionPattern:

@Order(17)
@DisplayName(“string型,指定转换器,转为LocalDate型入参”)
@ParameterizedTest
@ValueSource(strings = { “01.01.2017”, “31.12.2017” })
void argumentConversionWithConverterTest(
@JavaTimeConversionPattern(“dd.MM.yyyy”) LocalDate candidate) {
log.info(“argumentConversionWithConverterTest [{}]”, candidate);
}


5.执行结果如下:


20201006122946246.jpg

[](

)字段聚合(Argument Aggregation)


  1. 来思考一个问题:如果数据源的每条记录有多个字段,测试方法如何才能使用这些字段呢?
  2. 回顾刚才的@CsvSource示例,如下图,可见测试方法用两个入参对应CSV每条记录的两个字段,如下所示:


20201006123555541.jpg


3.上述方式应对少量字段还可以,但如果CSV每条记录有很多字段,那测试方法岂不是要定义大量入参?这显然不合适,此时可以考虑JUnit5提供的字段聚合功能(Argument Aggregation),也就是将CSV每条记录的所有字段都放入一个ArgumentsAccessor类型的对象中,测试方法只要声明ArgumentsAccessor类型 需要zi料+ 绿色徽【vip1024b】

作为入参,就能在方法内部取得CSV记录的所有字段,效果如下图,可见CSV字段实际上是保存在ArgumentsAccessor实例内部的一个Object数组中:



2020100616403441.jpg

4.如下图,为了方便从ArgumentsAccessor实例获取数据,ArgumentsAccessor提供了获取各种类型的方法,您可以按实际情况选用:

20201006164320682.jpg


5.下面的示例代码中,CSV数据源的每条记录有三个字段,而测试方法只有一个入参,类型是ArgumentsAccessor,在测试方法内部,可以用ArgumentsAccessor的getString、get等方法获取CSV记录的不同字段,例如arguments.getString(0)就是获取第一个字段,得到的结果是字符串类型,而arguments.get(2, Types.class)的意思是获取第二个字段,并且转成了Type.class类型:

@Order(18)


@DisplayName(“CsvSource的多个字段聚合到ArgumentsAccessor实例”)


@ParameterizedTest
@CsvSource({
“Jane1, Doe1, BIG”,
“John1, Doe1, SMALL”
})
void argumentsAccessorTest(ArgumentsAccessor arguments) {
Person person = new Person();
person.setFirstName(arguments.getString(0));
person.setLastName(arguments.getString(1));
person.setType(arguments.get(2, Types.class));
log.info(“argumentsAccessorTest [{}]”, person);
}


Kafka进阶篇知识点

0801ca5929d110b1c00aac2b5719b31f_format,png.png


Kafka高级篇知识点


29e5eebb28a3a6ac795d26bdf8f05382_format,png.png


44个Kafka知识点(基础+进阶+高级)解析如下

406b4cec1514bfd1c9a31fbdb62cb879_format,png.png


相关文章
|
1月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
15天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
46 6
|
1月前
|
测试技术
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
单元测试问题之使用TestMe时利用JUnit 5的参数化测试特性如何解决
26 2
|
1月前
|
Java 测试技术 Maven
单元测试问题之在Maven项目中引入JUnit 5和Mockito的依赖如何解决
单元测试问题之在Maven项目中引入JUnit 5和Mockito的依赖如何解决
102 1
|
1月前
|
测试技术
如何使用 JUnit 测试方法是否存在异常
【8月更文挑战第22天】
19 0
|
1月前
|
JSON Java 测试技术
单元测试问题之使用JSON文件作为参数化测试的输入源如何解决
单元测试问题之使用JSON文件作为参数化测试的输入源如何解决
45 0
|
1月前
|
Java 测试技术 Maven
Junit单元测试 @Test的使用教程
这篇文章是一个关于Junit单元测试中`@Test`注解使用的教程,包括在Maven项目中添加Junit依赖、编写带有@Test注解的测试方法,以及解决@Test注解不生效的常见问题。
|
1月前
|
前端开发 Java 测试技术
单元测试问题之在Spring MVC项目中添加JUnit的Maven依赖,如何操作
单元测试问题之在Spring MVC项目中添加JUnit的Maven依赖,如何操作
|
1月前
|
Java 测试技术 API
深入理解单元测试:JUnit框架在Java中的应用
【8月更文挑战第3天】本文将引导读者通过JUnit框架的镜头,探索单元测试的奥秘。我们将一起揭开单元测试的神秘面纱,了解其在软件开发中的关键作用,并具体学习如何在Java项目中应用JUnit进行有效的单元测试。文章不仅会涉及理论概念,还将通过具体的代码示例,展示如何编写和运行单元测试,以确保软件质量。让我们开始吧,一起踏上这段提升代码质量和开发效率的旅程。
30 0
|
3月前
|
Java Maven Spring
spring如何使用junit进行测试
spring如何使用junit进行测试
spring如何使用junit进行测试