JUnit 5参数化测试
目录
-
设置
-
我们的第一个参数化测试
-
参数来源
-
- @ValueSource
- @NullSource & @EmptySource
- @MethodSource
- @CsvSource
- @CsvFileSource
- @EnumSource
- @ArgumentsSource
- 参数转换
- 参数聚合
-
奖励
-
总结
如果您正在阅读这篇文章,说明您已经熟悉了JUnit。让我为您概括一下JUnit——在软件开发中,我们开发人员编写的代码可能是设计一个人的个人资料这样简单,也可能是在银行系统中进行付款这样复杂。在开发这些功能时,我们倾向于编写单元测试。顾名思义,单元测试的主要目的是确保代码的小、单独部分按预期功能工作。如果单元测试执行失败,这意味着该功能无法按预期工作。编写单元测试的一种工具是JUnit。这些单元测试程序很小,但是非常强大,并且可以快速执行。如果您想了解更多关于JUnit 5(也称为JUnit Jupiter)的信息,请查看这篇JUnit5的文章。现在我们已经了解了JUnit,接下来让我们聚焦于JUnit 5中的参数化测试。参数化测试可以解决在为任何新/旧功能开发测试框架时遇到的最常见问题。
- 编写针对每个可能输入的测试用例变得更加容易。
- 单个测试用例可以接受多个输入来测试源代码,有助于减少代码重复。
- 通过使用多个输入运行单个测试用例,我们可以确信已涵盖所有可能的场景,并维护更好的代码覆盖率。
开发团队通过利用方法和类来创建可重用且松散耦合的源代码。传递给代码的参数会影响其功能。例如,计算器类中的sum方法可以处理整数和浮点数值。JUnit 5引入了执行参数化测试的能力,可以使用单个测试用例测试源代码,该测试用例可以接受不同的输入。这样可以更有效地进行测试,因为在旧版本的JUnit中,必须为每种输入类型创建单独的测试用例,从而导致大量的代码重复。
示例代码
本文附带有在 GitHub上 的一个可工作的示例代码。
设置
就像疯狂泰坦灭霸喜欢访问力量一样,您可以使用以下Maven依赖项来访问JUnit5中参数化测试的力量:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
复制代码
让我们来写些代码,好吗?
我们的第一个参数化测试
现在,我想向您介绍一个新的注解 @ParameterizedTest。顾名思义,它告诉JUnit引擎使用不同的输入值运行此测试。
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class ValueSourceTest {
@ParameterizedTest
@ValueSource(ints = { 2, 4 })
void checkEvenNumber(int number) {
assertEquals(0, number % 2,
"Supplied number is not an even number");
}
}
复制代码
在上面的示例中,注解@ValueSource为 checkEvenNumber() 方法提供了多个输入。假设我们使用JUnit4编写相同的代码,即使它们的结果(断言)完全相同,我们也必须编写2个测试用例来覆盖输入2和4。
当我们执行 ValueSourceTest 时,我们会看到什么:
ValueSourceTest
|_ checkEvenNumber
|_ [1] 2
|_ [2] 4
这意味着 checkEvenNumber() 方法将使用2个输入值执行。
在下一节中,让我们学习一下JUnit5框架提供的各种参数来源。
参数来源
JUnit5提供了许多参数来源注释。下面的章节将简要概述其中一些注释并提供示例。
@ValueSource
@ValueSource是一个简单的参数源,可以接受单个字面值数组。@ValueSource支持的字面值类型有short、byte、int、long、float、double、char、boolean、String和Class。
@ParameterizedTest
@ValueSource(strings = { "a1", "b2" })
void checkAlp