通過使用參數化測試,可以在多個測試用例之間重用單個測試設定,這將能夠減少程式碼並輕鬆驗證多個測試用例,無需為每個測試用例,建立單獨的測試方法,採用單元測試來驗證產出結果。
Table of Contents
ToggleJUnit 5 ParameterizedTest
檔案目錄
./
+- build.gradle
+- test
| +- org
| +- ruoxue
| +- spring_boot_168
| +- test
| +- junit5
| +- csvFileWorld.csv
| +- JUnit5ParameterizedTest.java
Gradle
build.gradle
增加 JUnit Jupiter Params 。
plugins 增加 Spring Boot 、Dependency Management 。
修改完後,點右鍵,Gradle -> Refresh Gradle Project 。
buildscript {
group 'org.ruoxue.spring-boot-168'
version = '0.0.1-SNAPSHOT'
ext {
springBootVersion = '2.1.7.RELEASE'
junit5Version = '5.7.2'
junitPlatformVersion = '1.7.2'
}
}
plugins {
id 'java-library'
id 'eclipse'
}
dependencies {
testImplementation ("org.springframework.boot:spring-boot-starter-test:${springBootVersion}") {
exclude group: 'junit', module: 'junit'
}
testImplementation "org.junit.jupiter:junit-jupiter-api:${junit5Version}"
testImplementation "org.junit.jupiter:junit-jupiter-params:${junit5Version}"
testRuntimeOnly "org.junit.platform:junit-platform-commons:${junitPlatformVersion}"
testRuntimeOnly "org.junit.platform:junit-platform-engine:${junitPlatformVersion}"
testRuntimeOnly "org.junit.platform:junit-platform-launcher:${junitPlatformVersion}"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junit5Version}"
testRuntimeOnly "org.junit.vintage:junit-vintage-engine:${junit5Version}"
}
test {
useJUnitPlatform()
}
註解說明
提供多樣化的註解宣告。
Annotations | Description |
---|---|
@ParameterizedTest | 參數化測試。 |
@ValueSource | 傳入參數陣列。 |
@EnumSource | 列舉參數。 |
@MethodSource | 方法參數。 |
@CsvSource | CSV 參數。 |
@CsvFileSource | CSV 檔案參數。 |
單元測試
JUnit 5 ValueSource
建立一個簡單的測試服務,可以輸入基本型別、字串或類別參數陣列,對其進行驗證。
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
public void numberWorld(int value) {
System.out.println(value);
assertTrue(value > 0);
}
1
2
3
@ParameterizedTest
@ValueSource(strings = { "Java", "Groovy", "Kotlin" })
public void langWorld(String value) {
System.out.println(value);
assertTrue(value.length() > 0);
}
Java
Groovy
Kotlin
JUnit 5 EnumSource
列舉型別參數輸入,可排除指定值。
enum Status {
A, B, C
}
@ParameterizedTest
@EnumSource(value = Status.class, names = { "A", "B", "C" })
public void enumWorld(Status status) {
System.out.println(status);
assertNotNull(status);
}
A
B
C
@ParameterizedTest
@EnumSource(value = Status.class, mode = Mode.EXCLUDE, names = { "A" })
public void enumExclueWorld(Status status) {
System.out.println(status);
assertNotNull(status);
}
B
C
JUnit 5 MethodSource
使用靜態方法,參數輸入。
static Stream<String> stringProvider() {
return Stream.of("Java", "Groovy");
}
@ParameterizedTest
@MethodSource("stringProvider")
public void methodWorld(String value) {
System.out.println(value);
assertTrue(value.length() > 0);
}
Java
Groovy
static IntStream intProvider() {
return IntStream.range(1, 3);
}
@ParameterizedTest
@MethodSource("intProvider")
public void methodIntWorld(int value) {
System.out.println(value);
assertTrue(value > 0);
}
1
2
3
JUnit 5 CsvSource
CSV 格式參數輸入。
@ParameterizedTest
@CsvSource({ "Java, 4", "Groovy, 6", "Kotlin, 6" })
public void csvWorld(String value, int length) {
System.out.println(value + ", " + length);
assertTrue(value.length() > 0);
assertTrue(length > 0);
}
Java, 4
Groovy, 6
Kotlin, 6
JUnit 5 CsvFileSource
外部 CSV 格式檔案參數輸入。
@ParameterizedTest
@CsvFileSource(resources = "/org/ruoxue/spring_boot_168/test/junit5/csvFileWorld.csv", numLinesToSkip = 1)
public void csvFileWorld(String value, int length) {
System.out.println(value + ", " + length);
assertTrue(value.length() > 0);
assertTrue(length > 0);
}
Java, 4
Groovy, 6
Kotlin, 6
JUnit5ParameterizedTest.java
package org.ruoxue.spring_boot_168.test.junit5;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.EnumSource;
import org.junit.jupiter.params.provider.EnumSource.Mode;
import org.junit.jupiter.params.provider.MethodSource;
import org.junit.jupiter.params.provider.ValueSource;
public class JUnit5ParameterizedTest {
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
public void numberWorld(int value) {
System.out.println(value);
assertTrue(value > 0);
}
@ParameterizedTest
@ValueSource(strings = { "Java", "Groovy", "Kotlin" })
public void langWorld(String value) {
System.out.println(value);
assertTrue(value.length() > 0);
}
enum Status {
A, B, C
}
@ParameterizedTest
@EnumSource(value = Status.class, names = { "A", "B", "C" })
public void enumWorld(Status status) {
System.out.println(status);
assertNotNull(status);
}
@ParameterizedTest
@EnumSource(value = Status.class, mode = Mode.EXCLUDE, names = { "A" })
public void enumExclueWorld(Status status) {
System.out.println(status);
assertNotNull(status);
}
static Stream<String> stringProvider() {
return Stream.of("Java", "Groovy");
}
@ParameterizedTest
@MethodSource("stringProvider")
public void methodWorld(String value) {
System.out.println(value);
assertTrue(value.length() > 0);
}
static IntStream intProvider() {
return IntStream.range(1, 3);
}
@ParameterizedTest
@MethodSource("intProvider")
public void methodIntWorld(int value) {
System.out.println(value);
assertTrue(value > 0);
}
@ParameterizedTest
@CsvSource({ "Java, 4", "Groovy, 6", "Kotlin, 6" })
public void csvWorld(String value, int length) {
System.out.println(value + ", " + length);
assertTrue(value.length() > 0);
assertTrue(length > 0);
}
@ParameterizedTest
@CsvFileSource(resources = "/org/ruoxue/spring_boot_168/test/junit5/csvFileWorld.csv", numLinesToSkip = 1)
public void csvFileWorld(String value, int length) {
System.out.println(value + ", " + length);
assertTrue(value.length() > 0);
assertTrue(length > 0);
}
}
心得分享
建立參數化測試的過程,了解如何使用參數陣列和列舉參數建立參數化測試,可以比較和常規測試之間的設定差異,除此之外,還可自定義各個測試用例的顯示名稱。