太久沒(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。
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)行。
3. 分析工程的測(cè)試覆蓋率
下面就可以直接利用Test選項(xiàng)里的Analysis Code Coverage 來(lái)分析我們上面載入的工程的測(cè)試覆蓋率了。依次選擇Test->Analysis Code Coverage->All Tests之后,幾秒鐘就能得到分析結(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è)試覆蓋了這部分代碼。
如果某些行的代碼沒(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行也是一樣。
上面的紅色一行可能不是很明顯,這里又稍微修改了一下那個(gè)測(cè)試函數(shù),再分析的結(jié)果就如下圖所示。
寫(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