天天看點

JUnit:求求你了,别再用 main 方法測試了,好嗎?(1)

01、前世今生

你好呀,我是 JUnit,一個開源的 Java 單元測試架構。在了解我之前,先來了解一下什麼是單元測試。單元測試,就是針對最小的功能單元編寫測試代碼。在 Java 中,最小的功能單元就是方法,是以,對 Java 程式員進行單元測試實際上就是對 Java 方法的測試。

為什麼要進行單元測試呢?因為單元測試可以確定你編寫的代碼是符合軟體需求和遵循開發規範的。單元測試是所有測試中最底層的一類測試,是第一個環節,也是最重要的一個環節,是唯一一次能夠達到代碼覆寫率 100% 的測試,是整個軟體測試過程的基礎和前提。可以這麼說,單元測試的成本效益是最好的。

微軟公司之前有這樣一個統計:bug 在單元測試階段被發現的平均耗時是 3.25 小時,如果遺漏到系統測試則需要 11.5 個小時。

JUnit:求求你了,别再用 main 方法測試了,好嗎?(1)

經我這麼一說,你應該已經很清楚單元測試的重要性了。那在你最初編寫測試代碼的時候,是不是經常這麼做?就像下面這樣。

public class Factorial {
    public static long fact(long n) {
        long r = 1;
        for (long i = 1; i <= n; i++) {
            r = r * i;
        }
        return r;
    }
    public static void main(String[] args) {
        if (fact(3) == 6) {
            System.out.println("通過");
        } else {
            System.out.println("失敗");
        }
    }
}      

要測試 fact() 方法正确性,你在 main() 方法中編寫了一段測試代碼。如果你這麼做過的話,我隻能說你也曾經青澀天真過啊!使用 main() 方法來測試有很多壞處,比如說:

1)測試代碼沒有和源代碼分開。

2)不夠靈活,很難編寫一組通用的測試代碼。

3)無法自動列印出預期和實際的結果,沒辦法比對。

但如果學會使用我——JUnit 的話,就不會再有這種困擾了。我可以非常簡單地組織測試代碼,并随時運作它們,還能給出準确的測試報告,讓你在最短的時間内發現自己編寫的代碼到底哪裡出了問題。

02、上手指南

好了,既然知道了我這麼優秀,那還等什麼,直接上手吧!我最新的版本是 JUnit 5,Intellij IDEA 中已經內建了,是以你可以直接在 IDEA 中編寫并運作我的測試用例。

第一步,直接在目前的代碼編輯器視窗中按下 Command+N 鍵(Mac 版),在彈出的菜單中選擇「Test…」。

JUnit:求求你了,别再用 main 方法測試了,好嗎?(1)

勾選上要編寫測試用例的方法 fact(),然後點選「OK」。

此時,IDEA 會自動在目前類所在的包下生成一個類名帶 Test(慣例)的測試類。如下圖所示。

JUnit:求求你了,别再用 main 方法測試了,好嗎?(1)

如果你是第一次使用我的話,IDEA 會提示你導入我的依賴包。建議你選擇最新的 JUnit 5.4。

JUnit:求求你了,别再用 main 方法測試了,好嗎?(1)

導入完畢後,你可以打開 pom.xml 檔案确認一下,裡面多了對我的依賴。

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>RELEASE</version>
    <scope>compile</scope>
</dependency>      

第二步,在測試方法中添加一組斷言,如下所示。

@Test
void fact() {
    assertEquals(1, Factorial.fact(1));
    assertEquals(2, Factorial.fact(2));
    assertEquals(6, Factorial.fact(3));
    assertEquals(100, Factorial.fact(5));
}      

@Test 注解是我要求的,我會把帶有 @Test 的方法識别為測試方法。在測試方法内部,你可以使用 assertEquals() 對期望的值和實際的值進行比對。

第三步,你可以在郵件菜單中選擇「Run FactorialTest」來運作測試用例,結果如下所示。

JUnit:求求你了,别再用 main 方法測試了,好嗎?(1)

測試失敗了,因為第 20 行的預期結果和實際不符,預期是 100,實際是 120。此時,你要麼修正實作代碼,要麼修正測試代碼,直到測試通過為止。

JUnit:求求你了,别再用 main 方法測試了,好嗎?(1)

不難吧?單元測試可以確定單個方法按照正确的預期運作,如果你修改了某個方法的代碼,隻需確定其對應的單元測試通過,即可認為改動是沒有問題的。