`
未雨绸缪
  • 浏览: 215700 次
  • 性别: 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参数化测试的使用方法

    JUnit是Java开发中最常用的单元测试框架之一,它提供了一种简单的方式来编写可重复执行的测试案例。随着软件复杂度的增加,对于某些功能模块可能需要多次使用不同的输入数据进行验证。此时,传统的JUnit测试方法就...

    单元测试说明模板

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

    单元测试之道C#版——使用NUnit(中文版)

    NUnit是.NET平台上广泛应用的一个单元测试框架,它提供了丰富的断言方法、测试 fixture、参数化测试以及测试驱动开发(TDD)的支持。通过NUnit,开发者可以编写简洁、可读性强的测试代码,确保应用程序的各个模块按照...

    LPM参数化模块库的使用

    **LPM参数化模块库的使用详解** LPM(Library Parameterized Modules)是集成电路设计中的一个重要工具,它是一种参数化的宏功能模块库。LPM的出现极大地提升了IC设计的效率,因为它允许设计师根据具体需求调整模块...

    C++单元测试简单示例

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

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

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

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

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

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

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

    有关单元测试的培训资料

    2. 持续集成(CI):通过自动化工具定期运行单元测试,确保每次代码更改后系统的健康状态。 六、最佳实践 1. 尽早编写测试:在编写代码之前或同时编写测试用例。 2. 保持测试简洁:每个测试用例专注于一个特定的...

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

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

    junit4.7单元测试

    在实际项目中,`单元测试.txt` 文件可能包含了如何在具体项目中使用 JUnit 4.7 进行单元测试的详细步骤或示例。通过阅读这个文本文件,你可以进一步了解如何在 Eclipse 中配置和执行 JUnit 测试,以及如何编写有效的...

    QTP的参数化

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

    单元测试报告模板

    这份"单元测试报告模板"提供了系统化的方法来记录和评估单元测试的过程和结果,确保软件的质量和稳定性。 首先,报告应包含产品的基本信息,如产品名称、部门、版本号、语言、开发和测试工具以及测试人员,这些信息...

    QTP自带Flight示例程序登录模块完整自动化测试

    我们可以使用QTP的参数化功能来参数化这两个参数,以便测试各种情况。例如,我们可以使用DataTable对象来存储不同的用户名和密码,然后使用这些数据来驱动测试。 在本示例中,我们使用了两个DataTable对象,一个...

    Visual Studio单元测试教程

    - 单元测试:主要针对单个类或函数,通过传递不同参数并验证返回结果来确保代码功能正确。 - Web测试:用于模拟HTTP请求,测试Web应用程序的行为和性能。 - 负载测试:通过虚拟用户模拟并发访问,评估系统在高...

    JUnit单元测试技术

    JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的正确性和稳定性。本节将深入探讨JUnit的核心概念、使用方法以及其在实际开发中的重要性。 首先,我们要理解...

    单元测试累jar包

    3. **参数化测试**:通过`@Parameters`注解,JUnit 4.10允许开发者创建参数化的测试,这意味着一个测试方法可以使用多个输入数据集进行多次执行。 4. **超时测试**:使用`@Test(timeout =毫秒数)`可以设置测试方法...

    软件测试之单元测试和自动化测试及UTF应用

    5. 对于更复杂的测试场景,可以使用参数化测试(`@ParameterizedTest`)和测试工厂(`@TestFactory`)等高级特性。 题目二:自动化测试及UTF应用 自动化测试是现代软件开发中的重要组成部分,它能显著提高测试效率...

Global site tag (gtag.js) - Google Analytics