
基礎(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è)試

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

使用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è)試

兩種特殊的方法

在每次執(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ò)程中