`
未雨绸缪
  • 浏览: 213469 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

使用JUnitParams做参数化单元测试

阅读更多

在单元测试中,如果测试方法相同,要测试不同的输入参数和输出结果时,通常会有冗余的代码。参数化单元测试的组件,应用在这种场景下。

 

从JUnit4已经开始支持参数化测试
在测试类上追加@RunWith,指明使用JUnit的Parameterized运行器来运行测试。

在提供数据的方法上追加@Parameterized.Parameters,方法必须是静态static的,并且返回一个集合Collection。

代码如下:

@RunWith(Parameterized.class)
public class CalculatorTest {

    @Parameterized.Parameters
    public static Collection data()
    {
        return Arrays.asList(new Object[][]{{0, 0, 0}, {1, 1, 2}, {2, 1, 3}});
    }

    private int testOpt1;
    private int testOpt2;
    private int testResult;
    private Calculator calculator;
    public CalculatorTest(int testOpt1, int testOpt2, int testResult)
    {
        this.testOpt1 = testOpt1;
        this.testOpt2 = testOpt2;
        this.testResult = testResult;
    }

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

    @Test
    public void testAdd() throws Exception {
        int actualResult = calculator.add(testOpt1, testOpt2);
        assertEquals(testResult, actualResult);
    }
}


再看一下用JUnitParams组建,同样的UT用例的代码量:

@RunWith(JUnitParamsRunner.class)
public class CalculatorTestWithJUnitParams {

    private Calculator calculator;

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

    private Object addTestData() {
        return new Object[]{
                new Object[]{0, 0, 0},
                new Object[]{1, 1, 2},
                new Object[]{2, 1, 3}
        };
    }

    @Test
    @Parameters(method = "addTestData")
    public void testAdd(int testOpt1, int testOpt2, int testResult) throws Exception {
        int actualResult = calculator.add(testOpt1, testOpt2);
        assertEquals(testResult, actualResult);
    }
}



两段代码对比显而易见:
不用通过构造器传递测试参数,用在方法前注解参数内容即可(使用Parameters注解)
测试用例可以指定任意的数据提供方法(使用Parameters里的method)

更简洁的方式:

@RunWith(JUnitParamsRunner.class)
public class CalculatorTestWithJUnitParams {
    
    private Calculator calculator;

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

    @Test
    @Parameters({"0, 0, 0", "1, 1, 2", "2, 1, 3"})
    public void testAdd(int testOpt1, int testOpt2, int testResult) throws Exception {
        int actualResult = calculator.add(testOpt1, testOpt2);
        assertEquals(testResult, actualResult);
    }
}


通过引入import static junitparams.JUnitParamsRunner.$,数据提供方法还可以简化为:

private Object addTestData() {
        return $(
                $(0, 0, 0),
                $(1, 1, 2),
                $(2, 1, 3)
        };
    }

上面的这些措施 大大简化了测试用例中的重复代码。

 

maven:

<dependency>
    <groupId>pl.pragmatists</groupId>
    <artifactId>JUnitParams</artifactId>
    <version>1.0.4</version>
    <scope>test</scope>
</dependency>

 

更高级的使用场景,可以参考:

JUnitParams例子:

https://github.com/Pragmatists/JUnitParams/blob/master/src/test/java/junitparams/usage/Samples_of_Usage_Test.java

 

 

分享到:
评论
1 楼 未雨绸缪 2015-06-30  
其他介绍文档:
http://pragmatists.pl/blog/2015/01/junitparams-1-0-4-released/
http://www.javacodegeeks.com/2013/12/parameterized-junit-tests-with-junitparams.html

相关推荐

Global site tag (gtag.js) - Google Analytics