单元测试(二)JUnit 进阶功能:assertThat、Parameterized 参数化测试、Theories 理论型测试...

本文介绍了JUnit中assertThat的使用方法,展示了如何利用Hamcrest进行更友好的断言提示,同时介绍了参数化测试和理论测试的具体应用实例。

如果你的 JUnit 仍未入门,可以查阅 https://my.oschina.net/tridays/blog/815586 来学习。

assertThat

JUnit 4.4 起引入了匹配库 Hamcrest (org.hamcrest:hamcrest-core) 的 Matcher 来进行逻辑判断,并能够输出更友好的提示。

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

// 判断字符串s是否包含"a"或包含"b"
// assertTrue(s.indexOf("a") > -1 || s.indexOf("b") > -1);
assertThat(s, anyOf(containsString("a"), containsString("b"))); 

最直观的变化是,以前的“谓、宾、主”写法,现在可以是“主、谓、宾”。

以前如果需要错误提示,需要人工提供:

assertTrue("Expected a substring 'a' or 'b'.",
    s.indexOf("a") > -1 || s.indexOf("b") > -1);

使用 assertThat 后,输出类似于:

java.lang.AssertionError: 
Expected: (a string containing "a" or a string containing "b") 
got: "zzz"

注意,JUnit 依赖的 org.hamcrest:hamcrest-core 并不是 Hamcrest 的全部,你可以下载其他库,注意不要引入冲突。

可以通过实现 Matcher 接口,定制自己的匹配符,在这之前不妨先浏览一下 Hamcrest 提供了哪些,避免重复造轮子。

参数化测试

针对需要对多组数据重复逻辑进行测试的情况,JUnit 提供了 Parameterized Runner。

import java.util.Arrays;
import java.util.Collection;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class MyTestCase {
    
    private int result;
    private int param1;
    private int param2;
    
    /**
     * 存放需要进行测试的数据集合
     */
    @Parameters
    @SuppressWarnings("rawtypes")
    public static Collection prepareData() {
        Object[][] data = {{5, 1, 4}, {-3, 1, -4}, {-5, -1, -4}};
        return Arrays.asList(data);
    }
    
    /**
     * 对变量进行初始化
     */
    public MyTestCase(int result, int param1, int param2) {
        this.result = result;
        this.param1 = param1;
        this.param2 = param2;
    }
    
    /**
     * 这里的 Caculator 是被测试类
     */
    @Test
    public void testAdd() {
        Calculator calc = new Calculator();
        calc.add(param1, param2);
        Assert.assertEquals(result, calc.getResult());
    }
}

理论测试

JUnit 也提供了 Theories Runner 以应对更复杂的情况。

import org.junit.experimental.theories.DataPoint;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory; 
import org.junit.runner.RunWith;

import org.junit.Test;

@RunWith(Theories.class)
public class MyTestCase {

    // 使用 @DataPoint 指定测试数据集
    @DataPoint
    public static String A = "a";
    @DataPoint
    public static String B = "b";
    @DataPoint
    public static String C = "c";

    // 使用 @Theory 指定被测函数
    @Theory 
    public void testNames1(String a, String b) {
        System.out.print(a + ":" + b);
    }
}

以上测试样例输出:

a:a a:b a:c b:a b:b b:c c:a c:b c:c

被测函数将把数据集的全排列的每一组值做一次测试。

转载于:https://my.oschina.net/tridays/blog/815651

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值