這本書陸陸續(xù)續(xù)讀了比較久了,前面章節(jié)先不談数焊,先談?wù)凾esting這一章永淌。
測試的必要性:需要再次強調(diào),擁有好的測試是快速開發(fā)的基礎(chǔ)昌跌。
好的測試應(yīng)該包含的特征
- 可預(yù)測性:相同的代碼必須產(chǎn)生相同的結(jié)果仰禀。這就需要我們的測試排除環(huán)境照雁,時間蚕愤,隨機數(shù)字之類的影響。
- 封閉性:測試之間不能相互依賴饺蚊。測試數(shù)據(jù)自給自足萍诱。
- 可靠性:通過的說明代碼的確通過了宣稱測試的東西。
- 快速執(zhí)行: 隨著測試的增多這一點越來越重要污呼。
- 自動化:人容易出錯裕坊,反復(fù)重復(fù)的事情交給機器來干。
- 可維護性:對于測試代碼要像生產(chǎn)代碼一樣對待燕酷〖快速的需求變化=》快速的代碼變化=》快速的測試變化周瞎。沒有可維護性的測試,無法滿足快速開發(fā)的需求饵蒂。
測試的范圍
測試可以粗略分為代碼級別的測試和應(yīng)用級別的測試声诸。
- 單元測試:代碼級別,測試一個或多個類退盯。
- 組件測試:代碼級別彼乌,測試多個單元。
- 集成測試:這是個含義有些模糊的詞渊迁。作者在這里還是把作為類似組件測試的代碼級別的測試慰照,但是測試需要在某個測試容器(但不是真正的服務(wù)器)中來運行,這里的集成更多是指技術(shù)意義上的集成琉朽。這些需要測試的集成方面包括比如:CDI的配置是否正確毒租,OR Mapping的配置是否正確,全局event是否觸發(fā)箱叁,等等蝌衔。
- 系統(tǒng)測試:端對端的測試,覆蓋所有邏輯(業(yè)務(wù)的蝌蹂,技術(shù)的)噩斟。這里的前端未必是UI,比如某個接口的測試孤个,他的端對端測試就不存在UI部分剃允,但也屬于系統(tǒng)測試。
- 性能測試齐鲤,壓力測試斥废,和上面的測試都不同,測試非功能性部分给郊。
測試的實現(xiàn)
- 單元測試:用JUnit牡肉, Mockito等工具
- 組件測試:組件測試用來測試多個類之間的協(xié)作。由于還是代碼級別的業(yè)務(wù)邏輯的測試淆九,一些底層依賴(如DB訪問)需要被mock掉统锤。如何統(tǒng)一生成,管理并替換mock對象炭庙,是組件測試的難點所在饲窿。書中提出一種方式是通過繼承,比如我們原來想要測試對象A焕蹄,我們可以寫一個新的類B來繼承A逾雄,B中mock掉了A中所有底層不需要測試的部分,我們的測試只和B打交道。通過CDI框架比如Spring鸦泳,也能很好得管理mock银锻,但是初始化Spring容器很花時間,所以不是太推薦做鹰。
- 集成測試:代碼級別的集成測試目的是快速測試技術(shù)方面的集成徒仓,而不需要將代碼實際發(fā)布到服務(wù)器上。這需要我們使用嵌入式的容器誊垢〉舫冢可以用CDI-Unit或者Arquillian這種功能強大的Runner ,它可以模擬J2EE容器環(huán)境喂走。
以上測試都是代碼級別的測試殃饿,之后作者專門用一小章來探討系統(tǒng)測試。
系統(tǒng)測試
系統(tǒng)測試是把代碼發(fā)布到類產(chǎn)品環(huán)境來進行測試芋肠。如果依賴于外部系統(tǒng)的話乎芳,還需要mock這些外部系統(tǒng)來實現(xiàn)測試的可預(yù)測性,這是以前我們的測試不曾注意的帖池。對于DB是否屬于外部系統(tǒng)需要被mock掉奈惑,要看情況而定。
對于外部系統(tǒng)的Mock睡汹,如果是http請求肴甸,可以使用WireMock之類的mock http server,并通過Kubernetes之類的容器管理工具來統(tǒng)一管理囚巴。
性能測試
性能測試通過用機器模仿用戶行為并收集一些關(guān)鍵值:響應(yīng)時間原在,錯誤率等,來獲取對系統(tǒng)的insight彤叉。壓力測試則是獲取服務(wù)器最大能承受的訪問量等數(shù)據(jù)庶柿。性能測試和其他測試不一樣,不是簡單的通過不通過的測試秽浇,而是通過持續(xù)收集性能測試的數(shù)據(jù)浮庐,我們可以發(fā)現(xiàn)系統(tǒng)中不同功能的性能的變化趨勢,在影響客戶體驗之前能及時發(fā)現(xiàn)問題柬焕。
常用工具Gatling, Apache JMeter
維護測試
難以維護的測試屢見不鮮审残。開發(fā)者往往不把測試當(dāng)做產(chǎn)品代碼的一部分來對待,導(dǎo)致寫得隨意击喂,直接的現(xiàn)象就是測試缺乏抽象维苔,寫出的一個巨大的測試方法里實現(xiàn)了各種功能碰辅,而沒有抽象出方法和類懂昂。
系統(tǒng)測試可以用BDD的風(fēng)格來寫,從而達到比較好的抽象層次没宾。這時候可以用一些支持BBT(Behavior Based Testing )或者叫SBT(Specification Based Testing)語法的測試框架凌彬,如Cucumber-JVM, FitNesse沸柔。還提到了可以自定義assertde AssertJ, 基于SBT的Spock Testing Framework(使用Groovy語言).