写点什么

JUnit5 学习之六:参数化测试 (Parameterized Tests) 基础

用户头像
极客good
关注
发布于: 刚刚
  • 本文是《JUnit5 学习》系列的第六篇,一起来实战强大参数化测试(Parameterized Tests),即多次执行同一个测试方法,每次使用不同的参数;

  • 由于参数化测试功能强大,内容也比前几篇的知识点多,为了方便大家阅读和实践,这里分为《基础》和《进阶》两篇来介绍,本篇以学习参数化测试(Parameterized Tests)的基础知识为主,包含以下内容:


  1. 极速体验;

  2. 版本依赖;

  3. ValueSource 数据源

  4. null、空字符串数据源

  5. 枚举数据源

  6. 方法数据源

  7. Csv 格式数据源

  8. Csv 文件数据源

[](

)源码下载


  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 协议 |


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



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


[](

)极速体验


  1. 现在,咱们以最少的步骤体验最简单的参数化测试;

  2. 在父工程 junitpractice 里新建名为 parameterized 的子工程,pom.xml 内容如下:


<?xml version="1.0" encoding="UTF-8"?>


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">


<modelVersion>4.0.0</modelVersion>


<parent>


<groupId>com.bolingcavalry</groupId>


<artifactId>junitpractice</artifactId>


<version>1.0-SNAPSHOT</version>


<relativePath>../pom.xml</relativePath>


</parent>


<groupId>com.bolingcavalry</groupId>


<artifactId>parameterized</artifactId>


<version>0.0.1-SNAPSHOT</version>


<name>parameterized</name>


<description>Demo project for parameterized expirence in Spring Boot junit</description>


<properties>


<java.version>1.8</java.version>


</properties>


<dependencyManagement>


<dependencies>


<dependency>


<groupId>org.junit</groupId>


<artifactId>junit-bom</artifactId>


<version>5.7.0</version>


<type>pom</type>


<scope>import</scope>


</dependency>


</dependencies>


</dependencyManagement>


<dependencies>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-web</artifactId>


</dependency>


<dependency>


<groupId>org.projectlombok</groupId>


<artifactId>lombok</artifactId>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-test</artifactId>


<scope>test</scope>


<exclusions>


<exclusion>


<groupId>org.junit.jupiter</groupId>


<artifactId>junit-jupiter</artifactId>


</exclusion>


</exclusions>


</dependency>


<dependency>


<groupId>org.junit.jupiter</groupId>


<artifactId>junit-jupiter</artifactId>


<scope>test</scope>


</dependency>


</dependencies>


<build>


<plugins>


<plugin>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-maven-plugin</artifactId>


</plugin>


</plugins>


</build>


</project>


  1. 新建测试类 HelloTest.java,在这个位置:junitpractice\parameterized\src\test\java\com\bolingcavalry\parameterized\service\impl,内容如下:


package com.bolingcavalry.parameterized.service.impl;


import lombok.extern.slf4j.Slf4j;


import org.junit.jupiter.api.DisplayName;


import org.junit.jupiter.api.MethodOrderer;


import org.junit.jupiter.api.Order;


import org.junit.jupiter.api.TestMethodOrder;


import org.junit.jupiter.params.ParameterizedTest;


import org.junit.jupiter.params.provider.ValueSource;


import org.springframework.boot.test.context.SpringBootTest;


import static org.junit.jupiter.api.Assertions.assertTrue;


@SpringBootTest


@Slf4j


@TestMethodOrder(MethodOrderer.OrderAnnotation.class)


public class HelloTest {


@Order(1)


@DisplayName("多个字符串型入参")


@ParameterizedTest


@ValueSource(strings = { "a", "b", "c" })


void stringsTest(String candidate) {


log.info("stringsTest [{}]", candidate);


assertTrue(null!=candidate);


}


}


  1. 执行该测试类,结果如下图:



  1. 从上图可见执行参数化测试需要两步:首先用 @ParameterizedTest 取代 @Test,表名此方法要执行参数化测试,然后用 @ValueSource 指定每次测试时的参数来自字符串类型的数组:{ “a”, “b”, “c” },每个元素执行一次;

  2. 至此,咱们已体验过最简单的参数化测试,可见就是想办法使一个测试方法多次执行,每次都用不同的参数,接下来有关参数化测试的更多配置和规则将配合实战编码逐个展开,一起来体验吧;

[](

)版本要求


  • 先看看 SpringBoot-2.3.4.RELEASE 间接依赖的 junit-jupiter-5.6.2 版本中,ParameterizedTest 的源码,如下图红框所示,此时的 ParameterizedTest 还只是体验版:



  • 再看看 junit-jupiter-5.7.0 版本的 ParameterizedTest 源码,此时已经是稳定版了:



  • 综上所述,如果要使用参数化测试,最好是将 junit-jupiter 升级到 5.7.0 或更高版本,如果您的应用使用了 SpringBoot 框架,junit-jupiter 是被 spring-boot-starter-test 间接依赖进来的,需要排除这个间接依赖,再手动依赖进来才能确保使用指定版本,在 pom.xml 中执行如下三步操作:


  1. dependencyManagement 节点添加 junit-bom,并指定版本号:


<dependencyManagement>


<dependencies>


<dependency>


<groupId>org.junit</groupId>


<artifactId>junit-bom</artifactId>


<version>5.7.0</version>


<type>pom</type>


<scope>import</scope>


</dependency>


</dependencies>


</dependencyManagement>


  1. 排除 spring-boot-starter-test 和 junit-jupiter 的间接依赖关系:


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-test</artifactId>


<scope>test</scope>


<exclusions>


<exclusion>


<groupId>org.junit.jupiter</groupId>


<artifactId>junit-jupiter</artifactId>


</exclusion>


</exclusions>


</dependency>


  1. 添加 junit-jupiter 依赖,此时会使用 dependencyManagement 中指定的版本号:


<dependency>


<groupId>org.junit.jupiter</groupId>


<artifactId>junit-jupiter</artifactId>


<scope>test</scope>


</dependency>


  1. 如下图,刷新可见已经用上了 5.7.0 版本:



  • 版本问题解决了,接下来正式开始学习 Parameterized Tests,先要了解的是有哪些数据源;

[](

)ValueSource 数据源


  1. ValueSource 是最简单常用的数据源,支持以下类型的数组:


short


byte


int


long


float


double


char


boolean


java.lang.String


java.lang.Class


  1. 下面是整形数组的演示:


@Order(2)


@DisplayName("多个 int 型入参")


@ParameterizedTest


@ValueSource(ints = { 1,2,3 })


void intsTest(int candidate) {


log.info("ints [{}]", candidate);


assertTrue(candidate<3);


}


  1. 从上述代码可见,入参等于 3 的时候 assertTrue 无法通过,测试方法会失


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


败,来看看实际执行效果,如下图:


[](

)null、空字符串数据源


  1. 在用字符串作为入参时,通常要考虑入参为 null 的情况,此时 ValueSource 一般会这样写:


@ValueSource(strings = { null, "a", "b", "c" })


  1. 此时可以使用 @NullSource 注解来取代上面的 null 元素,下面这种写法和上面的效果一模一样:


@NullSource


@ValueSource(strings = { "a", "b", "c" })


  1. 执行结果如下图红框,可见 null 作为入参被执行了一次:



  1. 与 @NullSource 代表 null 入参类似,@EmptySource 代表空字符串入参,用法和执行结果如下图所示:



  1. 如果想同时用 null 和空字符串做测试方法的入参,可以使用 @NullAndEmptySource,用法和执行结果如下图所示:


[](

)枚举数据源(EnumSource)


  1. EnumSource 可以让一个枚举类中的全部或者部分值作为测试方法的入参;

  2. 创建枚举类 Types.java,用于接下来的实战,如下,很简单只有三个值:


public enum Types {


SMALL,


BIG,


UNKNOWN


}

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
JUnit5学习之六:参数化测试(Parameterized Tests)基础