JUnit 5 参数化测试:零基础教程
大家好!作为一名资深 Java 工程师,我很高兴能为你们介绍 JUnit 5 的参数化测试。在本教程中,我将以轻松幽默的语气,适当使用一些比喻,带你了解
JUnit 5 参数化测试的种类、应用场景、入门案例和注意事项。现在,让我们开始吧!
一、参数化测试简介
在很多情况下,我们需要对同一个测试方法使用不同的输入参数进行多次测试。这时候,我们可以使用 JUnit 5
的参数化测试功能。参数化测试允许我们用一组预先定义的参数来自动运行测试方法,就像是把一个个不同口味的薯片放进一个自动贩卖机,然后观察它们的销售情况一样。
JUnit 5 提供了多种参数化测试的方式,接下来我们将逐一介绍。
二、参数化测试的种类
1. @ValueSource
@ValueSource
是参数化测试的最简单形式。它允许你为测试方法提供一组简单的值,就像是一份精选的薯片口味列表。
应用场景 :适用于测试方法只有一个参数,而且这个参数的类型为简单类型(如 int、long、double、float、boolean、String)。
入门案例 :
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
class ValueSourceExampleTest {
@ParameterizedTest
@ValueSource(strings = {"apple", "banana", "orange"})
void testFruitNames(String fruitName) {
assertNotNull(fruitName);
}
}
注意事项 :测试方法的参数列表中的参数类型必须与 @ValueSource
中的类型相匹配。例如,如果你使用 @ValueSource(ints = {...})
,那么测试方法的参数类型必须是 int
或 Integer
。
2. @EnumSource
@EnumSource
是针对枚举类型的参数化测试。它允许你为测试方法提供一个枚举类型的值集合,就像是为不同口味的薯片定义了一个标准分类。
应用场景 :适用于测试方法只有一个参数,而且这个参数的类型为枚举类型。
入门案例 :
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
enum Size {
SMALL, MEDIUM, LARGE
}
class EnumSourceExampleTest {
@ParameterizedTest
@EnumSource(Size.class)
void testSizes(Size size) {
assertNotNull(size);
}
}
注意事项 :测试方法的参数列表中的参数类型必须与 @EnumSource
中指定的枚举类型相匹配。
@CsvSource
和 @CsvFileSource
@CsvSource
和 @CsvFileSource
是基于 CSV 格式的参数化测试。它们允许你为测试方法提供一组 CSV 格式的值,就像是一张详细的薯片销售报表。
应用场景 :适用于测试方法有多个参数,需要以 CSV 格式提供输入数据。
入门案例 :
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
class CsvSourceExampleTest {
@ParameterizedTest
@CsvSource({"1, 2, 3", "4, 5, 9", "6, 7, 13"})
void testAddition(int a, int b, int expectedSum) {
assertEquals(expectedSum, a + b);
}
}
对于 @CsvFileSource
,你需要将 CSV 数据存储在一个文件中,并通过 resources
属性指定文件路径。
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
class CsvFileSourceExampleTest {
@ParameterizedTest
@CsvFileSource(resources = "/addition.csv")
void testAddition(int a, int b, int expectedSum) {
assertEquals(expectedSum, a + b);
}
}
注意事项 :确保 CSV 数据与测试方法的参数类型和数量相匹配。对于 @CsvFileSource
,文件应该放在项目的资源文件夹中。
4. @MethodSource
@MethodSource
是基于方法返回值的参数化测试。它允许你为测试方法提供一个方法的返回值作为参数,就像是一个智能贩卖机,根据顾客的喜好自动调整薯片口味。
应用场景 :适用于测试方法有多个参数,需要从方法返回值中获取输入数据。
入门案例 :
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import java.util.stream.Stream;
class MethodSourceExampleTest {
@ParameterizedTest
@MethodSource("provideStrings")
void testStringLength(String input, int expectedLength) {
assertEquals(expectedLength, input.length());
}
static Stream<Arguments> provideStrings() {
return Stream.of(
Arguments.of("apple", 5),
Arguments.of("banana", 6),
Arguments.of("orange", 6)
);
}
}
注意事项 :确保提供方法的返回值与测试方法的参数类型和数量相匹配。提供方法必须是静态方法,且无需参数。
三、总结
本文介绍了 JUnit 5 参数化测试的四种类型:@ValueSource
、@EnumSource
、@CsvSource
/@CsvFileSource
和 @MethodSource
。希望你能够根据自己的需求选择合适的参数化测试方式,并在你的 Java 项目中轻松愉快地实现参数化测试。祝你学习愉快!