隐藏在mock之后的‘快感’
?? ? ?最近某同事抱怨他們的測試難寫,經(jīng)常花費(fèi)在測試的時間比產(chǎn)品代碼更多,而且每次重構(gòu)后都必須修改一大堆的測試。和同事閑談后得知,在其項(xiàng)目中大量的使用了mock,或者說對mock的使用過度極端對所謂的單元測試“快速”,“獨(dú)立“的過度。 在前邊轉(zhuǎn)載過《軟件開發(fā)中沒有所謂正確的方法》,當(dāng)你把某一種方法論作為銀彈使用的時候,早晚魔鬼會伴隨在你身邊。
? ? ?Mock給我?guī)砹烁兄?#xff0c;剝離了類與類之間的依賴,有助于我們更好的工作在當(dāng)前的關(guān)注點(diǎn) .但同時由于太多的對場景的假設(shè),導(dǎo)致這塊代碼成為了信息的孤島,甚至很多時候不得不用mock的第二特性verify,order,以至于你的測試關(guān)心的不再是代碼存在的business邏輯,而傾向代碼層面的設(shè)計實(shí)現(xiàn),這就把你單元測試推向了“白盒測試“的位置,導(dǎo)致測試變?yōu)榇嗳醯臏y試。每當(dāng)簡單的重構(gòu)導(dǎo)致內(nèi)部的變化,你的測試也必須隨著改變。
? ? ?鄙人認(rèn)為作為一個好的測試而言,在一次合法的簡單重構(gòu)之下,是不需要修改測試的,因?yàn)槟阈薷牡闹皇莾?nèi)部實(shí)現(xiàn),而不是business的改變,如果你邊改測試邊重構(gòu)或者重構(gòu)后掛到一大堆測試,這意味這你的測試不是一個穩(wěn)定的測試或者你不是一次合法的重構(gòu)(也許redesign,override)。
? ? ?在同事的項(xiàng)目中對mock的極端到了對簡單的View Object 也采用builder模式,可是內(nèi)部卻全是mock given。在我看來而言View Object只是一個簡單的數(shù)據(jù)載體,不存在行為邏輯,我們毫無必要去做mock,mock該是針對假設(shè),而應(yīng)該盡量避免對狀態(tài)mock。在同事的項(xiàng)目中導(dǎo)致需要寫一個測試之前,作為測試的準(zhǔn)備given ,必須理解存在代碼的實(shí)現(xiàn),因?yàn)槟阈枰欢裧iven,比如對于person對象,如果你在實(shí)現(xiàn)中需要得到account則:
given(person.getAccount()).willReturn(some account);
? ? ?導(dǎo)致我需要了解實(shí)現(xiàn)需要什么property,如果我需要新的的property也許只是簡單的把某個“依戀情結(jié)”放入了object,測試也需要被修改,導(dǎo)致重構(gòu)者對自己的重構(gòu)并不那么自信,這將影響重構(gòu)成為日常行為,隨著堆積的”壞味道“這將一點(diǎn)一點(diǎn)的侵蝕你的代碼,項(xiàng)目慢慢的也許會不能的不可控。
? ? ?Mock并不是一個壞的東西,結(jié)果的好壞在于使用的人,團(tuán)隊(duì) 的意識,如果是mock anywhere或者杜絕mock走向兩個任意的極端都將是一個錯誤的抉擇。
? ? ?Mock更多的使用場景為對外界資源解依賴增強(qiáng)感知能力,以及對無響應(yīng)的重要business的驗(yàn)證,后者長體現(xiàn)于一個沒有返回子void的method,但是method比如增加用戶積分,記錄用戶信息等的。然而對于有響應(yīng)的business,我需要的不是mock而應(yīng)該是assert,對于測試來說對于business來說應(yīng)試是我的輸入應(yīng)該得到我預(yù)期的響應(yīng),而非我verify某個行為發(fā)生了,那么其結(jié)果一定就正確,當(dāng)然對于實(shí)現(xiàn)來說這是成立的,但是從測試的價值來說這廝無意義的,這將是一個脆弱的測試,我認(rèn)為一個好的測試將是“黑盒測試“,是一個business的描述,對一份約定,契約的闡述。
? ? ? 附言,如果你因?yàn)闇y試的速度,獨(dú)立性來為自己的mock證明,那將是無意義的,不是每一個測試都必須在黃金法則內(nèi)(0.1s),如果你對外部依賴,耗時依賴的分離,這我相信將不再是問題所在,測試的優(yōu)化將是另一個有趣的話題,將不是本文內(nèi)容之列。
?
?
總結(jié)
以上是生活随笔為你收集整理的隐藏在mock之后的‘快感’的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: func_num_args()
- 下一篇: 创业需要些什么