JUnit 5 ParameterizedTest - JUnit 151

JUnit 5 ParameterizedTest – JUnit 151

  • Post author:
  • Post category:RD / JUnit
  • Post comments:0 Comments
  • Post last modified:2023-02-18

通過使用參數化測試,可以在多個測試用例之間重用單個測試設定,這將能夠減少程式碼並輕鬆驗證多個測試用例,無需為每個測試用例,建立單獨的測試方法,採用單元測試來驗證產出結果。

JUnit 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()
}

註解說明

提供多樣化的註解宣告。

AnnotationsDescription
@ParameterizedTest參數化測試。
@ValueSource傳入參數陣列。
@EnumSource列舉參數。
@MethodSource方法參數。
@CsvSource CSV 參數。
@CsvFileSourceCSV 檔案參數。

單元測試

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);
	}
}

心得分享

建立參數化測試的過程,了解如何使用參數陣列和列舉參數建立參數化測試,可以比較和常規測試之間的設定差異,除此之外,還可自定義各個測試用例的顯示名稱。

發佈留言