tdd 单元测试_何时给定在单元测试和TDD中的重要性
tdd 單元測(cè)試
最近,我一直在寫與自動(dòng)測(cè)試有關(guān)的更高級(jí)的概念(主要與Spock有關(guān))。 但是,在進(jìn)行測(cè)試培訓(xùn)時(shí),我清楚地看到,通常對(duì)特定工具的知識(shí)并不是主要問(wèn)題。 即使使用Spock,也可以編寫腫且難以維護(hù)的測(cè)試,從而破壞(或不了解)與編寫單元測(cè)試有關(guān)的良好實(shí)踐。 因此,我決定寫一些更基本的東西來(lái)促進(jìn)它們,并且在指導(dǎo)經(jīng)驗(yàn)不足的同事時(shí)準(zhǔn)備使用一些參考材料。
介紹
編寫良好的單元測(cè)試應(yīng)滿足幾個(gè)要求,這是整個(gè)系列的主題。 在這篇博客文章中,我想提出一個(gè)相當(dāng)成熟的概念,即將單元測(cè)試劃分為具有嚴(yán)格定義的功能的3個(gè)單獨(dú)的塊(依次是行為驅(qū)動(dòng)開(kāi)發(fā)的子集)。
單元測(cè)試通常集中于測(cè)試給定單元(通常是一個(gè)給定類)的某些特定行為。 與通過(guò)UI執(zhí)行的驗(yàn)收測(cè)試相反,在每個(gè)測(cè)試中都將存根/模擬作為其協(xié)作者,從零開(kāi)始設(shè)置一個(gè)要測(cè)試的類(測(cè)試中的類)比較便宜(快速)。 因此,性能應(yīng)該不是問(wèn)題。
樣品測(cè)試
為了演示規(guī)則,我將使用一個(gè)小示例。 ShipDictionary是一個(gè)類,提供根據(jù)特定條件(按名稱的一部分,生產(chǎn)年份等)搜索太空船的功能。 該詞典由不同的船舶索引(在役,退役,在生產(chǎn)等中的船舶)提供動(dòng)力。 在那個(gè)特定的測(cè)試中,它被測(cè)試了按其名稱的一部分搜索飛船的能力。
private static final String ENTERPRISE_D = "USS Enterprise (NCC-1701-D)";@Test public void shouldFindOwnShipByName() { //given ShipDatabase shipDatabase = new ShipDatabase(ownShipIndex, enemyShipIndex); given(ownShipIndex.findByName("Enterprise")).willReturn(singletonList(ENTERPRISE_D)); //when List foundShips = shipDatabase.findByName("Enterprise"); //then assertThat(foundShips).contains(ENTERPRISE_D); }給定時(shí)間
測(cè)試驅(qū)動(dòng)開(kāi)發(fā)方法和行為驅(qū)動(dòng)開(kāi)發(fā)方法中都存在的良好習(xí)慣是“先驗(yàn)”知識(shí),它將在特定測(cè)試用例中進(jìn)行測(cè)試(認(rèn)定)。 可以以更正式的方式(例如,用Cucumber/小Cucumber編寫的用于驗(yàn)收測(cè)試的方案)或以自由形式(例如,特別注意的要點(diǎn)或只是下一步應(yīng)該做什么的想法)來(lái)完成。 有了這些知識(shí),就很容易確定整個(gè)測(cè)試將組成的三個(gè)關(guān)鍵部分(分開(kāi)的部分)。
給定–準(zhǔn)備
在單元測(cè)試的第一部分(稱為given )中,需要?jiǎng)?chuàng)建一個(gè)實(shí)際對(duì)象實(shí)例,在該對(duì)象實(shí)例上將執(zhí)行測(cè)試的操作。 在有重點(diǎn)的單元測(cè)試中,僅放置一類要測(cè)試的邏輯。 另外,執(zhí)行測(cè)試所需的其他對(duì)象(稱為協(xié)作者)應(yīng)初始化為存根/模擬,并適當(dāng)存根(如果需要)。 還必須將所有協(xié)作者注入到要測(cè)試的對(duì)象中,該對(duì)象通常與該對(duì)象創(chuàng)建結(jié)合在一起(因?yàn)闃?gòu)造函數(shù)注入應(yīng)該是依賴注入的首選技術(shù))。
//given ShipDatabase shipDatabase = new ShipDatabase(ownShipIndex, enemyShipIndex); given(ownShipIndex.findByName("Enterprise")).willReturn(singletonList(ENTERPRISE_D));何時(shí)–執(zhí)行
在when部分中,將執(zhí)行要測(cè)試的操作。 在我們的情況下,這是一個(gè)搜索請(qǐng)求,然后將結(jié)果存儲(chǔ)在變量中以供進(jìn)一步聲明。
//when List foundShips = shipDatabase.findByName("Enterprise");在大多數(shù)情況下,在該部分中僅執(zhí)行一項(xiàng)操作是一件好事。 更多的元素可能表明嘗試測(cè)試多個(gè)操作(可能)可以分為多個(gè)測(cè)試。
然后–斷言
-最后一節(jié)的責(zé)任, then -主要是先前接收到的結(jié)果的斷言。 它應(yīng)該等于期望值。
//then assertThat(foundShips).contains(ENTERPRISE_D);此外,可能有必要對(duì)聲明的模擬執(zhí)行方法執(zhí)行的驗(yàn)證。 這不應(yīng)該是一種常見(jiàn)的做法,因?yàn)樵诖蠖鄶?shù)情況下,對(duì)接收值的聲明足以確認(rèn)所測(cè)試的代碼能夠按預(yù)期工作(根據(jù)設(shè)置的邊界)。 但是,特別是對(duì)于測(cè)試void方法,需要驗(yàn)證是否已使用預(yù)期參數(shù)執(zhí)行了特定方法。
AAA aka 3A –一種替代語(yǔ)法
正如我已經(jīng)提到的,BDD是一個(gè)更廣泛的概念,它對(duì)于編寫具有預(yù)先定義的需求(通常是非技術(shù)形式)的功能/驗(yàn)收測(cè)試特別方便。 一種替代的測(cè)試劃分語(yǔ)法(對(duì)于各節(jié)而言,含義非常相似)是“ 配置行為聲明”,通常縮寫為AAA或3A。 如果您根本不使用BDD,并且三個(gè)字母比GWT更容易記住,那么使用它來(lái)創(chuàng)建相同的高質(zhì)量單元測(cè)試就很好。
調(diào)整與優(yōu)化
將實(shí)用工具和方法學(xué)與持續(xù)進(jìn)行的技能獲取過(guò)程(也稱為Dreyfus模型 )進(jìn)行匹配的過(guò)程已在《 實(shí)用思維與學(xué)習(xí):重構(gòu)您的濕軟件 》一書中進(jìn)行了很好的描述。 當(dāng)然,在許多情況下,使用given節(jié)移至setup/init/before節(jié)或內(nèi)聯(lián)初始化的測(cè)試的簡(jiǎn)化變體可能很方便。 同樣可以適用于when和then部分,其可以被合并在一起(成expect部分,特別是在參數(shù)化測(cè)試)。 具有編寫單元測(cè)試的經(jīng)驗(yàn)和流利性,使用速記和優(yōu)化(尤其是測(cè)試一些非平凡的案例)是完全有效的。 只要整個(gè)團(tuán)隊(duì)都了解約定,并且能夠記住有關(guān)編寫好的單元測(cè)試的基本假設(shè)。
摘要
根據(jù)我在軟件開(kāi)發(fā)方面的經(jīng)驗(yàn)以及作為一名培訓(xùn)師,我清楚地看到,將(單元)測(cè)試劃分為多個(gè)部分可以使它們更短,更易理解,尤其是團(tuán)隊(duì)中經(jīng)驗(yàn)不足的人員。 與明確找出并立即將所有內(nèi)容寫入測(cè)試中相比,用明確定義的責(zé)任來(lái)填充3個(gè)部分更容易。 最后,特別是對(duì)于僅閱讀本文第一部分和最后部分的人們,此處遵循以下簡(jiǎn)明規(guī)則:
- given –測(cè)試中的對(duì)象初始化+存根/模擬的創(chuàng)建,存根和注入
- when –在給定測(cè)試中進(jìn)行測(cè)試的操作
- then –收到結(jié)果聲明+模擬驗(yàn)證(如果需要)
PS最好在IDE中設(shè)置一個(gè)測(cè)試模板,以保護(hù)編寫每個(gè)測(cè)試所需的許多擊鍵。
PSS,您發(fā)現(xiàn)本文很有用,您可以讓我知道,以鼓勵(lì)我將來(lái)寫更多有關(guān)單元測(cè)試的基礎(chǔ)知識(shí)。
圖片來(lái)源:Tomas Sobek,Openclipart, https ://openclipart.org/detail/242959/old-scroll
自我提升 。 您想快速有效地提高您和您的團(tuán)隊(duì)的測(cè)試技能以及對(duì)Spock / JUnit / Mockito / AssertJ的了解嗎? 我進(jìn)行了濃縮(單元) 測(cè)試培訓(xùn) ,您可能會(huì)覺(jué)得有用。
翻譯自: https://www.javacodegeeks.com/2017/05/importance-given-unit-tests-tdd.html
tdd 單元測(cè)試
總結(jié)
以上是生活随笔為你收集整理的tdd 单元测试_何时给定在单元测试和TDD中的重要性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 鹰金钱甘竹牌哪个好
- 下一篇: 扩展 junit 框架_JUnit 5扩