文档章节

深入探索:单元测试之Parameterized tests

灯-塔
 灯-塔
发布于 2017/09/12 00:15
字数 666
阅读 18
收藏 0

相关文章

JUnit 常用的runner 之一 Parameterized 能实现参数化测试。运行参数化测试类时,将为测试方法和测试数据元素的交叉产品创建实例。

举个例子,测试斐波那契 函数,我们可以这样写:

import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
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 FibonacciTest {
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {     
                 { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }  
           });
    }

    private int fInput;
    private int fExpected;
    public FibonacciTest(int input, int expected) {
        fInput= input;
        fExpected= expected;
    }

    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}

下面是需要被测试的斐波那契函数:

public class Fibonacci {
    public static int compute(int n) {
    	int result = 0;
    	
        if (n <= 1) { 
        	result = n; 
        } else { 
        	result = compute(n - 1) + compute(n - 2); 
        }
        
        return result;
    }
}

这里每一个斐波那契实例 都会通过含有 @Parameters 注解方法来创建,构造函数的入参值。

使用 @Parameter 注解作用域替代 构造函数。

import static org.junit.Assert.assertEquals;

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

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

@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {
                 { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }  
           });
    }

    @Parameter // first data value (0) is default
    public /* NOT private */ int fInput;

    @Parameter(1)
    public /* NOT private */ int fExpected;

    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}

public class Fibonacci {
    ...
}

测试单个参数

注意: 从JUnit4.12-beta-3 开始被引入.

如果你只是需要单个参数,你就不需要使用任何数组来包裹参数对象。

@Parameters
public static Iterable<? extends Object> data() {
    return Arrays.asList("first test", "second test");
}

或者

@Parameters
public static Object[] data() {
    return new Object[] { "first test", "second test" };
}

识别单个测试用例

举例子

import static org.junit.Assert.assertEquals;

import java.util.Arrays;

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 FibonacciTest {

    @Parameters(name = "{index}: fib({0})={1}")
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][] { 
                 { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 }
           });
    }

    private int input;
    private int expected;

    public FibonacciTest(int input, int expected) {
        this.input = input;
        this.expected = expected;
    }

    @Test
    public void test() {
        assertEquals(expected, Fibonacci.compute(input));
    }
}

public class Fibonacci {
    ...
}

IDE Bug (Eclipse)

如果你使用 name 注解参数,

参照

As an alternative to parameterized tests you can also use the plugin JUnitParams If you want to define the parameters for your tests at the tests' Suite, you can use the ParameterizedSuite runner that is available in a separate library.

© 著作权归作者所有

共有 人打赏支持
灯-塔
粉丝 4
博文 39
码字总数 63914
作品 0
广州
程序员
私信 提问
Junit--参数化测试

为保证单元测试的严谨性,我们模拟了不同的情况来测试方法,为此写了大量的单元测试方法。但是这些方法都差不多只是参数和期望值不同,现在使用Junit的参数化测试能很好的应对这个问题 参数化...

Canaan_
2016/08/27
9
0
Feed4TestNG 1.0 发布

Feed4TestNG 使得可以编写参数化的 TestNG 测试用例。 示例代码: public class LoginTest extends FeedTest { @Test(dataProvider = "feeder") @Source("userlogin.csv") public void test......

红薯
2011/09/17
1K
0
Robolectric 探索之路

layout: post title: Roboletric探索之路,从抗拒到依赖 description: Roboletric Android Unit Testing category: blog --- 我为什么以前抗拒Android Unit Testing 1、懒,人类最大的天敌;...

ice_Anson
2016/03/16
129
0
使用Google Test的一个简单例子

本博客http://blog.csdn.net/livelylittlefish 贴出作者(三二一@小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正! 0. 引子 本例是从 gtest-1.5.0 自带的 sample 中的 sample1 改写而...

晨曦之光
2012/03/09
596
0
Maven结合SonarQube的使用笔记

前提:1,SonarQube已经安装好且已经安装了sonar-php-plugin,并且在测试服务器上也安装并配置好了sonar-scanner2,安装了Maven这个非常简单,直接从官网上下载Maven的zip包,解开然后配置下...

Kevin6188
2016/08/02
750
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 温柔的人应该这样

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @clouddyy :#每日一歌# 《フィクション-sumika》 《フィクション-sumika》 手机党少年们想听歌,请使劲儿戳(这里) 假期时间干嘛去, @for...

小小编辑
44分钟前
14
4
[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

描述 设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。 如何反序列化或序列化二叉树是没有限制的,你...

honeymose
今天
6
0
java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
28
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
19
0
my.ini

1

architect刘源源
今天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部