日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

tdd 单元测试_何时给定在单元测试和TDD中的重要性

發(fā)布時(shí)間:2023/12/3 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tdd 单元测试_何时给定在单元测试和TDD中的重要性 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。