天天看點

Java:Java中單元測試的最佳實踐

  單元測試是一種測試單個源代碼單元以確定它們按預期工作的技術。單元測試幫助我們在bug和回歸進入生産環境之前捕捉它們,這節省了時間和金錢。然而,為了確定從Java應用程式代碼的單元測試中獲得最大的好處,需要遵循某些最佳實踐。

  在編寫代碼之前先編寫測試

  這似乎違反直覺,但開發人員在用Java編寫單元測試時可以做的最好的事情之一是在編寫任何代碼之前編寫單元測試。這樣,你可以考慮在開始編碼之前需要測試什麼。這也可以幫助你避免編寫不必要的代碼。

  确定你的測試代碼覆寫率

  Java單元測試是基于它們的代碼覆寫率進行評估的,這表明了它們覆寫的代碼量,它是了解單元測試有效性的有用工具,可以幫助程式員改進它們。

  為了弄清楚單元測試覆寫了整個應用程式中代碼的百分比,你需要考慮兩件事:1.你項目中的所有類;2.你或其他人對所有這些類的所有測試。

  保持你的單元測試小而集中

  在編寫單元測試時,要記住的最重要的事情之一是使單元測試盡可能小且集中。開發人員的測試應該一次隻測試一個特定的東西。這使得它們更容易編寫和維護,而且如果發現bug,也更容易确定哪個測試失敗。

  将單元測試與外部依賴項隔離開來

  當編寫單元測試時,程式員最好将他們的測試與外部依賴隔離開來。外部依賴的典型例子是資料庫、web服務和代碼所依賴的其他軟體元件。

  當你試圖測試你的代碼的時候,讓所有這些東西都運作起來是一件痛苦的事情。通過隔離單元測試,開發人員可以快速輕松地編寫它們,而不必擔心啟動外部資源。隔離這些外部依賴關系的一種方法是使用mocks和stubs。

  

Java:Java中單元測試的最佳實踐

  實施測試自動化

  使用建構工具建構項目,如Maven或者Gradle可以使運作單元測試變得更容易。建構工具也可以用來自動化測試的運作,這可以節省你的時間。你可以利用持續內建伺服器在每次代碼被檢入時自動運作你的單元測試。這確定了你的測試總是最新的,并有助于盡早發現bug。

  避免測試實作細節

  應該注意,在編寫單元測試方法時,開發人員應該避免編寫測試實作細節的代碼。例如,如果你正在測試一個調用另一個方法的方法,你不應該測試第二個方法是如何實作的細節;這可能會導緻測試很脆弱,很難維護。

  模拟外部依賴

  Mock允許你模拟應用程式中元件的行為,以最小化資源消耗并減少運作測試方法所需的時間。例如:你可能需要一個模拟使用者存儲庫,以便模拟使用者與實際不存在的真實使用者存儲庫界面的互動。

  程式員還可以使用mock測試web服務——例如,測試應用程式處理通過REST API調用發出的HTTP請求傳回的錯誤的能力。為了隔離你的測試單元(即你嘗試測試的對象),你需要模拟出它的所有依賴項,以便它們在測試期間不會實際調用任何外部對象。

  例如,如果一個程式員正在為一個使用外部web服務的Java對象編寫一個單元測試,那麼在他們的測試代碼中,他們會希望用一個虛拟的實作來替換那個web服務,以防止任何真正的流量到達實際的服務。這通常是使用Powermock、Mockito等模仿架構來完成的。

  使用斷言來驗證單元測試的預期輸出

  當編寫Java單元測試時,斷言用于驗證預期的輸出。開發人員的代碼不應該通過斷言來驗證;它們應該僅用于驗證預期的結果。如果你發現自己在測試用例中使用斷言來驗證你的代碼是正确的,那麼這表明你測試應用程式的方式存在缺陷,并且可能意味着測試代碼覆寫率很低。程式員應該利用适當的斷言來驗證預期結果和實際結果是否相同。

  

Java:Java中單元測試的最佳實踐

  為測試方法提供有意義的名稱

  測試名應該是描述性的,但是不能太長。單元測試方法的名稱應該描述測試的目的和期望的結果。這有助于開發人員容易地了解測試方法的意圖。

  保持單元測試是最新的

  當Java代碼發生變化時,保持單元測試的最新狀态很重要。這可以通過定期運作測試并確定它們都通過來實作。

  建立獨立的代碼測試

  建立一套Java單元測試的第一步是確定它們互相獨立。程式員應該能夠以任何順序運作他們想要的任何測試,并在合理的時間内讓它通過或失敗。這允許開發人員建立一組可以随時運作的測試,并且不需要等待其他依賴的單元測試。

  這裡的目标是讓你的測試套件像你的代碼庫的自動化驗收測試一樣運作;如果一個單元測試通過了,那麼一切都通過了。将單元測試放在它們自己的包中,遠離生産代碼。一般來說,讓它們遠離你的生産源代碼是一個很好的做法。

  隻簽入已經通過的單元測試

  單元測試的第一條規則是:在将Java代碼簽入存儲庫或建構系統之前,確定單元測試通過。這是因為如果你不打算定期運作單元測試,那麼編寫代碼并在以後添加單元測試是沒有意義的。

  當你這樣做時,你會發現當你在其他地方進行更改時,你的代碼将不可避免地中斷——然後當其他人試圖用這些中斷的測試建構項目時,他們會得到錯誤提示。

  關于Java單元測試的最後思考

  遵循良好的編碼實踐,比如使用有意義的變量名和注釋,将使你的Java代碼更容易了解和維護。這将使你和其他開發人員在為代碼編寫單元測試時更加輕松。

  如果按照推薦的最佳實踐正确地進行單元測試,可以産生很好的結果。通過遵循這些單元測試技巧,程式員可以確定他們的測試保持最新,并在運作時提供有用的結果,進而為你的開發生命周期增加價值,并且不會随着時間的推移而成為維護開銷。

繼續閱讀