如今大公司愈來愈重視項目的單元測試,甚至明確要求項目的單元測試覆蓋率不能低於某個值,足可見單元測試的重要性;html
試想若是沒有單元測試,那麼如何保證代碼可以正常運行呢?java
測試人員作的只是業務上的集成測試,也就是黑盒測試,對單個的方法是沒有辦法測試的,並且,測試出的 bug 的範圍也會很廣,根本不能肯定 bug 的範圍,還得去花時間來肯定 bug 出在什麼地方。數據庫
另外,一個最多見的問題:寫單測浪費時間? 你有沒有計算過你改bug的時間(定位+修復),算一下的話你會發現時間浪費的會更多。框架
關於如何寫好單元測試,下面有幾條建議供你們參考:ide
測試數據大體分爲兩種:變化的和不變化的,對於不變的測試數據,咱們徹底能夠寫在單元測試用例代碼中,也能夠將數據外部化。單元測試
而對於測試數據一直在變,而且測試數據量比較大的時候可使用測試數據外部化將數據放在測試用例的外部進行統一管理。測試
什麼是數據外部化?就是將數據放在單元測試用例的外部統一管理,好比咱們能夠將一個單元測試用例中的測試數據統一放在一個CSV文件中。ui
咱們就能夠經過好比junit5中的參數測試註解@ParameterizedTest
和引入CVS文件的註解@CsvFileSource
並指定其中的resources屬性指定CSV文件,numLinesToSkip = n 屬性指定從第n+1行開始。這樣就能夠經過一個CSV文件統一管理一個單元測試用例中的數據。.net
咱們管理測試用例中所須要的數據就只須要管理一個個CSV文件便可。設計
下面能夠看一個案例:(其中具體的使用方法請看博客[junit5系列-參數化測試]())
@ParameterizedTest @CsvFileSource(resources = "/two-column.csv", numLinesToSkip = 1) void testWithCsvFileSource(String first, int second) { assertNotNull(first); assertNotEquals(0, second); }
其中,two-column.csv文件內容
Country, reference Sweden, 1 Poland, 2 "United States of America", 3
若是方法結果具備隨機性,這樣的方法幾乎沒法測試,因此咱們針對這種方法便沒有辦法去進行測試。
在能完成測試的基礎上儘可能簡潔代碼,這樣不只使代碼更加好看,還好維護好理解。
想一想一大堆代碼和幾行代碼你更想看哪一個?
對於單元測試用例咱們幾乎每開發完一個方法或者修改完一個方法,咱們幾乎都會去運行一遍測試用例,確保沒有影響到其餘模塊的正常運行,因此咱們要儘可能讓你的測試方法「快!」,移除一些和單元測試無關的代碼。固然,前提仍是要保證測試的完整性與正確性。
這個相對來講比較簡單,可是作起來是比較難的,由於可能會有多種緣由致使你的測試用例失敗,好比:數據過時、方法內部邏輯改變等。
這些可能會花費你的一些時間去修改,你每每可能不肯意,不過既然作了一件事,就作好一件事唄
可是若是你不注意這些小錯誤,這可能就會致使你的一個大流程失敗,你們應該知道,咱們在運行一個流程時每每一個小小的錯誤就致使流程整理失敗!
這包含的方面就比較廣了,下面幾個方面我認爲你們應該注意的:
一個設計好的單元測試,其代碼測試覆蓋率也是很高的,並不要求100% 的測試代碼覆蓋率,可是高覆蓋率的代碼包含未檢測到的錯誤的概率要低,由於其更多的源代碼在測試過程當中被執行。
注意:高代碼覆蓋不能保證測試是完美的,因此要當心!
好了,上述就是對如何寫好單元測試的一些建議,若有不當,請在評論區中指出,感激涕零!
接下來,我會寫一些關於單元測試如何搭建、junit5相關新語法、基於圖數據庫的單元測試等
歡迎關注博主和 公衆號[匠心Java],一塊兒討論~