`
未雨绸缪
  • 浏览: 217152 次
  • 性别: 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的核心理念是通过定义断言...

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

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

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

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

    单元测试与集成测试

    单元测试的自动化是提高效率的关键,涉及测试环境的构建与测试结果的分析: 1. **测试环境的建立**:通过程序分析识别模块依赖,自动设置输入值,或者从现有程序中抽取模块的运行环境,以构建多样化的测试场景。 2....

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

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

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

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

    单元测试(Junit,selenium)

    JUnit是一种广泛使用的Java单元测试框架。它最初由Kent Beck和Erich Gamma开发,目的是简化Java应用程序的单元测试过程。目前,JUnit已经发展到JUnit 5版本,每个版本都提供了更为强大的功能和支持。 ##### 2.1 ...

    单元测试用例设计例子

    "单元测试用例设计例如GetWordFromStr函数" 单元测试是软件测试中的一种重要方法,它可以帮助我们检测软件中单个模块或函数的正确性。在单元测试中,设计测试用例是非常重要的一步,这样可以确保我们的测试用例是...

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

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

    loadrunner脚本参数化

    2. 提高测试代码的可重用性:参数化后,测试代码可以在不同的测试场景中重复使用。 3. 降低测试成本:参数化可以减少测试数据的准备和维护成本。 LoadRunner 脚本参数化的步骤: 1. 打开脚本,找到需要参数化的...

    目前最好的Unity 单元测试框架

    在使用NUnit进行Unity单元测试时,我们通常会遵循以下步骤: 1. **安装NUnit**:在Unity项目中,可以通过NuGet包管理器或直接下载NUnit的DLL文件引入。确保版本与Unity版本兼容。 2. **创建测试类和测试方法**:在...

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

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

    gtest单元测试框架

    总的来说,`gtest`是一个强大的单元测试工具,它提供了全面的测试支持,包括基本断言、测试组织、参数化测试以及命令行控制。通过学习和使用`gtest`,开发者不仅可以确保代码的质量,还能更好地遵循TDD(测试驱动...

    单元测试之道Java版使用JUnit

    在Java编程中,JUnit是一个广泛使用的开源测试框架,专为Java应用程序设计,它提供了丰富的API和工具,使得编写和执行单元测试变得简单、高效。本篇文章将深入探讨JUnit在Java单元测试中的应用和相关知识点。 首先...

Global site tag (gtag.js) - Google Analytics