一、 單元測試的概念
單元通俗的說就是指一個實現(xiàn)簡單功能的函數(shù)。單元測試就是只用一組特定的輸入(測試用例)測試函數(shù)是否功能正常,并且返回了正確的輸出。
測試的覆蓋種類
1.語句覆蓋:語句覆蓋就是設(shè)計若干個測試用例,運行被測試程序,使得每一條可執(zhí)行語句至少執(zhí)行一次。
2.判定覆蓋(也叫分支覆蓋):設(shè)計若干個測試用例,運行所測程序,使程序中每個判斷的取真分支和取假分支至少執(zhí)行一次。
3.條件覆蓋:設(shè)計足夠的測試用例,運行所測程序,使程序中每個判斷的每個條件的每個可能取值至少執(zhí)行一次。
4.判定——條件覆蓋:設(shè)計足夠的測試用例,運行所測程序,使程序中每個判斷的每個條件的每個可能取值至少執(zhí)行一次,并且每個可能的判斷結(jié)果也至少執(zhí)行一次。
5.條件組合測試:設(shè)計足夠的測試用例,運行所測程序,使程序中每個判斷的所有條件取值組合至少執(zhí)行一次。
6.路徑測試:設(shè)計足夠的測試用例,運行所測程序,要覆蓋程序中所有可能的路徑。
用例的設(shè)計方案主要的有下面幾種:條件測試,基本路徑測試,循環(huán)測試。通過上面的方法可以實現(xiàn)測試用例對程序的邏輯覆蓋,和路徑覆蓋。
二、開始測試前的準(zhǔn)備
在開始測試時,要先聲明一下,無論你設(shè)計多少測試用例,無論你的測試方案多么完美,都不可能完全100%的發(fā)現(xiàn)所有BUG,我們所需要做的是用最少的資源,做最多測試檢查,尋找一個平衡點保證程序的正確性。窮舉測試是不可能的。 所以現(xiàn)在進(jìn)行單元測試我選用的是現(xiàn)在一般用的比較多的基本路徑測試法。
三、開始測試
基本路徑測試法:設(shè)計出的測試用例要保證每一個基本獨立路徑至少要執(zhí)行一次。
函數(shù)說明 :當(dāng)i_flag=0;返回 i_count+100
當(dāng)i_flag=1;返回 i_count *10
否則 返回 i_count *20
輸入?yún)?shù):int i_count ,
int i_flag
輸出參數(shù): int i_return;
代碼:
1 int Test(int i_count, int i_flag)
2 {
3 int i_temp = 0;
4 while (i_count>0)
5 {
6 if (0 == i_flag)
7 {
8 i_temp = i_count + 100;
9 break;
10 }
11 else
12 {
13 if (1 == i_flag)
14 {
15 i_temp = i_temp + 10;
16 }
17 else
18 {
19 i_temp = i_temp + 20;
20 }
21 }
22 i_count--;
23 }
24 return i_temp;
25 }
1.畫出程序控制流程圖
圖例:
事例程序流程圖:
圈中的數(shù)字代表的是語句的行號,也許有人問為什么選4,6,13,8......作為結(jié)點,第2行,第3行為什么不是結(jié)點,因為選擇結(jié)點是有規(guī)律的。讓我們看程序中;第2行,第3行是按順序執(zhí)行下來的。直到第4行才出現(xiàn)了循環(huán)操作。而2,3行沒有什么判斷,選擇等分支操作,所以我們把2,3,4全部合并成一個結(jié)點。其他的也是照這個規(guī)則合并,然后就有了上面的流程圖。
2.計算圈復(fù)雜度
有了圖以后我們要知道到底我們有寫多少個測試用例,才能滿足基本路徑測試。
這里有有了一個新概念——圈復(fù)雜度
圈復(fù)雜度是一種為程序邏輯復(fù)雜性提供定量測試的軟件度量。將該度量用于計算程序的基本獨立路徑數(shù)目。為確保所有語句至少執(zhí)行一次的測試數(shù)量的上界。
公式圈復(fù)雜度V(G)=E-N+2,E是流圖中邊的數(shù)量,N是流圖中結(jié)點的數(shù)量。
公式圈復(fù)雜度V(G)=P+1 ,P是流圖G中判定結(jié)點的數(shù)量。
通俗的說圈負(fù)責(zé)度就是判斷單元是不是復(fù)雜,是不是好測試的標(biāo)準(zhǔn)。一般來說如果圈復(fù)雜度如果大于20就表示這個單元的可測試性不好,太復(fù)雜(也許有人覺得無所謂,但是如果你們公司實行了CMMI5的話,對這個是有規(guī)定的)。
從圖中我們可以看到,
V(G)=10條邊-8結(jié)點+2=4
V(G)=3個判定結(jié)點+1=4
上圖的圈復(fù)雜圖是4。這個結(jié)果對我們來說有什么意義呢?它表示我們只要最多4個測試用例就可以達(dá)到基本路徑覆蓋。
3.導(dǎo)出程序基本路徑。
現(xiàn)在我們知道了起碼要寫4個測試用例,但是怎么設(shè)計這4個測試用例?
導(dǎo)出程序基本路徑,根據(jù)程序基本路徑設(shè)計測試用例子。
程序基本路徑:基本獨立路徑就是從程序的開始結(jié)點到結(jié)束可以選擇任何的路徑遍歷,但是每條路徑至少應(yīng)該包含一條已定義路徑不曾用到的邊。(看起來不好理解,讓我們看例子)。
讓我們看上面的流程圖:從結(jié)點4到24有幾條路徑呢?
1 B(4,24)
2 C,E,J(4,6,8,24)
3 C,D,F(xiàn),H,A,B(4,6,13,15,22,4,24)
4 C,D,G,I,A,B(4,6,13,19,22,4,24)
還有嗎??
5 C,D,C,I,A,C,E,J(4,6,13,19,22,4,6,8,24)算嗎?
不算,為什么?因為上面的4條路徑已經(jīng)包括了所有的邊。第5條路徑已經(jīng)不包含沒有用過的邊了。所有的路徑都遍歷過了。
好了,現(xiàn)在我們有了4條基本獨立路徑根據(jù)獨立路徑我們可以設(shè)計測試用例。
1 B(4,24)
輸入數(shù)據(jù):i_flag=0,或者是i_flag<0的某一個值。
預(yù)期結(jié)果:i_temp=0.
2 C,E,J(4,6,8,24)
輸入數(shù)據(jù): i_count =1;i_flag=0
預(yù)期結(jié)果:i_temp=101.
3 C,D,F(xiàn),H,A,B(4,6,13,15,22,4,24)
輸入數(shù)據(jù): i_count =1;i_flag=1
預(yù)期結(jié)果:i_temp=10.
4 C,D,G,I,A,B(4,6,13,19,22,4,24)
輸入數(shù)據(jù): i_count =1;i_flag=2
預(yù)期結(jié)果:i_temp=20.
這里的輸入數(shù)據(jù)是由路徑和程序推論出來的。而要注意的是預(yù)期結(jié)果是從函數(shù)說明中導(dǎo)出,不能根據(jù)程序結(jié)構(gòu)中導(dǎo)出。
為什么這么說?
讓我們看程序中的第3行。
int i_temp=0;假如開發(fā)人員一不小心寫錯了,變成了int i_temp=1;根據(jù)程序?qū)С龅念A(yù)期結(jié)果就會是一個錯誤的值,但是單元測試不出來問題。
那單元測試就失去了意義。
有人也許會問這么簡單的函數(shù)就有4個測試用例,如果還復(fù)雜一些的怎么辦?上面的測試用例還可以簡化嗎?答案是可以。
我們來看 路徑 1 B(4,24)和 4 C,D,G,I,A,B(4,6,13,19,22,4,24),路徑1是路徑4的真子集, 所以1是可以不必要的。上圖的圈復(fù)雜度是4。這個結(jié)果對我們來說有什么意義呢?它表示我們只要最多4個測試用例就可以達(dá)到基本路徑覆蓋。所以說圈復(fù)雜度標(biāo)示是最多的測試用例個數(shù),不是一定要4個測試用例才可以。不過有一點要申明的是測試用例越簡化代表你的測試越少,這樣程序的安全性就越低了。
四、完成測試
接下來根據(jù)測試用例使用工具測試NUNIT,VS2005都可以。
接下來根據(jù)測試結(jié)果編寫測試報告,測試人,時間,結(jié)果,用例,是否通過,格式網(wǎng)上一大把,每個公司的格式也不一樣就不說了。(來自cnblogs)
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/Joe_wang/archive/2009/11/23/4857371.aspx