原创 | TDD工具集:JUnit、AssertJ和Mockito (二十)编写测试-参数化测试

在这里插入图片描述
在这里插入图片描述

重要性:★★★★☆

有时候,为了能够全面证明代码的正确性,我们需要使用多组不同的数据去测试同一个方法(例如用不同的取款金额去测试取款的结果)。如果针对每组数据分别写一个测试方法,就会非常繁琐。

通过使用@ParameterizedTest注解取代@Test注解,我们可以使用不同的参数值多次调用同一个测试方法,这就是参数化测试。当执行参数化测试的时候,还需要至少定义一个参数源,用来为测试方法提供参数值。

下面是简单的参数化测试例子:

@ParameterizedTest
@ValueSource(strings = {
    "racecar", "radar", "able was I ere I saw elba" })
void palindromes(String candidate) {
   
    assertTrue(StringUtils.isPalindrome(candidate));
}

1. 添加依赖项

要编写参数化测试,必须在项目中添加junit-jupiter-params依赖项。

在maven项目中,需要在pom.xml文件中的<dependencies>节添加下面的依赖:

    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-params</artifactId>
      <version>5.6.2</version>
      <scope>test</scope>
    </dependency>

在gradle项目中,需要在build.gradle文件中的dependencies节添加以下内容:

testCompile 'org.junit.jupiter:junit-jupiter-params:5.6.2'

如果项目中已经定义了junit-jupiter依赖项,就不需要添加junit-jupiter-params依赖项了。因为前者对后者有传递性依赖。

2. 定义参数源

JUnit Jupiter提供了一些内建的参数源注解。

2.1 @ValueSource

通过指定一个由简单值字面量组成的数组提供参数源。当使用@ValueSource时,测试方法只能有一个来自参数源的参数(依赖注入的其他参数不算)。

@ValueSource支持以下的数据类型:

  • short
  • byte
  • int
  • long
  • float
  • double
  • char
  • boolean
  • java.lang.String
  • java.lang.Class

例如,下面的代码示例会分别以1,2,3作为参数值调用参数化测试方法testWithValueSource()各一次。

package yang.yu.tdd.parameterized;

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

import static org.assertj.core.api.Assertions.assertThat;

public class ParameterizedDemo {
   
    @ParameterizedTest
    @ValueSource(ints = {
    1, 2, 3 })
    void testWithValueSource(int argument) {
   
        assertThat(argument).isGreaterThan(0).isLessThan(4);
    }
}

2.2 @NullSource@EmptySource@NullAndEmptySource

为了测试被测类方法在接收各种“坏”输入值时方法的行为,我们要给参数化测试方法提供能够提供代表null和空值的参数值。

  • @NullSource:给参数化测试方法提供null作为参数值。这个注解不能用于提供基本类型的值。
  • @EmptySource:为参数化测试方法提供代表空(empty)的值作为参数值。支持以下类型:java.lang.String, java.util.List, java.util.Set, java.util.Map, 基本类型数组 (例如 int[], char[][], 等等), 对象数组 (例如String[], Integer[][]等等,但不支持上述类型的子类型。对于字符串,会提供空字符串;对于各种集合、Map和数组,提供不包含任何元素的空集合、空Map和空数组。
  • @NullAndEmptySource
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值