BDD(行為驅(qū)動(dòng)開(kāi)發(fā))學(xué)習(xí)筆記

原文:行為驅(qū)動(dòng)開(kāi)發(fā)
BDD的起源介紹

BDD旨在解決具體問(wèn)題粱玲,幫助開(kāi)發(fā)人員確定應(yīng)該測(cè)試些什么墙歪。它提供了一個(gè)DSL( Domain-specific language乌企,域特定語(yǔ)言)鼓勵(lì)開(kāi)發(fā)者弄清楚他們的需求晌该,并且它引入了一個(gè)通用語(yǔ)言幫助你輕易理解測(cè)試的目的拱层。

Q:我應(yīng)該測(cè)試什么弥臼?
A:測(cè)試你對(duì)象的行為方式

BDD框架

Swift專用的BDD框架:

對(duì)比:

Cedar捆綁了匹配置換根灯,還包含了額外的配置功能:集中測(cè)試径缅,提供了反向配置能力,但它用了一點(diǎn)黑客技術(shù)才能與XCTest集成烙肺,所以如果XCTest改變了的話纳猪,Cedar容易失效。

Kiwi同樣捆綁了匹配模塊以及stubsmocks桃笙,但缺乏像 Cedar一樣的可配置性功能氏堤。

Specta缺少匹配,也沒(méi)有mocks或者stubs搏明,但它緊密地與XCTest結(jié)合在一起并且提供了近似Cedar的可配置性的能力鼠锈。

依賴注入(Dependency Injection)

原文:依賴注入

DI本身是在彰顯一個(gè)更高層面的概念:代碼組成了模塊,模塊拼接構(gòu)建成了應(yīng)用本身星著。

  • 構(gòu)造器注入:構(gòu)造器注入购笆,即將某個(gè)依賴對(duì)象傳入到構(gòu)造器中 (在 Objective- C中指 designated 初始化方法) 并存儲(chǔ)起來(lái),以便在后續(xù)過(guò)程中使用虚循;

注意:盡管 Objective-C 本身沒(méi)有所謂的構(gòu)造器而是使用初始化方法同欠,但因?yàn)闃?gòu)造器注入是 DI 的標(biāo)準(zhǔn)概念,放到各種語(yǔ)言中也是普遍適用的横缔,所以還是準(zhǔn)備用構(gòu)造器注入這個(gè)詞來(lái)代指初始化注入铺遂。

  • 屬性注入:采用屬性賦值方式,以便在后續(xù)過(guò)程中使用剪廉;
  • 方法注入:如果依賴對(duì)象只在某一個(gè)方法中被使用娃循,則可以利用方法參數(shù)做注入;
  • 環(huán)境上下文:當(dāng)通過(guò)一個(gè)類方法 (例如單例) 來(lái)訪問(wèn)依賴對(duì)象時(shí)斗蒋,在單元測(cè)試中可以通過(guò)兩種方式來(lái)控制依賴對(duì)象捌斧。
    • 如果可以控制單例本身,則可以通過(guò)公開(kāi)其屬性來(lái)控制其狀態(tài)泉沾;
    • 如果上述方式無(wú)效或者所操作的單例不歸自己管理捞蚂,此時(shí)就該運(yùn)用swizzling了:直接替換類方法,讓其返回你所期望的返回值跷究。

寫測(cè)試

測(cè)試用例使我們的代碼質(zhì)量變得可靠姓迅,同時(shí)讓我們能夠放心地重構(gòu)或者修改代碼,并保證我們的修改沒(méi)有破壞其他部分俊马。
原文:糟糕的測(cè)試

可以根據(jù)Given-When-Then模式來(lái)組織我們的測(cè)試用例丁存。

寫測(cè)試的時(shí)候問(wèn)自己兩個(gè)問(wèn)題:

  • “如果我修改了我的生產(chǎn)代碼,測(cè)試是會(huì)失敗 (還是通過(guò)) 呢?”
  • “那是一個(gè)讓測(cè)試失敗 (或者通過(guò)) 的好的理由么?”

測(cè)試的基本準(zhǔn)則(F.I.R.S.T.)

  • 很快速(Fast) —— 測(cè)試應(yīng)該能夠被經(jīng)常執(zhí)行柴我。
  • 能隔離(Isolated) —— 測(cè)試本身不能依賴于外部因素或者其他測(cè)試的結(jié)果解寝。
  • 可重復(fù)(Repeatable) —— 每次運(yùn)行測(cè)試都應(yīng)該產(chǎn)生相同的結(jié)果。
  • 帶自檢(Self-verifying) —— 測(cè)試應(yīng)該包括斷言艘儒,不需要人為干預(yù)聋伦。
  • 夠及時(shí)(Timely) —— 測(cè)試應(yīng)該和生產(chǎn)代碼一同書寫。

注意:測(cè)試中一個(gè)最重要的關(guān)鍵點(diǎn)是降低未來(lái)的變化所帶來(lái)的成本界睁,不要將測(cè)試和實(shí)現(xiàn)細(xì)節(jié)耦合在一起觉增。

  • 不要測(cè)試私有方法:可以進(jìn)行置換測(cè)試
  • 不要 Stub 私有方法:stub 私有方法將會(huì)使程序難以調(diào)試
  • 不要 Stub 外部庫(kù):第三方代碼不應(yīng)該在你的測(cè)試中直接出現(xiàn)。
  • 正確地 Stub 依賴
  • 不要測(cè)試構(gòu)造函數(shù):構(gòu)造函數(shù)定義的是實(shí)現(xiàn)細(xì)節(jié)翻斟,你不應(yīng)該測(cè)試構(gòu)造函數(shù)逾礁。

置換測(cè)試: Mock, Stub etc.

用一些模擬代碼替換你的實(shí)際代碼來(lái)編寫一些測(cè)試用例
原文:置換測(cè)試: Mock, Stub 和其他

mock測(cè)試就是在測(cè)試過(guò)程中,對(duì)于某些不容易構(gòu)造或者不容易獲取的對(duì)象访惜,用一個(gè)虛擬的對(duì)象來(lái)創(chuàng)建以便測(cè)試的測(cè)試方法敞斋。

  • double可以理解為置換,它是所有模擬測(cè)試對(duì)象的統(tǒng)稱疾牲,我們也可以稱它為替身植捎。一般來(lái)說(shuō),當(dāng)你創(chuàng)建任意一種測(cè)試置換對(duì)象時(shí)阳柔,它將被用來(lái)替代某個(gè)指定類的對(duì)象焰枢。

  • stub可以理解為測(cè)試樁,它能實(shí)現(xiàn)當(dāng)特定的方法被調(diào)用時(shí)舌剂,返回一個(gè)指定的模擬值济锄。如果你的測(cè)試用例需要一個(gè)伴生對(duì)象來(lái)提供一些數(shù)據(jù),可以使用 stub 來(lái)取代數(shù)據(jù)源霍转,在測(cè)試設(shè)置時(shí)可以指定返回每次一致的模擬數(shù)據(jù)荐绝。

  • spy可以理解為偵查,它負(fù)責(zé)匯報(bào)情況,持續(xù)追蹤什么方法被調(diào)用了嘀韧,以及調(diào)用過(guò)程中傳遞了哪些參數(shù)氨菇。你能用它來(lái)實(shí)現(xiàn)測(cè)試斷言呆奕,比如一個(gè)特定的方法是否被調(diào)用或者是否使用正確的參數(shù)調(diào)用咏雌。當(dāng)你需要測(cè)試兩個(gè)對(duì)象間的某些協(xié)議或者關(guān)系時(shí)會(huì)非常有用包帚。

  • mockspy類似庆揩,但在使用上有些許不同贸人。spy 追蹤所有的方法調(diào)用婶溯,并在事后讓你寫斷言鲸阔,而 mock 通常需要你事先設(shè)定期望。你告訴它你期望發(fā)生什么迄委,然后執(zhí)行測(cè)試代碼并驗(yàn)證最后的結(jié)果與事先定義的期望是否一致褐筛。

  • fake是一個(gè)具備完整功能實(shí)現(xiàn)和行為的對(duì)象,行為上來(lái)說(shuō)它和這個(gè)類型的真實(shí)對(duì)象上一樣叙身,但不同于它所模擬的類渔扎,它使測(cè)試變得更加容易。一個(gè)典型的例子是使用內(nèi)存中的數(shù)據(jù)庫(kù)來(lái)生成一個(gè)數(shù)據(jù)持久化對(duì)象曲梗,而不是去訪問(wèn)一個(gè)真正的生產(chǎn)環(huán)境的數(shù)據(jù)庫(kù)赞警。

對(duì)不同類型的模擬測(cè)試對(duì)象更多的細(xì)節(jié)討論參考:"Mocks Aren't Stubs"

Mock框架

模擬測(cè)試時(shí)的注意事項(xiàng):

  • 依賴注入是你的好伙伴:使用依賴注入的話,你會(huì)發(fā)現(xiàn)使用 stub 和 mock 方式寫測(cè)試要容易的多虏两;
  • 不要模擬你沒(méi)有的:應(yīng)該只為你代碼庫(kù)本身?yè)碛械膶?duì)象創(chuàng)建 mock 或 stub愧旦,而不是為第三方依賴或一些庫(kù)去創(chuàng)建。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末定罢,一起剝皮案震驚了整個(gè)濱河市笤虫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祖凫,老刑警劉巖琼蚯,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惠况,居然都是意外死亡遭庶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門稠屠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)峦睡,“玉大人,你說(shuō)我怎么就攤上這事权埠≌チ耍” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵攘蔽,是天一觀的道長(zhǎng)龙屉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)满俗,這世上最難降的妖魔是什么转捕? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任作岖,我火速辦了婚禮,結(jié)果婚禮上瓜富,老公的妹妹穿的比我還像新娘鳍咱。我一直安慰自己降盹,他們只是感情好与柑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蓄坏,像睡著了一般价捧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涡戳,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天结蟋,我揣著相機(jī)與錄音,去河邊找鬼渔彰。 笑死嵌屎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恍涂。 我是一名探鬼主播宝惰,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼再沧!你這毒婦竟也來(lái)了尼夺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炒瘸,失蹤者是張志新(化名)和其女友劉穎淤堵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體顷扩,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拐邪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隘截。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扎阶。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖技俐,靈堂內(nèi)的尸體忽然破棺而出乘陪,到底是詐尸還是另有隱情,我是刑警寧澤雕擂,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布啡邑,位于F島的核電站,受9級(jí)特大地震影響井赌,放射性物質(zhì)發(fā)生泄漏谤逼。R本人自食惡果不足惜贵扰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望流部。 院中可真熱鬧戚绕,春花似錦、人聲如沸枝冀。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)果漾。三九已至球切,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绒障,已是汗流浹背吨凑。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留户辱,地道東北人鸵钝。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像庐镐,于是被迫代替她去往敵國(guó)和親恩商。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理焚鹊,服務(wù)發(fā)現(xiàn)痕届,斷路器,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 1.Creating mock objects 1.1Class mocks idclassMock=OCMCla...
    奔跑的小小魚閱讀 2,591評(píng)論 0 0
  • 前段時(shí)間在design+code購(gòu)買了一個(gè)學(xué)習(xí)iOS設(shè)計(jì)和編碼在線課程末患,使用Sketch設(shè)計(jì)App研叫,然后使用Swi...
    Sam_Lau閱讀 28,184評(píng)論 32 215
  • 文章作者:Tyan博客:noahsnail.com 3.4 依賴 標(biāo)準(zhǔn)企業(yè)應(yīng)用不會(huì)由一個(gè)對(duì)象(或Spring用語(yǔ)中...
    SnailTyan閱讀 1,180評(píng)論 0 1
  • 20160930 最近一個(gè)多禮拜胃口變得很差,什么都不想吃璧针。 雖然同事有說(shuō)過(guò)前三個(gè)月不用大補(bǔ)嚷炉,補(bǔ)也補(bǔ)不到孩子身上,...
    蕭蕭依舊閱讀 256評(píng)論 0 0