《單元測(cè)試之道Java版》的讀書(shū)筆記
總覽
這是本相對(duì)簡(jiǎn)單的書(shū),書(shū)中采用的JUnit的版本也是舊的,但是在新的JUnit4下稍做修改依然可以運(yùn)行。重要的是通過(guò)這本書(shū)了解JUnit在Java的單元測(cè)試中是如何使用的。
第2章 首個(gè)單元測(cè)試
計(jì)劃你的測(cè)試:測(cè)試不是無(wú)中生有的,也不是意想天開(kāi)的。是根據(jù)需要一點(diǎn)點(diǎn)添加的,幫助自己盡早地發(fā)現(xiàn)思考上的誤區(qū)。參看這章給出的例子,原來(lái)理所當(dāng)然正確的,結(jié)果不一定是正確的。
第3章 使用JUnit編寫(xiě)測(cè)試
3.1 構(gòu)建單元測(cè)試
測(cè)試代碼必須要做的幾件事情:
- 準(zhǔn)備測(cè)試的條件(創(chuàng)建對(duì)象、分配資源等等)
- 調(diào)用測(cè)試的方法
- 驗(yàn)證測(cè)試方法的行為與期望是否相符
- 測(cè)試結(jié)束后清理現(xiàn)場(chǎng)(釋放資源等等)
3.2 JUnit的各種斷言
斷言:JUnit提供的輔助函數(shù),幫助你確認(rèn)被測(cè)試函數(shù)是否正確運(yùn)行。
后面還介紹了(3.5 JUnit的自定義斷言)
3.3 JUnit框架
這章是基于JUnit3.x寫(xiě)的,建議了解就可以了,因?yàn)镴Unit4的變化較大,使用也更方便直觀,因此直接參考JUnit4的幫助。
框架運(yùn)行順序 | 對(duì)應(yīng)于標(biāo)簽 |
---|---|
setUpBeforeClass() | @BeforeClass |
setUp() | @Beofre |
testMethod1() | |
tearDown() | @After |
setUp() | @Before |
testMethod2() | |
tearDown() | @After |
tearDownAfterClass() | @AfterClass |
4. 測(cè)試什么?
6個(gè)需要測(cè)試的地方(Right-BICEP):
- Right:結(jié)果是否正確(Right);
- B:邊界(Boundary)條件是否正確(CORRECT);參考第5章
- I:能否檢查反向(Inverse)關(guān)系;
- C:進(jìn)行交叉檢查(Cross-Check)的其他手段;
- E:強(qiáng)制錯(cuò)誤(Error)條件發(fā)生;使用Mock對(duì)象實(shí)現(xiàn),參考第6章
- P:滿足性能(Performance)的要求。
測(cè)試內(nèi)容較多時(shí),可以使用測(cè)試數(shù)據(jù)文件進(jìn)行準(zhǔn)備。但是使用文件后就沒(méi)有測(cè)試代碼看起來(lái)那么直觀了,因此除非測(cè)試內(nèi)容非常復(fù)雜,否則沒(méi)有必要采用這樣的方式。并且如果測(cè)試文件出現(xiàn)錯(cuò)誤(作者書(shū)中就出現(xiàn)了數(shù)據(jù)錯(cuò)誤),還會(huì)導(dǎo)致測(cè)試不通過(guò),增加了維護(hù)的成本。
5.CORRECT(正確的)邊界條件
- 一致性(Conformance):值是否符合預(yù)期的格式;
- 有序性(Ordering):一組值是否符合對(duì)排序的要求(有序性、無(wú)序性);
- 區(qū)間性(Range):值是否在合理取值范圍內(nèi)(在最小值與最大值之間);
- 引用(Reference)-耦合性:代碼是否引用了不受代碼本身直接控制的外部因素;
- 存在性(Existence):值是否存在(例如:非NULL,非零,包含于某個(gè)集合等等)
- 基數(shù)性(Cardinality):是否恰好有足夠的值;(也稱為集合的勢(shì),即集合里面包含的元素個(gè)數(shù))
- 時(shí)間性(Time)-絕對(duì)時(shí)間和相對(duì)時(shí)間:所有的事情是否按照順序發(fā)生?是否在正確的時(shí)間發(fā)生?是否及時(shí)發(fā)生?
6.使用Mock對(duì)象
Mock對(duì)象解決的問(wèn)題:
- 真實(shí)對(duì)象具有不可確定的行為(如:股票行情);
- 真實(shí)對(duì)象很難被創(chuàng)建;
- 真實(shí)對(duì)象的某些行為很難被觸發(fā)(如:網(wǎng)絡(luò)錯(cuò)誤);
- 真實(shí)對(duì)象令程序的運(yùn)行速度很慢;
- 真實(shí)對(duì)象有用戶界面或者就是用戶界面;
- 真實(shí)對(duì)象需要被詢問(wèn)它是如何被調(diào)用的(如:驗(yàn)證某個(gè)回調(diào)函數(shù)是否被調(diào)用);
- 真實(shí)對(duì)象實(shí)際上不存在(如:其他開(kāi)發(fā)小組的接口、或者某個(gè)沒(méi)有的硬件產(chǎn)品)。
Mock對(duì)象解決的步驟:
- 使用一個(gè)接口來(lái)描述這個(gè)對(duì)象;
- 為產(chǎn)品代碼實(shí)現(xiàn)這個(gè)接口;
- 以測(cè)試為目的,在Mock對(duì)象中實(shí)現(xiàn)這個(gè)接口。
注:這里的Mock不是網(wǎng)上已經(jīng)形成框架的Mock工具,是Mock的實(shí)現(xiàn)原理。作者推薦的Mock工具是EasyMock。其他的Mock工具可以參考《[使用Mock進(jìn)行單元測(cè)試]》(https://blog.csdn.net/u011393781/article/details/52669772)
7. 好的測(cè)試所具有的品質(zhì)(A-TRIP)
- 自動(dòng)化(Automatic):自動(dòng)化地調(diào)用測(cè)試和檢查結(jié)果;常用的持續(xù)集成工具
- 徹底的(Thorough):測(cè)試了所有需求關(guān)注的情況;常用的代碼覆蓋工具
- 可重復(fù)(Repeatable):每個(gè)測(cè)試應(yīng)該獨(dú)立于其他所有的測(cè)試,還必須獨(dú)立于環(huán)境,從而可以重復(fù)地執(zhí)行,并且產(chǎn)生相同的結(jié)果。
- 獨(dú)立的(Independent):確保一個(gè)函數(shù)只針對(duì)一樣測(cè)試,并且這個(gè)測(cè)試不依賴于其他測(cè)試。
- 專業(yè)的(Professional):測(cè)試代碼應(yīng)該與產(chǎn)品代碼的編碼風(fēng)格和編寫(xiě)質(zhì)量相同
如何確保測(cè)試代碼是正確的呢?
- 對(duì)產(chǎn)品代碼中的Bug進(jìn)行修改的時(shí)候也改進(jìn)測(cè)試代碼;(因?yàn)檫@個(gè)Bug是測(cè)試代碼沒(méi)有發(fā)現(xiàn)的)
- 在產(chǎn)品代碼中引入Bug來(lái)驗(yàn)證測(cè)試代碼的正確性。(確保可能會(huì)發(fā)生的錯(cuò)誤被測(cè)試代碼捕捉到了)
8. 在項(xiàng)目中進(jìn)行測(cè)試
- 把測(cè)試代碼與產(chǎn)品代碼放在一個(gè)目錄下;
- 與別人共享代碼的時(shí)候,需要確保你的代碼可以通過(guò)所有測(cè)試;
- 測(cè)試的時(shí)間點(diǎn):
- 編寫(xiě)新的函數(shù);
- 修正Bug;
- 每次成功編譯之后;
- 每次對(duì)版本控制的提交;
- 持續(xù)不斷地由專門(mén)的機(jī)器來(lái)運(yùn)行完整的構(gòu)建和測(cè)試。
- 測(cè)試別人的項(xiàng)目代碼:其實(shí)就是維護(hù)別人的項(xiàng)目絕對(duì)是個(gè)大問(wèn)題,同時(shí)也是個(gè)必須面對(duì)的問(wèn)題。需要理性的態(tài)度(不批評(píng)別人的代碼)、冷靜的手段(不隨便修改別人的代碼)、持久的耐心(先從測(cè)試代碼開(kāi)始,慢慢重構(gòu)項(xiàng)目代碼,使之重新回到健康狀態(tài))、真正的智慧(知道什么樣的項(xiàng)目應(yīng)該達(dá)到什么樣的目標(biāo),不執(zhí)著于重構(gòu)成一個(gè)完美的狀態(tài),也不簡(jiǎn)單放棄隨之自生自滅。)
- 測(cè)試與評(píng)審:三個(gè)臭皮匠頂個(gè)諸葛亮,放下自我的執(zhí)著,接納各種不同的意見(jiàn),才能做出令自己滿意的項(xiàng)目。
9. 設(shè)計(jì)話題
- 面向測(cè)試的設(shè)計(jì):不方便測(cè)試的設(shè)計(jì)不是好的設(shè)計(jì);說(shuō)明設(shè)計(jì)過(guò)于僵化或者臃腫,需要簡(jiǎn)化或者修改使之更利用未來(lái)的擴(kuò)展和維護(hù)。
- 面向測(cè)試的重構(gòu):不方便測(cè)試的代碼不是好的代碼;說(shuō)明業(yè)務(wù)混雜在一起,無(wú)法實(shí)現(xiàn)一個(gè)函數(shù)只針對(duì)一樣測(cè)試,需要修改設(shè)計(jì)使業(yè)務(wù)分離。
- 測(cè)試類的不變性:就是對(duì)類的斷言必須為真。
- 有序性。例如:sorted list類的不變性就是無(wú)論發(fā)生什么,結(jié)果都應(yīng)該是有序的。
- 結(jié)構(gòu)化。例如:訂單系統(tǒng)中每個(gè)條目必須屬于一個(gè)訂單,一個(gè)訂單擁有一個(gè)或多個(gè)條目。
- 數(shù)學(xué)不變性。例如:銀行賬號(hào)的的借貸必須平衡。
- 數(shù)據(jù)一致性。例如:商品總數(shù)=庫(kù)存數(shù)+銷售數(shù)。
- 測(cè)試驅(qū)動(dòng)的設(shè)計(jì)。使你作為產(chǎn)品代碼的用戶在編碼,而不是產(chǎn)品開(kāi)發(fā)者在編碼,開(kāi)發(fā)結(jié)果更能反應(yīng)用戶的需求。
- 測(cè)試無(wú)效的參數(shù)。當(dāng)你作為產(chǎn)品代碼的用戶時(shí),你才能真正確定哪些責(zé)任應(yīng)該你來(lái)承擔(dān),而哪些是不需要的。例如:無(wú)效的參數(shù)應(yīng)該由哪個(gè)函數(shù)來(lái)承擔(dān)檢查責(zé)任呢?
posted on 2019-01-16 17:57 zYx.Tom 閱讀(200) 評(píng)論(0) 編輯 收藏 所屬分類: 7.學(xué)習(xí)日志