`
未雨绸缪
  • 浏览: 216611 次
  • 性别: 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

相关推荐

    单元测试说明模板

    在单元测试设计中,我们将使用JUnit测试套件来进行批量测试,并且使用参数化测试功能来确保测试的可靠性和效率。在测试模型设计中,我们将使用测试组网图和操作流程来描述测试的过程和步骤。 在单元测试规格中,...

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...

    单元测试理论,介绍单元测试过程

    ### 单元测试理论与实践 #### 一、单元测试的概念与目的 单元测试是对软件基本组成单元进行的测试,其主要目标在于发现各模块内部可能存在的各种错误。这些错误通常包括但不限于设计缺陷、需求理解偏差以及编码...

    单元测试代码以及junit使用介绍

    JUnit是一款广泛使用的Java编程语言的单元测试框架,它为开发者提供了创建和执行测试用例的简便方法。这篇介绍将深入探讨单元测试的概念、JUnit的基本使用以及如何利用它来提高代码质量。 单元测试是对程序中最小可...

    单元测试框架深入与分享

    单元测试框架深入与分享 在软件开发中,单元测试是保证代码质量的重要步骤。单元测试框架是实现单元测试的基础设施,...使用适当的单元测试框架和Mock框架,可以提高代码的质量和可靠性,并减少软件测试的时间和成本。

    junit单元测试jar包集

    **JUnit** 是Java领域中最广泛使用的单元测试框架,这里的`junit-4.11.jar`是它的4.11版本。JUnit提供了编写和运行可重复的测试用例的API。它支持注解(如@Test)来标记测试方法,断言(如assertEquals)来验证结果...

    google test 单元测试框架

    谷歌的gtest单元测试框架是一个广泛使用的开源工具,尤其在跨平台的软件开发中扮演着重要角色。这个框架为C++编程语言提供了强大的测试能力,帮助开发者确保代码的正确性和可靠性。gtest的核心理念是通过定义断言...

    Testbed工具手册—单元测试方法V1.0.doc

    单元测试方法是指使用Testbed工具对软件进行单元测试的方法。该方法包括以下几个步骤: ### 3.1 选择文件及头文件配置 在进行单元测试之前,需要选择要测试的文件和头文件,并进行配置。头文件路径是指头文件的...

    C++单元测试简单示例

    Google Test 提供了一套易于理解和使用的API,使得编写和运行单元测试变得简单。 1. **安装与配置Google Test**: 在项目中集成Google Test,你需要下载其源码并将其库添加到项目的依赖中。通常,你可以通过CMake...

    java程序员白盒单元测试必备技能 -- Junit4

    通过深入学习和实践这个"Junit4教程.doc"文档,开发者可以掌握如何有效地使用Junit4进行单元测试,提高代码的健壮性和可维护性。同时,了解单元测试的原理和最佳实践,也有助于提升编程能力,成为一名更专业的Java...

    单元测试之道Java版-使用JUnit

    《单元测试之道Java版-使用JUnit》是一本深入讲解如何在Java开发中运用JUnit进行单元测试的专业指南。单元测试是软件开发过程中的重要环节,它能够确保代码的正确性、可维护性和稳定性。JUnit作为Java领域最流行的...

    单元测试工具 C++单元测试工具 静态代码分析 代码动态测试

    Parasoft C++ Test 是 Parasoft 公司出品的一个针对 C/C++源代码进行自动化单元测试的工具。这个工具可以对源代码进行三种测试:白盒测试、黑盒测试和回归测试。 白盒测试是对 C/C++源代码进行分析,针对所有的类...

    敏捷自动化测试-Java-黑盒单元测试

    本文将深入探讨"敏捷自动化测试-Java-黑盒单元测试"这一主题,涵盖相关的重要知识点。 首先,我们要理解什么是敏捷自动化测试。敏捷开发是一种强调快速响应变化、迭代开发和团队协作的软件开发方法论。自动化测试在...

    Postman:高级功能:数据文件与参数化测试详解

    通过具体示例,帮助读者掌握如何在 Postman中有效使用数据文件和参数化测试,提高 API测试的覆盖率和效率。 适合人群:具备基本 API测试经验的测试工程师和开发人员,希望通过参数化测试提升 API测试质量和效率的...

    自动化测试 python测试 pytest 单元测试

    在Python中,使用pytest进行单元测试时,通常会为每个功能编写一个测试函数,这个函数通常以`test_`开头,以便pytest自动发现并运行。例如: ```python def inc(x): return x + 1 def test_answer(): assert inc...

    玩转Google开源C++单元测试框架Google Test系列.pdf

    gtest除了基本的测试用例编写外,还支持断言、事件机制、参数化测试、死亡测试、运行参数以及如何深入解析gtest和打造自己的单元测试框架。这些高级特性扩展了gtest的功能,使得开发者可以更加方便地编写测试用例,...

    C++单元测试、压力测试、快速测试工具

    在IT行业中,单元测试、压力测试和快速测试是软件开发过程中的重要环节,尤其是在使用C++这样的编程语言时。这些测试方法确保了代码的质量、稳定性和性能,为开发者提供了信心,保证了软件产品的可靠性。本篇文章将...

    QTP的参数化

    QTP参数化是指在QTP脚本中使用参数的方式来实现自动化测试的灵活性和可重用性。参数化可以让测试脚本变得更加灵活和通用,从而提高测试效率和覆盖率。本文将详细介绍QTP参数化的三种常用方法:DataTable方法、环境...

Global site tag (gtag.js) - Google Analytics