Table of Contents
ToggleJUnit 5 Nested
建立內嵌測試,以靜態內部類別的形式,對測試用例進行分組,此外還有略過某個測試方法,及標記測試方法等註解說明,採用單元測試來驗證產出結果。
檔案目錄
./
+- build.gradle
+- test
| +- org
| +- ruoxue
| +- spring_boot_168
| +- test
| +- junit5
| +- JUnit5NestedTest.java
| +- JUnit5TagTest.java
| +- WordTest.java
註解說明
提供多樣化的註解宣告。
Annotations | Description |
---|---|
@Nested | 建立內嵌測試類別。 |
@Disable | 禁用執行測試。 |
@Tag | 標記測試方法。 |
單元測試
WorldTest.java
假設單一測試類別,包含許多測試用例,隨著需求的增加,測試方法會不斷地增加,可能將會超過上百個測試,因此可以考慮建立內嵌測試類別,結構化輸出,增加程式可讀性。
package org.ruoxue.spring_boot_168.test.junit5;
import org.junit.jupiter.api.Test;
public class WorldTest {
@Test
public void springWorld() {
System.out.println("Spring World");
}
@Test
public void springWorld_2() {
System.out.println("Spring World 2");
}
@Test
public void springWorld_3() {
System.out.println("Spring World 3");
}
@Test
public void javaWorld() {
System.out.println("Java World");
}
@Test
public void javaWorld_2() {
System.out.println("Java World 2");
}
@Test
public void javaWorld_3() {
System.out.println("Java World 3");
}
}
JUnit 5 Nested
建立內嵌測試類,以靜態內部類別的形式,對測試進行分組。
@Nested
@DisplayName("Spring World")
public class SpringWorldTest {
@Test
public void springWorld() {
System.out.println("Spring World");
}
@Test
public void springWorld_2() {
System.out.println("Spring World 2");
}
@Test
public void springWorld_3() {
System.out.println("Spring World 3");
}
}
@Nested
@DisplayName("Java World")
public class JavaWorldTest {
@Test
public void javaWorld() {
System.out.println("Java World");
}
@Test
public void javaWorld_2() {
System.out.println("Java World 2");
}
@Test
public void javaWorld_3() {
System.out.println("Java World 3");
}
}
beforeEach
Spring World
beforeEach
Spring World 2
beforeEach
Spring World 3
beforeEach
Java World 2
beforeEach
Java World 3
beforeEach
Java World
JUnit 5 Disabled
禁用某個測試方法。
@Disabled
@Test
public void springWorld() {
System.out.println("Spring World");
}
禁用某個測試類別。
@Disabled
public class JUnit5NestedTest {
@Test
public void springWorld() {
System.out.println("Spring World");
}
}
JUnit 5 Tag
可以使用在測試類別和方法。
@Tag("develop")
@Test
public void develop() {
System.out.println("develop");
}
@Tag("prod")
@Test
public void prod() {
System.out.println("prod");
}
build.gradle
增加 includeTags ,執行測試 develop 、 prod 。
test {
useJUnitPlatform {
includeTags 'develop', 'prod'
}
}
gradle clean test
> Task :test
org.ruoxue.spring_boot_168.test.junit5.JUnit5TagTest > develop() PASSED
org.ruoxue.spring_boot_168.test.junit5.JUnit5TagTest > prod() PASSED
JUnit5NestedTest.java
package org.ruoxue.spring_boot_168.test.junit5;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
public class JUnit5NestedTest {
@BeforeEach
public void beforeEach() throws Exception {
System.out.println("beforeEach");
}
@Nested
@DisplayName("Spring World")
public class SpringWorldTest {
@Test
public void springWorld() {
System.out.println("Spring World");
}
@Test
public void springWorld_2() {
System.out.println("Spring World 2");
}
@Test
public void springWorld_3() {
System.out.println("Spring World 3");
}
}
@Nested
@DisplayName("Java World")
public class JavaWorldTest {
@Test
public void javaWorld() {
System.out.println("Java World");
}
@Test
public void javaWorld_2() {
System.out.println("Java World 2");
}
@Test
public void javaWorld_3() {
System.out.println("Java World 3");
}
}
@Disabled
@Test
public void springWorld() {
System.out.println("Spring World");
}
@Test
public void itWorld() {
System.out.println("IT World");
}
}
JUnit5TagTest.java
package org.ruoxue.spring_boot_168.test.junit5;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
public class JUnit5TagTest {
@Tag("develop")
@Test
public void develop() {
System.out.println("develop");
}
@Tag("prod")
@Test
public void prod() {
System.out.println("prod");
}
}
心得分享
Assertions JUnit 提供測試範例參考,隨著測試程式越來越多時,使用內部類別分組,可以更有系統的管理測試用例,每個內部類別都可以有自己的生命週期方法,這些方法將按從外到內層次順序執行,JUnit Assert 確保系統保持在一個穩定的狀況中成長。