單元測(cè)試的理解和應(yīng)用

基礎(chǔ)


單元測(cè)試是什么?

單元測(cè)試是一段自動(dòng)化的代碼,這段代碼調(diào)用被測(cè)試的工作單元,之后對(duì)這個(gè)單元的單個(gè)最終結(jié)果的某些假設(shè)進(jìn)行檢驗(yàn)。單元測(cè)試幾乎都是用單元測(cè)試框架編寫的。單元測(cè)試容易編寫,能快速運(yùn)行。單元測(cè)試可靠、可讀、并且可維護(hù)。只要產(chǎn)品代碼不發(fā)生變化,單元測(cè)試的結(jié)果是穩(wěn)定的。

簡(jiǎn)單來(lái)說(shuō)就是,開發(fā)人員編寫的一小段代碼,用于檢驗(yàn)被測(cè)代碼的一個(gè)有明確功能的小模塊是否正確。

  • 通常用來(lái)判斷某個(gè)類或者函數(shù)的行為
  • 白盒測(cè)試
  • 開發(fā)人員是最大受益者

特征是什么?

  • 自動(dòng)化,可重復(fù)執(zhí)行
  • 易實(shí)現(xiàn)
  • 不會(huì)依賴于特定條件(比如:時(shí)間)
  • 易使用
  • 運(yùn)行速度很快(毫秒級(jí))
  • 結(jié)果應(yīng)該是穩(wěn)定的
  • 能完全控制被測(cè)試的單元
  • 完全隔離(獨(dú)立于其他測(cè)試的運(yùn)行)

應(yīng)用


例子:

示例

人肉測(cè)試

平時(shí)我們圖方便想要測(cè)試類中某個(gè)方法,通常會(huì)用main方法去測(cè)試


main方法測(cè)試

單元測(cè)試框架

我們可以使用Junit單元測(cè)試框架去測(cè)試,可以讓程序員按照規(guī)定去寫測(cè)試用例,然后框架開啟自動(dòng)化的執(zhí)行去執(zhí)行測(cè)試用例


Junit測(cè)試

測(cè)試規(guī)定

  • 測(cè)試類的名稱通常以Test結(jié)尾
  • 每個(gè)測(cè)試方法加注解@Test,Junit就知道這是一個(gè)測(cè)試用例,在運(yùn)行中就會(huì)執(zhí)行這個(gè)測(cè)試用例
  • 使用Assert,讓Junit去判斷我們的實(shí)際結(jié)果預(yù)想值是否一致

總的來(lái)說(shuō),我們只要按照規(guī)定去寫代碼,剩下的就交給框架去做,框架會(huì)找到這個(gè)測(cè)試用例,然后執(zhí)行,最后用Assert去檢查實(shí)際值預(yù)想值是否一致。如果不一致,就出現(xiàn)了bug。

多個(gè)測(cè)試用例

多個(gè)測(cè)試用例

使用Suite套件,即@RunWith(Suite.class);在 @SuiteClasses中將需要的測(cè)試類如上方例子依次寫入。在下方的V1AllTests.java類中用同樣的方式將test.v1包內(nèi)的測(cè)試類全部寫入。這樣的話,可以單獨(dú)運(yùn)行單個(gè)測(cè)試用例,某個(gè)包內(nèi)的測(cè)試用例,全部的測(cè)試用例,可以進(jìn)行粗細(xì)粒度的運(yùn)行和管控。這樣的設(shè)計(jì)使用了組合的設(shè)計(jì)模式。

Junit常用的幾種斷言

/** 判斷預(yù)想值和實(shí)際值是否一致**/
Assert.assertEquals(expected, actual);
/** 判斷對(duì)象是否為True**/
Assert.assertTrue(condition);
/** 判斷對(duì)象是否為空**/
Assert.assertNotNull(object);
/** 判斷兩個(gè)數(shù)組是否相等**/
Assert.assertArrayEquals(expected, actual);

對(duì)Exception進(jìn)行測(cè)試

兩種對(duì)Exception測(cè)試的方法

兩種特殊的方法

特殊方法的運(yùn)行流程

在每次執(zhí)行類中某個(gè)測(cè)試用例時(shí),會(huì)先調(diào)用setup(),在執(zhí)行完畢后調(diào)用tearDown()。主要是為了testEvaluate1()和testEvaluate1()是獨(dú)立執(zhí)行的,沒有先后順序,并且執(zhí)行后互不影響。
如果這兩個(gè)方法都引用了某個(gè)共享變量,防止兩個(gè)方法對(duì)這個(gè)共享變量的修改,使用@Berore和@After注解的方法可以讓兩個(gè)方法的執(zhí)行對(duì)雙方不造成影響。

優(yōu)點(diǎn)


驗(yàn)證行為

  • 保證代碼的正確性
  • 回歸測(cè)試:即使到了項(xiàng)目后期,我們?nèi)杂杏職馊ピ黾有鹿δ?,修改程序結(jié)構(gòu),而不用擔(dān)心破壞重要功能
  • 給重構(gòu)帶來(lái)保證

設(shè)計(jì)行為

  • 測(cè)試驅(qū)動(dòng)迫使我們從調(diào)用這的角度去觀察和思考問題,迫使我們把代碼設(shè)計(jì)成可測(cè)試的,松耦合的

文檔行為

  • 單元測(cè)試是一種無(wú)價(jià)的文檔,精確地描述了代碼的行為,是如何使用函數(shù)和類的最佳文檔

單元測(cè)試是個(gè)團(tuán)隊(duì)行為

  • 運(yùn)行別人的測(cè)試用例:驗(yàn)證你的代碼修改
  • 別人運(yùn)行你的測(cè)試用例:驗(yàn)證別人的代碼修改

原則


測(cè)試代碼和被測(cè)代碼是同等重要的,需要被同時(shí)維護(hù)
  • 測(cè)試代碼不是附屬品
  • 不但要重構(gòu)代碼,也要重構(gòu)單元測(cè)試
單元測(cè)試一定要隔離
  • 一個(gè)測(cè)試用例的運(yùn)行結(jié)果不能影響其他測(cè)試用例
  • 測(cè)試用例不能相互依賴,應(yīng)該能夠以任何次序執(zhí)行
單元測(cè)試一定是可以重復(fù)執(zhí)行的
  • 不能依賴環(huán)境的變化
保持單元測(cè)試的簡(jiǎn)單性和可讀性
盡量對(duì)接口進(jìn)行測(cè)試
單元測(cè)試應(yīng)該可以迅速執(zhí)行
  • 給程序員提供及時(shí)的反饋
  • 使用Mock對(duì)象對(duì)數(shù)據(jù)庫(kù),網(wǎng)絡(luò)的依賴進(jìn)行解耦
自動(dòng)化單元測(cè)試
  • 集成到build過(guò)程中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容