Junit 多函数参数化测试详解

1 篇文章 0 订阅

Junit 参数化测试的五个步骤

(1)为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized

(2)为测试类声明几个变量,分别用于存放期望值和测试所用数据

(3)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值

(4)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对

(5)编写测试方法,使用定义的变量作为参数进行测试

代码示例

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }
}


// 测试类指定特殊的运行器 org.junit.runners.Parameterized
// 表示该类将不使用 Junit 内建的运行器运行,而使用参数化运行器运行
@RunWith(Parameterized.class)
public class CalculatorTest {

    // 为测试类声明几个变量,分别用于存放期望值和测试所用数据
    private int a;
    private int b;
    private int expected;
    private Calculator calculator;

    @Before
    public void setUp() {
        calculator = new Calculator();
    }

    // 为测试类声明一个带有参数的公共构造函数,并在其中为变量赋值
    public CalculatorTest(int a, int b, int expected) {
        this.a = a;
        this.b = b;
        this.expected = expected;
    }

    // 为测试类声明一个使用注解,org.junit.runners.Parameterized.Parameters 修饰的,返回值为
    // java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对
    @Parameters
    public static Collection<Integer[]> prepareData() {
        Integer[][] object = {{2, 1, 3}, {-3, -1, -4}, {5, 0, 5}};
        return Arrays.asList(object);
    }

    // 编写测试方法,使用定义的变量作为参数进行测试。
    @Test
    public void testAdd() {
        // 注意是调用的成员变量
        assertEquals(this.expected, calculator.add(a, b));
    }
}

Junit Rule

如果需要检测测试方法是否正确返回异常,或者必须在要求的时间内返回,可以使用 Junit 提供的 Rule:

Verifier: 验证测试执行结果的正确性
ErrorCollector: 收集测试方法中出现的错误信息,测试不会中断,如果有错误发生测试结束后会标记失败
ExpectedException: 提供灵活的异常验证功能
Timeout: 用于测试超时的 Rule
ExternalResource: 外部资源管理
TemporaryFolder: 在 Junit 的测试执行前后,创建和删除新的临时目录
TestWatcher: 监视测试方法生命周期的各个阶段
TestName: 在测试方法执行过程中提供获取测试名字的能力

如果需要检查返回的异常,可参考如下代码:

@Test(expected = CalculateExeption.class)
public void testAddExeption() throws CalculateExeption {
    assertEquals(this.expected, calculator.add(a, b));
}

多函数参数化测试

默认的 Junit 参数化测试对多个函数同时测试不大友好,我们可以通过变通的方法达到目的,代码如下:

public class Calculator {

    public int add(int a, int b) {
        return a + b;
    }

    public int minus(int a, int b) {
        return a - b;
    }
}


@RunWith(Parameterized.class)
public class CalculatorTest {
    enum Type {
        ADD, MINUS
    }

    private Type type;
    private int a;
    private int b;
    private int expected;
    private Calculator calculator;

    @Before
    public void setUp() {
        calculator = new Calculator();
    }

    public CalculatorTest(Type type, int a, int b, int expected) {
        this.type = type;
        this.a = a;
        this.b = b;
        this.expected = expected;
    }

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(
                new Object[][] {
                        {Type.ADD, 2, 1, 3},
                        {Type.ADD, 2, 1, 3},
                        {Type.ADD, 5, 0, 5},
                        {Type.MINUS, 5, 2, 3},
                        {Type.MINUS, 7, 1, 6},
                        {Type.MINUS, -3, -4, 1}});
    }

    @Test
    public void testAdd() {
        Assume.assumeTrue(type == Type.ADD);
        assertEquals(this.expected, calculator.add(a, b));
    }

    @Test
    public void testMinus() {
        Assume.assumeTrue(type == Type.MINUS);
        assertEquals(this.expected, calculator.minus(a, b));
    }
}

作者 Github : tojohnonly , 博客 : EnskDeCode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值