2.4 單元測試有那么重要嗎?

一段測試代碼
你有沒有寫過單元測試,你的單元測試是不是這樣的?
下面是一個登錄測試的過程:
https://codingapi.github.io/blog/2020/03/01/codingapi-test/
執(zhí)行過程如下:
數(shù)據(jù)的檢查
測試數(shù)據(jù)導(dǎo)入
測試代碼
數(shù)據(jù)回滾及清理
上述代碼的問題:
過度依賴環(huán)境
上述單元測試中必須要保護(hù)mysql、mongodb服務(wù)
過度依賴數(shù)據(jù)
上述單元測試必須依賴登陸的用戶數(shù)據(jù),才能完成登陸的單元測試
數(shù)據(jù)恢復(fù)與回歸
如果采用了不支持事物的數(shù)據(jù)庫,例如NOSQL,那么將會更加難以控制
開發(fā)過程
開發(fā)環(huán)境→測試環(huán)境→生產(chǎn)環(huán)境
上述單元測試的過程,會因?yàn)楦鞣N環(huán)境之間的差異導(dǎo)致單元測試很難兼容,從而團(tuán)隊也就無法推動單元測試的落地,致使系統(tǒng)一直在“裸奔”。
單元測試的重要性
質(zhì)量保證:單元測試是非常重要的軟件質(zhì)量的保障體系,主要看代碼的覆蓋率和代碼的單元測試斷言的結(jié)果。
簡化調(diào)試:當(dāng)出現(xiàn)問題時,有了單元測試,可以更快速地定位到問題發(fā)生的具體位置,大大提高了調(diào)試的效率。
改進(jìn)設(shè)計:有一種開發(fā)方式叫做測試驅(qū)動開發(fā)。有了單元測試,會促使開發(fā)者寫出更加易于測試、易于維護(hù)的代碼。很多時候你可能暫時不清楚實(shí)現(xiàn)過程,但是清楚實(shí)現(xiàn)的效果。
文檔作用:單元測試也是一種形式的文檔。其他開發(fā)者可以通過查看單元測試,快速理解一個函數(shù)或者模塊的功能和使用方式。我們學(xué)習(xí)一個框架習(xí)慣會先看exmaples就是如此了。
支持重構(gòu):在大規(guī)模修改代碼或者重構(gòu)的過程中,有了單元測試,可以確保修改后的代碼仍然正確,大大降低了修改代碼的風(fēng)險。
自動化:單元測試是一種自動化測試,可以在每次代碼提交時自動運(yùn)行,提供即時的反饋。
單元測試的正確寫法
User模型
Junit單元測試:
users.csv文件:
單元測試的關(guān)鍵要素
自定義輸入數(shù)據(jù)
每一個單元測試都應(yīng)該有明確定義的輸入。這些輸入應(yīng)該覆蓋所有可能的情況,包括正常情況、邊界情況、異常情況等。測試的輸入數(shù)據(jù)應(yīng)該盡可能地豐富和多樣,以確保代碼在各種情況下都能正確運(yùn)行。
多場景的測試覆蓋
單元測試應(yīng)該盡可能多地覆蓋各種可能的場景。這包括函數(shù)或者方法的所有可能的執(zhí)行路徑,以及所有可能的輸入數(shù)據(jù)。多場景的測試覆蓋可以大大增加測試的有效性。
斷言預(yù)測結(jié)果
每個單元測試都應(yīng)該有一個或多個斷言來驗(yàn)證代碼的執(zhí)行結(jié)果。斷言應(yīng)該對結(jié)果的正確性進(jìn)行嚴(yán)格的檢查,以確保代碼的行為符合預(yù)期。
獨(dú)立性
每一個單元測試都應(yīng)該是獨(dú)立的,不依賴于其他的測試,也不依賴于測試的執(zhí)行順序。這樣可以保證每個測試都是可重復(fù)的,也可以單獨(dú)運(yùn)行。