什么是單元測試
單元測試是指,對軟件中的最小可測試單元在與程序其他部分相隔離的情況下進(jìn)行檢查和驗(yàn)證的工作,這里的最小可測試單元通常是指函數(shù)或者類。
單元測試通常由開發(fā)工程師完成,一般會伴隨開發(fā)代碼一起遞交至代碼庫。單元測試屬于最嚴(yán)格的軟件測試手段,是最接近代碼底層實(shí)現(xiàn)的驗(yàn)證手段,可以在軟件開發(fā)的早期以最小的成本保證局部代碼的質(zhì)量。
為什么要編寫單元測試
單元測試在的早期就能發(fā)現(xiàn)問題
- 適應(yīng)變更
- 簡化集成
- 文檔記錄
- 表達(dá)設(shè)計
單元測試都是以自動化的方式執(zhí)行,所以在大量回歸測試的場景下更能帶來高收益。
同時,你還會發(fā)現(xiàn),單元測試的實(shí)施過程還可以幫助開發(fā)工程師改善代碼的設(shè)計與實(shí)現(xiàn),并能在單元測試代碼里提供函數(shù)的使用示例,因?yàn)閱卧獪y試的具體表現(xiàn)形式就是對函數(shù)以各種不同輸入?yún)?shù)組合進(jìn)行調(diào)用,這些調(diào)用方法構(gòu)成了函數(shù)的使用說明。
單元測試還有個好處,就是你可以為所有的產(chǎn)品代碼類寫單元測試,而不需要管它們的功能如何,或者它們在內(nèi)部結(jié)構(gòu)中屬于哪個層次。
哪些代碼需要進(jìn)行單元測試
并不是所有的代碼都要進(jìn)行單元測試,通常只有底層模塊或者核心模塊的測試中才會采用單元測試。

你可以對 controller 進(jìn)行單元測試,也可以用同樣的方式對 repository、領(lǐng)域類或者文件讀寫類進(jìn)行單元測試。
一個單元測試類至少應(yīng)該測試這個類的公共接口。私有方法不能直接測試的原因是你不能從測試類直接調(diào)用它們。受保護(hù)的和包私有的方法可以被測試類直接調(diào)用(如果測試類和生產(chǎn)代碼類的包結(jié)構(gòu)是一樣的),但是測試這些方法可能就太過了。
編寫單元測試有一條細(xì)則:它們應(yīng)該保證你代碼所有的路徑都被測試到(包括正常路徑和邊緣路徑)。同時它們不應(yīng)該和代碼的實(shí)現(xiàn)有太緊密的耦合。
具體的測試方法
https://github.com/jianpingyu/spring-testing
單元測試存在的困難

- 緊密耦合的代碼難以隔離
- 代碼本身的可測試性較差,通常代碼的可測試性和代碼規(guī)模成正比
- 代碼覆蓋率越往后越難提高
參考資料
單元測試-維基百科
SpringBoot Testing
測試金字塔實(shí)戰(zhàn)
JUnit5
mockito