從測試代碼回推生產(chǎn)代碼壞味道

前言

寫單元測試常碰到的兩種問題:

  1. dependency 的問題,導(dǎo)致無法隔離相依,無法模擬或驗證相依對象的互動
  2. 要模擬的相依對象太多

其實,這都是散發(fā)著壞味道的象徵胃惜。

本文

當(dāng)在撰寫 isolated unit test 時發(fā)現(xiàn),要 stub 的對象太多時哪雕,往往是兩種 bad smell 的徵兆船殉。

  1. 單一職責(zé)的另一種 anti-pattern, 把一個職責(zé)過分拆細,導(dǎo)致要完成某一件事得組合太多零碎的相依對象才能運作斯嚎。(比較常見)
  2. 測試目標對象 (SUT) 的職責(zé)過大利虫,需要很多相依對象互動才能完成自己的職責(zé)挨厚。(機率較小)

另外要留意的一個要點糠惫,如果假對象都是 mock, 而非 stub, 那通常代表用錯了疫剃。

mock 是透過注入假對象,用來驗證測試目標與這個相依假對象之間的互動硼讽,也就是 assertion 的目的巢价。而 stub 對象是用來模擬相依對象的動作,以便讓單元測試能獨立驗證測試目標對象本身的邏輯是否正確固阁。

因為單元測試一次只測一件事壤躲,所以請勿同時對測試目標對象進行 assert, 又對 mock 對象進行 assert。因為這兩個 assert 的關(guān)注點备燃,勢必是不同件事碉克。

在《單元測試的藝術(shù)》一書上提到,mock 跟 stub 在實務(wù)上的比例大約是 5%:95%(個人經(jīng)驗差不多是 10%:90%)并齐。過多過細的 mock, 會讓 test cases 的穩(wěn)定度 (Robustness) 下降, 孩子生了就得養(yǎng)漏麦,所以需要生的時候再生就好。

剛好的 mock, 可以有效降低測試用例幾倍的維護成本冀膝。

如果你非得驗證到 mock 對象互動所接收到的參數(shù)唁奢,請記得「只驗證意義,例如透過 regex pattern窝剖。而不是驗證參數(shù)的所有細節(jié)」

補充

測試用例的撰寫與維護,往往是 production code 設(shè)計品質(zhì)的照妖鏡酥夭。如果你碰到以下的狀況赐纱,代表:

  1. 一個需求異動,要加好多的測試用例:代表違反單一職責(zé)與開放封閉原則熬北,應(yīng)該只需要新增 class 做切換疙描,而不是對原本內(nèi)容修改。
  2. 一個需求異動讶隐,要改好多測試用例:代表違反單一職責(zé)起胰,一個對象的職責(zé)太大。
  3. 要 stub 的對象很多:代表違反單一職責(zé)巫延,因為同一個職責(zé)被拆到太多對象身上效五,要做一件事就需要很多個對象一起,才能正常運作一件事炉峰。
  4. 互動的方式一改畏妖、參數(shù)一改,測試用例就壞:代表 mock 太深疼阔,mock 可以只驗證互動次數(shù)戒劫、參數(shù)的意義以及參數(shù)的完整內(nèi)容半夷,越後面代表綁得越深。
  5. UI 一改迅细,所有測試用例都要跟著修改:layout 與 scenario 耦合性太高巫橄,請透過 page object pattern 從測試程式設(shè)計上解耦。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茵典,一起剝皮案震驚了整個濱河市嗦随,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敬尺,老刑警劉巖枚尼,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異砂吞,居然都是意外死亡署恍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門蜻直,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盯质,“玉大人,你說我怎么就攤上這事概而『粝铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵赎瑰,是天一觀的道長王悍。 經(jīng)常有香客問我,道長餐曼,這世上最難降的妖魔是什么压储? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮源譬,結(jié)果婚禮上集惋,老公的妹妹穿的比我還像新娘。我一直安慰自己踩娘,他們只是感情好刮刑,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慌核。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天习寸,我揣著相機與錄音,去河邊找鬼傻工。 笑死霞溪,一個胖子當(dāng)著我的面吹牛孵滞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸯匹,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼坊饶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殴蓬?” 一聲冷哼從身側(cè)響起匿级,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎染厅,沒想到半個月后痘绎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肖粮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年孤页,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涩馆。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡行施,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魂那,到底是詐尸還是另有隱情蛾号,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布涯雅,位于F島的核電站鲜结,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斩芭。R本人自食惡果不足惜轻腺,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望划乖。 院中可真熱鬧,春花似錦挤土、人聲如沸琴庵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迷殿。三九已至,卻和暖如春咖杂,著一層夾襖步出監(jiān)牢的瞬間庆寺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工诉字, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留懦尝,地道東北人知纷。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像陵霉,于是被迫代替她去往敵國和親琅轧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 原來我非不快樂 始2016.6.27 聽說踊挠,能到達金字塔頂端的只有兩種動物乍桂,一是雄鷹,靠著自己的...
    _行走中的蝸牛_閱讀 1,504評論 1 8
  • 提問的智慧 How To Ask Questions The Smart Way Copyright ? 2001...
    Albert陳凱閱讀 2,247評論 0 8
  • 程序員創(chuàng)業(yè)白皮書 作者:Paul Graham Paul Graham是程序員效床,專欄作家睹酌。他在1995年創(chuàng)建了第一...
    劉立山John閱讀 1,880評論 0 20
  • 隨筆1-24(2015.6-10) 1、作者 才華不是財富剩檀,痛苦不是財富憋沿,用才華對痛苦進行思考和表達才是。於是有了...
    四葉閱讀 1,486評論 3 14
  • 【杯子技巧】 和對方的交情還屬於曖昧不清的階段谨朝,正確掌握和對方的距離感卤妒,是很困難的事。 最可怕的是字币,你覺得兩人的感...
    77733261dbff閱讀 646評論 0 0