簡(jiǎn)單幾步分析測(cè)試覆蓋率

太久沒(méi)有更新博客了,當(dāng)初承諾的周更快變成月更了,(⊙﹏⊙)b

上次介紹了單元測(cè)試的重要性和如何開(kāi)始寫(xiě)單元測(cè)試,今天再推薦給大家一種分析測(cè)試覆蓋率的工具NUnit。本文測(cè)試環(huán)境為windows 10 + Visual Studio 2013。

1. 安裝NUnit Test Adapter

你可以選擇從NUnit官網(wǎng)下載NUnit Test Adapter,或者直接在VS的Tools -> Extensions and Updates里面搜索并安裝NUnit3 Test Adapter。

在VS2013中安裝NUnit3 Test Adapter

2. 載入需要做測(cè)試覆蓋率的工程及其對(duì)應(yīng)的測(cè)試工程

我們這里使用上次介紹單元測(cè)試中介紹的一個(gè)關(guān)于棧的例子(詳細(xì)代碼請(qǐng)參見(jiàn)單元測(cè)試)。

把我們要分析的工程加載進(jìn)來(lái)之后,我們可以先在TestExplorer (Test->Windows->Explorer)窗口選擇運(yùn)行一些test或者所有的test,以保證所有的test都能正常運(yùn)行。

在TestExplorer中執(zhí)行所有的單元測(cè)試

3. 分析工程的測(cè)試覆蓋率

下面就可以直接利用Test選項(xiàng)里的Analysis Code Coverage 來(lái)分析我們上面載入的工程的測(cè)試覆蓋率了。依次選擇Test->Analysis Code Coverage->All Tests之后,幾秒鐘就能得到分析結(jié)果。

測(cè)試覆蓋率分析結(jié)果

這里覆蓋率的計(jì)算有兩種方法lines或者blocks,其中l(wèi)ines很好理解就是按行來(lái)計(jì)算的,而blocks則是指代碼塊,跟代碼的邏輯有一定的關(guān)系,但至于具體是如何劃分的,我并不清楚。上圖中我們可以看到,單元測(cè)試那篇文章里我們寫(xiě)的測(cè)試能夠在lines和blocks兩個(gè)方面都100%覆蓋MyStack類(lèi)的所有邏輯。

4. 查看沒(méi)有覆蓋的代碼

測(cè)試覆蓋率分析結(jié)果其實(shí)不只是一個(gè)簡(jiǎn)單的列表,除了上圖中我們看到的每個(gè)工程的覆蓋率和每個(gè)函數(shù)的覆蓋率之外,我們還可以看到每一行代碼的覆蓋情況。將鼠標(biāo)放到上圖中第二行的右二圖標(biāo)(刪除圖標(biāo)的左側(cè))上,它會(huì)顯示“Show Code Coverage Coloring”。這個(gè)時(shí)候再點(diǎn)擊列表中的每一行,代碼編輯器就會(huì)跟著調(diào)到相應(yīng)的源代碼文件或者函數(shù)的位置。如下圖所示,所有代碼都被標(biāo)示為藍(lán)色,表示我們的測(cè)試覆蓋了這部分代碼。

測(cè)試覆蓋的代碼被標(biāo)記為藍(lán)色

如果某些行的代碼沒(méi)有被測(cè)試覆蓋到,則會(huì)被標(biāo)示為紅色。若某行只有一部分被覆蓋,則會(huì)被標(biāo)示為黃色。上面的測(cè)試覆蓋率結(jié)果列表里顯示MyStackTest工程的覆蓋率并不是100%,我們點(diǎn)開(kāi)Test_ThrowException_PopFromEmptyStack()那一行,可以看到
第83和91行被標(biāo)記成了紅色。
我們?cè)賮?lái)細(xì)看這部分代碼的邏輯,在第82行調(diào)用pop()函數(shù)的時(shí)候,空棧會(huì)拋出異常,這個(gè)異常被該方法上面的ExpectedException特性驗(yàn)證,所以不會(huì)正常的結(jié)束該方法,即執(zhí)行第83行。第91行也是一樣。

沒(méi)有被覆蓋的代碼被標(biāo)記為紅色

上面的紅色一行可能不是很明顯,這里又稍微修改了一下那個(gè)測(cè)試函數(shù),再分析的結(jié)果就如下圖所示。

沒(méi)有被覆蓋的代碼被標(biāo)記為紅色

寫(xiě)在最后

NUnit Test Adapter是一款安裝和使用都非常方便使用的軟件,簡(jiǎn)單幾個(gè)步驟就可以分析我們的工程的測(cè)試覆蓋率。較高的測(cè)試覆蓋率也可以作為一個(gè)工程較強(qiáng)的魯棒性的一個(gè)證據(jù),但是,千萬(wàn)不要過(guò)分追求測(cè)試覆蓋率。首先,測(cè)試本身的測(cè)試覆蓋率是不應(yīng)該考慮的,上面我們舉例只是為了展示沒(méi)有被覆蓋的代碼的顏色。其次,有些不重要的邏輯是可以不被單元測(cè)試覆蓋的,不要一味地為了寫(xiě)測(cè)試而寫(xiě)測(cè)試。比如結(jié)構(gòu)化異常處理,我們可能除了catch預(yù)料之中的異常之外會(huì)在最外層再加上Exception來(lái)處理那些uncaught exceptions。而我們的單元測(cè)試?yán)锿⒉粫?huì)覆蓋這個(gè)catch塊。

最后,如果你的代碼中的主要邏輯里有塊分支被標(biāo)紅了,那么就說(shuō)明你的測(cè)試還不夠全面。所以,測(cè)試覆蓋率的分析還可以作為檢驗(yàn)單元測(cè)試完整性的工具。

推薦關(guān)于單元測(cè)試的兩個(gè)小視頻:
Visual Studio Ultimate 2012 Improving quality with unit tests and fakes
Visual Studio Ultimate 2012 Easily reproducing issues through manual testing

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,288評(píng)論 25 708
  • 1.測(cè)試與軟件模型 軟件開(kāi)發(fā)生命周期模型指的是軟件開(kāi)發(fā)全過(guò)程、活動(dòng)和任務(wù)的結(jié)構(gòu)性框架。軟件項(xiàng)目的開(kāi)發(fā)包括:需求、設(shè)...
    宇文臭臭閱讀 6,751評(píng)論 5 100
  • Android單元測(cè)試介紹 處于高速迭代開(kāi)發(fā)中的Android項(xiàng)目往往需要除黑盒測(cè)試外更加可靠的質(zhì)量保障,這正是單...
    東經(jīng)315度閱讀 3,153評(píng)論 6 37
  • 1.測(cè)試與軟件模型 軟件開(kāi)發(fā)生命周期模型指的是軟件開(kāi)發(fā)全過(guò)程、活動(dòng)和任務(wù)的結(jié)構(gòu)性框架。軟件項(xiàng)目的開(kāi)發(fā)包括:需求、設(shè)...
    Mr希靈閱讀 21,987評(píng)論 7 278
  • 孫悟空從來(lái)就不是一個(gè)很正經(jīng)的猴子,西游記里面如此,大話西游里面也是如此,我們印象里面的孫悟空高傲難訓(xùn),調(diào)皮搗蛋,可...
    五木先生努力閱讀 670評(píng)論 1 1