使用 JUnit 進行單元測試

Java 測試入門

Maria Milusheva

Senior Software Engineer

單元測試-定義

兩個關鍵概念:

Unit(單元)-應用程式中最小可測試部分,如方法

Unit testing(單元測試)-在不受應用程式其他部分影響下,驗證單一「單元」程式碼正確性的測試

Java 測試入門

單元測試著重細節

重點:

  • 單元測試關注小範圍邏輯,而非整體情境

  • 其他測試類型關注整體(例如整合測試)

  • JUnit 的名稱來自其主要用途是單元測試

一張直觀呈現單元測試與正式程式碼關係的圖表

Java 測試入門

測試類型-快速總覽

  • 本課將重點介紹 unitintegration 測試。
  • 但測試類型其實很多!

軟體測試示意圖,包含功能性測試如單元測試,以及非功能性測試如可用性測試

Java 測試入門

測試類型-快速總覽

  • 本課將重點介紹 unitintegration 測試。
  • 但測試類型其實很多!

軟體測試示意圖,包含功能性測試如單元測試,以及非功能性測試如可用性測試。本版面以圈選標示單元與整合測試

Java 測試入門

JUnit 語法:assertTrue() 與 assertFalse()

  • assertTrue() 用來檢查敘述為 true:
List<String> list = new ArrayList<>();

assertTrue(list.isEmpty()); // No error
  • assertFalse() 檢查相反情況:
List<String> list = new ArrayList<>();
list.add("A");

assertFalse(list.isEmpty()); // No error
Java 測試入門

assertNull() 與 assertNotNull()

null 變數可能導致 NullPointerException

  • 斷言可檢查變數是否為 nullassertNull()assertNotNull()

  • 常見用途:檢查某處取得的值不是 null

Map<String, Integer> catalogue = new HashMap<>();

catalogue.put("item1", 10);

// No errors
assertNotNull(catalogue.get("item1"));
assertNull(catalogue.get("item2"));
Java 測試入門

斷言例外狀況

假設我們要驗證拋出 ArrayIndexOutOfBoundsException

public String getIndex(String[] array, int index) {
    return array[index];
}

JUnit 提供多種作法可達成!

Java 測試入門

assertInstanceOf()

  • JUnit 有 assertThrows(),但它使用進階 Java 語法(lambda 運算式)

  • 也可以這樣用 assertInstanceOf()

try {
    getIndex(new String[]{}, 4);
} catch (Exception e) {
    // 傳入預期的例外類別與實際例外
    assertInstanceOf(ArrayIndexOutOfBoundsException.class, e); 
}
1 https://www.baeldung.com/junit-assert-exception
Java 測試入門

單元測試命名

  • 一個典型專案會包含數百個單元測試

  • 測試應該輕量且容易理解

  • 測試名稱應具資訊量,讓失敗時能一眼看出問題

例如:methodUnderTest_expectedBehavior_conditions()

1 https://dzone.com/articles/7-popular-unit-test-naming?fromrel=true
Java 測試入門

一起來練習吧!

Java 測試入門

Preparing Video For Download...