JUnit 5 Order - JUnit 151

JUnit 5 Order – JUnit 151

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

JUnit 5 Order

測試用例排序, 可以按照方法名稱、註解或隨機、自定義名稱等方式,讓測試方法按照符合預期的排序輸出,在某些情況下,執行順序可能成為測試應用程序功能的重要因素,像是整合測試時,建立新帳號、更新帳號,然後刪除帳號等,需要有先後順序來驗證功能是否完整,採用單元測試來驗證產出結果。

檔案目錄

./
   +- build.gradle
       +- src
           +- main
           |   +- resources
           |   |   +- junit-platform.properties
           +- test
           |   +- org
           |       +- ruoxue
           |           +- spring_boot_168
           |               +- test
           |                   +- junit5
           |                       +- JUnit5OrderMethodNameTest.java    
           |                       +- JUnit5OrderAnnotationTest.java    
           |                       +- JUnit5OrderRandomTest.java    
           |                       +- JUnit5OrderDisplayNameTest.java    

註解說明

提供多樣化的註解宣告。

AnnotationsDescription
@TestMethodOrder排序方式。
MethodOrderer.MethodName方法名稱排序。
MethodOrderer.OrderAnnotation註解排序。
MethodOrderer.Random隨機排序。
MethodOrderer.DisplayName顯示名稱排序。
@Order測試方法排序。

單元測試

JUnit 5 MethodOrderer MethodName

依照方法名稱排序。

package org.ruoxue.spring_boot_168.test.junit5;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.MethodName.class)
public class JUnit5OrderMethodNameTest {

	@Test
	public void itWorldZ() {
		System.out.println("itWorldZ");
	}

	@Test
	public void itWorldA() {
		System.out.println("itWorldA");
	}

	@Test
	public void itWorldB() {
		System.out.println("itWorldB");
	}

	@Test
	public void itWorldY() {
		System.out.println("itWorldY");
	}

	@Test
	public void itWorldC() {
		System.out.println("itWorldC");
	}

	@Test
	public void itWorldX() {
		System.out.println("itWorldX");
	}
}
itWorldA
itWorldB
itWorldC
itWorldX
itWorldY
itWorldZ

JUnit 5 MethodOrderer OrderAnnotation

依照 @Order 註解排序。

package org.ruoxue.spring_boot_168.test.junit5;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JUnit5OrderAnnotationTest {

	@Test
	public void itWorld6() {
		System.out.println("itWorld6");
	}

	@Order(3)
	@Test
	public void itWorld1() {
		System.out.println("itWorld1");
	}

	@Order(1)
	@Test
	public void itWorld2() {
		System.out.println("itWorld2");
	}

	@Test
	public void itWorld5() {
		System.out.println("itWorld5");
	}

	@Order(2)
	@Test
	public void itWorld3() {
		System.out.println("itWorld3");
	}

	@Test
	public void itWorld4() {
		System.out.println("itWorld4");
	}
}
itWorld2
itWorld3
itWorld1
itWorld4
itWorld5
itWorld6

JUnit 5 MethodOrderer Random

隨機排序,每次執行的順序都不一樣,因為隨機種子預設是採 System.nanoTime() ,在測試類的靜態初始化期間產生的,所以若要固定每次隨機產出的結果相同,則要在 junit-platform.properties 設定隨機種子 。

junit-platform.properties

junit.jupiter.execution.order.random.seed=168
package org.ruoxue.spring_boot_168.test.junit5;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.Random.class)
public class JUnit5OrderRandomTest {

	@Test
	public void itWorldZ() {
		System.out.println("itWorldZ");
	}

	@Test
	public void itWorldA() {
		System.out.println("itWorldA");
	}

	@Test
	public void itWorldB() {
		System.out.println("itWorldB");
	}

	@Test
	public void itWorldY() {
		System.out.println("itWorldY");
	}

	@Test
	public void itWorldC() {
		System.out.println("itWorldC");
	}

	@Test
	public void itWorldX() {
		System.out.println("itWorldX");
	}
}
itWorldC
itWorldA
itWorldX
itWorldY
itWorldB
itWorldZ

JUnit 5 MethodOrderer DisplayName

顯示自定義的名稱排序。

package org.ruoxue.spring_boot_168.test.junit5;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.DisplayName.class)
public class JUnit5OrderDisplayNameTest {

	@DisplayName("itWorld1")
	@Test
	public void itWorldZ() {
		System.out.println("itWorldZ");
	}

	@DisplayName("itWorld2")
	@Test
	public void itWorldA() {
		System.out.println("itWorldA");
	}
	
	@DisplayName("itWorld3")
	@Test
	public void itWorldB() {
		System.out.println("itWorldB");
	}

	@DisplayName("itWorld4")
	@Test
	public void itWorldY() {
		System.out.println("itWorldY");
	}

	@DisplayName("itWorld5")
	@Test
	public void itWorldC() {
		System.out.println("itWorldC");
	}

	@DisplayName("itWorld6")
	@Test
	public void itWorldX() {
		System.out.println("itWorldX");
	}
}
itWorldZ
itWorldA
itWorldB
itWorldY
itWorldC
itWorldX

心得分享

可以使用不同的排序規則,輸出測試用例方法,決定方法的執行順序,當有特殊任務需求,可以採使用以上排序方式進行對測試方法排序,若無特別需求,建議按預設排序方式進行測試即可達成任務。

發佈留言