程式碼整潔之道讀書筆記——第九章:單元測試

pengboboer發表於2020-10-24

第九章 單元測試

編寫單元測試是很有必要的

9.1 TDD三定律

測試驅動開發

  • 在編寫不能通過的單元測試前,不可編寫生產程式碼
  • 只可編寫剛好無法通過的單元測試,不能編譯也算不通過
  • 只可編寫剛好足以通過當前失敗測試的生產程式碼

總的來說就是先寫測試再寫生產程式碼,寫一個測試就應該立即寫它的實現程式碼

9.2 保持測試清潔

測試程式碼和生產程式碼一樣重要,它需要被思考、被設計和被照料。它該像生產程式碼一般保持整潔

單元測試讓你的程式碼可擴充套件、可維護、可複用

9.3 整潔的測試

可讀性、可讀性、可讀性

呈現:構造-操作-檢驗模式

構造測試資料、操作測試資料、檢驗操作結果
public void testGetPageHierarchyAsXml() {
    makePages("PageOne", "PageOne.ChildOne", "PageTwo");

    submitReqeust("root", "type:Pages");

    assertResponseIsXml();
    assertResponseContains("<name>PageOne</name>","<name>PageTwo</name>");
}

9.3.1 面向特定領域的測試語言

打造一套包裝API的函式和工具程式碼,這樣就能更方便的編寫測試

9.3.2 雙重標準

測試程式碼應當簡單、精悍、足具表達力

書中的例子:

這樣寫測試程式碼難以閱讀
@Test
public void turnOnLoTempAlarmAtThreashold () {
    hw.setTemp(WAY_TOO_COLD);
    controller.tic();
    asssertTrue(hw.heaterState());
    asssertTrue(hw.blowerState());
    asssertFalse(hw.coolerState());
    asssertFalse(hw.hiTempAlarm());
    asssertTrue(hw.loTempAlarm());
}

不如

@Test
public void void turnOnLoTempAlarmAtThreshold() {
    wayTooCold();
    assertEquals("HBchL", hw.getState());
}

@Test
public void void turnOnCoolerAndBlowerIfTooHot() {
    tooHot();
    assertEquals("hBchL", hw.getState());
}

......

效率不是很高,要提高效率可能要使用StringBuffer

public String getState() {
    String state = "";
    state += heater ? "H" : "h";
    state += blower ? "B" : "b";
    state += cooler ? "C" : "c";
    state += hiTempAlarm ? "H" : "h";
    state += loTempAlarm ? "L" : "l";
    return state;
}

StringBuffer有點醜陋,即使是在生產程式碼中,假使代價較小,我們都會避免使用StringBuffer

即便計算機和記憶體資源都很有限。不過,測試環境大概完全不必做限制

有些事我們不會在生產環境做,但是測試環境做卻完全沒問題

9.4 每個測試一個斷言

單個斷言是個好準則,每個單個測試中的斷言數量更應該最小化

每個測試一個概念

每個測試函式只測試一個概念

9.5 F.I.R.S.T

快速:測試應該夠快,能快速的執行

獨立:測試應該相互獨立,某個測試不應為下一個測試設定條件,我們應該可以獨立的執行每個測試

可重複:測試應當可在任何環境中重複通過

自足驗證:測試應該有布林值輸出,不應該通過檢視日誌或者手工比對測試值是否相同,那如果是這樣測試還有什麼意義?

及時:測試應及時編寫,單元測試應該恰好在使其通過的生產程式碼之前編寫,如果再編寫生產程式碼之後編寫測試,你會發現生產程式碼難以測試,你可能會認為某些生產程式碼本身難以測試,你可能就不會去設計可測試的程式碼

9.6 小結

確實如作者所說,我們只是觸及了這個話題的表面,測試其實很重要,它保證和增強了生產程式碼的可擴充套件性、可維護性和可複用性

總結

其實很多公司在寫程式碼的時候沒要求去程式設計師去寫測試程式碼,但是其實寫測試程式碼是很有必要的,下次我也準備專門寫一個文章來搞一下單元測試

相關文章