在单元测试中,如果测试方法相同,要测试不同的输入参数和输出结果时,通常会有冗余的代码。参数化单元测试的组件,应用在这种场景下。
从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是Java开发中最常用的单元测试框架之一,它提供了一种简单的方式来编写可重复执行的测试案例。随着软件复杂度的增加,对于某些功能模块可能需要多次使用不同的输入数据进行验证。此时,传统的JUnit测试方法就...
在单元测试设计中,我们将使用JUnit测试套件来进行批量测试,并且使用参数化测试功能来确保测试的可靠性和效率。在测试模型设计中,我们将使用测试组网图和操作流程来描述测试的过程和步骤。 在单元测试规格中,...
NUnit是.NET平台上广泛应用的一个单元测试框架,它提供了丰富的断言方法、测试 fixture、参数化测试以及测试驱动开发(TDD)的支持。通过NUnit,开发者可以编写简洁、可读性强的测试代码,确保应用程序的各个模块按照...
**LPM参数化模块库的使用详解** LPM(Library Parameterized Modules)是集成电路设计中的一个重要工具,它是一种参数化的宏功能模块库。LPM的出现极大地提升了IC设计的效率,因为它允许设计师根据具体需求调整模块...
Google Test 提供了一套易于理解和使用的API,使得编写和运行单元测试变得简单。 1. **安装与配置Google Test**: 在项目中集成Google Test,你需要下载其源码并将其库添加到项目的依赖中。通常,你可以通过CMake...
单元测试方法是指使用Testbed工具对软件进行单元测试的方法。该方法包括以下几个步骤: ### 3.1 选择文件及头文件配置 在进行单元测试之前,需要选择要测试的文件和头文件,并进行配置。头文件路径是指头文件的...
Parasoft C++ Test 是 Parasoft 公司出品的一个针对 C/C++源代码进行自动化单元测试的工具。这个工具可以对源代码进行三种测试:白盒测试、黑盒测试和回归测试。 白盒测试是对 C/C++源代码进行分析,针对所有的类...
本文将深入探讨"敏捷自动化测试-Java-黑盒单元测试"这一主题,涵盖相关的重要知识点。 首先,我们要理解什么是敏捷自动化测试。敏捷开发是一种强调快速响应变化、迭代开发和团队协作的软件开发方法论。自动化测试在...
2. 持续集成(CI):通过自动化工具定期运行单元测试,确保每次代码更改后系统的健康状态。 六、最佳实践 1. 尽早编写测试:在编写代码之前或同时编写测试用例。 2. 保持测试简洁:每个测试用例专注于一个特定的...
gtest除了基本的测试用例编写外,还支持断言、事件机制、参数化测试、死亡测试、运行参数以及如何深入解析gtest和打造自己的单元测试框架。这些高级特性扩展了gtest的功能,使得开发者可以更加方便地编写测试用例,...
在实际项目中,`单元测试.txt` 文件可能包含了如何在具体项目中使用 JUnit 4.7 进行单元测试的详细步骤或示例。通过阅读这个文本文件,你可以进一步了解如何在 Eclipse 中配置和执行 JUnit 测试,以及如何编写有效的...
QTP参数化是指在QTP脚本中使用参数的方式来实现自动化测试的灵活性和可重用性。参数化可以让测试脚本变得更加灵活和通用,从而提高测试效率和覆盖率。本文将详细介绍QTP参数化的三种常用方法:DataTable方法、环境...
这份"单元测试报告模板"提供了系统化的方法来记录和评估单元测试的过程和结果,确保软件的质量和稳定性。 首先,报告应包含产品的基本信息,如产品名称、部门、版本号、语言、开发和测试工具以及测试人员,这些信息...
我们可以使用QTP的参数化功能来参数化这两个参数,以便测试各种情况。例如,我们可以使用DataTable对象来存储不同的用户名和密码,然后使用这些数据来驱动测试。 在本示例中,我们使用了两个DataTable对象,一个...
- 单元测试:主要针对单个类或函数,通过传递不同参数并验证返回结果来确保代码功能正确。 - Web测试:用于模拟HTTP请求,测试Web应用程序的行为和性能。 - 负载测试:通过虚拟用户模拟并发访问,评估系统在高...
JUnit是Java编程语言中最常用的单元测试框架之一,它允许开发者编写可重复运行的测试用例,以确保代码的正确性和稳定性。本节将深入探讨JUnit的核心概念、使用方法以及其在实际开发中的重要性。 首先,我们要理解...
3. **参数化测试**:通过`@Parameters`注解,JUnit 4.10允许开发者创建参数化的测试,这意味着一个测试方法可以使用多个输入数据集进行多次执行。 4. **超时测试**:使用`@Test(timeout =毫秒数)`可以设置测试方法...
5. 对于更复杂的测试场景,可以使用参数化测试(`@ParameterizedTest`)和测试工厂(`@TestFactory`)等高级特性。 题目二:自动化测试及UTF应用 自动化测试是现代软件开发中的重要组成部分,它能显著提高测试效率...