在单元测试中,如果测试方法相同,要测试不同的输入参数和输出结果时,通常会有冗余的代码。参数化单元测试的组件,应用在这种场景下。
从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
相关推荐
在单元测试设计中,我们将使用JUnit测试套件来进行批量测试,并且使用参数化测试功能来确保测试的可靠性和效率。在测试模型设计中,我们将使用测试组网图和操作流程来描述测试的过程和步骤。 在单元测试规格中,...
在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...
### 单元测试理论与实践 #### 一、单元测试的概念与目的 单元测试是对软件基本组成单元进行的测试,其主要目标在于发现各模块内部可能存在的各种错误。这些错误通常包括但不限于设计缺陷、需求理解偏差以及编码...
JUnit是一款广泛使用的Java编程语言的单元测试框架,它为开发者提供了创建和执行测试用例的简便方法。这篇介绍将深入探讨单元测试的概念、JUnit的基本使用以及如何利用它来提高代码质量。 单元测试是对程序中最小可...
单元测试框架深入与分享 在软件开发中,单元测试是保证代码质量的重要步骤。单元测试框架是实现单元测试的基础设施,...使用适当的单元测试框架和Mock框架,可以提高代码的质量和可靠性,并减少软件测试的时间和成本。
**JUnit** 是Java领域中最广泛使用的单元测试框架,这里的`junit-4.11.jar`是它的4.11版本。JUnit提供了编写和运行可重复的测试用例的API。它支持注解(如@Test)来标记测试方法,断言(如assertEquals)来验证结果...
谷歌的gtest单元测试框架是一个广泛使用的开源工具,尤其在跨平台的软件开发中扮演着重要角色。这个框架为C++编程语言提供了强大的测试能力,帮助开发者确保代码的正确性和可靠性。gtest的核心理念是通过定义断言...
通过深入学习和实践这个"Junit4教程.doc"文档,开发者可以掌握如何有效地使用Junit4进行单元测试,提高代码的健壮性和可维护性。同时,了解单元测试的原理和最佳实践,也有助于提升编程能力,成为一名更专业的Java...
《单元测试之道Java版-使用JUnit》是一本深入讲解如何在Java开发中运用JUnit进行单元测试的专业指南。单元测试是软件开发过程中的重要环节,它能够确保代码的正确性、可维护性和稳定性。JUnit作为Java领域最流行的...
单元测试的自动化是提高效率的关键,涉及测试环境的构建与测试结果的分析: 1. **测试环境的建立**:通过程序分析识别模块依赖,自动设置输入值,或者从现有程序中抽取模块的运行环境,以构建多样化的测试场景。 2....
Parasoft C++ Test 是 Parasoft 公司出品的一个针对 C/C++源代码进行自动化单元测试的工具。这个工具可以对源代码进行三种测试:白盒测试、黑盒测试和回归测试。 白盒测试是对 C/C++源代码进行分析,针对所有的类...
本文将深入探讨"敏捷自动化测试-Java-黑盒单元测试"这一主题,涵盖相关的重要知识点。 首先,我们要理解什么是敏捷自动化测试。敏捷开发是一种强调快速响应变化、迭代开发和团队协作的软件开发方法论。自动化测试在...
JUnit是一种广泛使用的Java单元测试框架。它最初由Kent Beck和Erich Gamma开发,目的是简化Java应用程序的单元测试过程。目前,JUnit已经发展到JUnit 5版本,每个版本都提供了更为强大的功能和支持。 ##### 2.1 ...
"单元测试用例设计例如GetWordFromStr函数" 单元测试是软件测试中的一种重要方法,它可以帮助我们检测软件中单个模块或函数的正确性。在单元测试中,设计测试用例是非常重要的一步,这样可以确保我们的测试用例是...
在Python中,使用pytest进行单元测试时,通常会为每个功能编写一个测试函数,这个函数通常以`test_`开头,以便pytest自动发现并运行。例如: ```python def inc(x): return x + 1 def test_answer(): assert inc...
2. 提高测试代码的可重用性:参数化后,测试代码可以在不同的测试场景中重复使用。 3. 降低测试成本:参数化可以减少测试数据的准备和维护成本。 LoadRunner 脚本参数化的步骤: 1. 打开脚本,找到需要参数化的...
在使用NUnit进行Unity单元测试时,我们通常会遵循以下步骤: 1. **安装NUnit**:在Unity项目中,可以通过NuGet包管理器或直接下载NUnit的DLL文件引入。确保版本与Unity版本兼容。 2. **创建测试类和测试方法**:在...
gtest除了基本的测试用例编写外,还支持断言、事件机制、参数化测试、死亡测试、运行参数以及如何深入解析gtest和打造自己的单元测试框架。这些高级特性扩展了gtest的功能,使得开发者可以更加方便地编写测试用例,...
总的来说,`gtest`是一个强大的单元测试工具,它提供了全面的测试支持,包括基本断言、测试组织、参数化测试以及命令行控制。通过学习和使用`gtest`,开发者不仅可以确保代码的质量,还能更好地遵循TDD(测试驱动...
在Java编程中,JUnit是一个广泛使用的开源测试框架,专为Java应用程序设计,它提供了丰富的API和工具,使得编写和执行单元测试变得简单、高效。本篇文章将深入探讨JUnit在Java单元测试中的应用和相关知识点。 首先...