posts - 134,comments - 22,trackbacks - 0
          轉(zhuǎn)

          一、 單元測試的概念
                  單元通俗的說就是指一個(gè)實(shí)現(xiàn)簡單功能的函數(shù)。單元測試就是只用一組特定的輸入(測試用例)測試函數(shù)是否功能正常,并且返回了正確的輸出。
                  測試的覆蓋種類
                  1.語句覆蓋:語句覆蓋就是設(shè)計(jì)若干個(gè)測試用例,運(yùn)行被測試程序,使得每一條可執(zhí)行語句至少執(zhí)行一次。
                  2.判定覆蓋(也叫分支覆蓋):設(shè)計(jì)若干個(gè)測試用例,運(yùn)行所測程序,使程序中每個(gè)判斷的取真分支和取假分支至少執(zhí)行一次。
                  3.條件覆蓋:設(shè)計(jì)足夠的測試用例,運(yùn)行所測程序,使程序中每個(gè)判斷的每個(gè)條件的每個(gè)可能取值至少執(zhí)行一次。
                  4.判定——條件覆蓋:設(shè)計(jì)足夠的測試用例,運(yùn)行所測程序,使程序中每個(gè)判斷的每個(gè)條件的每個(gè)可能取值至少執(zhí)行一次,并且每個(gè)可能的判斷結(jié)果也至少執(zhí)行一次。
                  5.條件組合測試:設(shè)計(jì)足夠的測試用例,運(yùn)行所測程序,使程序中每個(gè)判斷的所有條件取值組合至少執(zhí)行一次。
                  6.路徑測試:設(shè)計(jì)足夠的測試用例,運(yùn)行所測程序,要覆蓋程序中所有可能的路徑。
                  用例的設(shè)計(jì)方案主要的有下面幾種:條件測試,基本路徑測試,循環(huán)測試。通過上面的方法可以實(shí)現(xiàn)測試用例對程序的邏輯覆蓋,和路徑覆蓋。
          二、開始測試前的準(zhǔn)備
                  在開始測試時(shí),要先聲明一下,無論你設(shè)計(jì)多少測試用例,無論你的測試方案多么完美,都不可能完全100%的發(fā)現(xiàn)所有BUG,我們所需要做的是用最少的資源,做最多測試檢查,尋找一個(gè)平衡點(diǎn)保證程序的正確性。窮舉測試是不可能的。   所以現(xiàn)在進(jìn)行單元測試我選用的是現(xiàn)在一般用的比較多的基本路徑測試法。
          三、開始測試
                 基本路徑測試法:設(shè)計(jì)出的測試用例要保證每一個(gè)基本獨(dú)立路徑至少要執(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é)點(diǎn),第2行,第3行為什么不是結(jié)點(diǎn),因?yàn)檫x擇結(jié)點(diǎn)是有規(guī)律的。讓我們看程序中;第2行,第3行是按順序執(zhí)行下來的。直到第4行才出現(xiàn)了循環(huán)操作。而2,3行沒有什么判斷,選擇等分支操作,所以我們把2,3,4全部合并成一個(gè)結(jié)點(diǎn)。其他的也是照這個(gè)規(guī)則合并,然后就有了上面的流程圖。

                      2.計(jì)算圈復(fù)雜度
                      有了圖以后我們要知道到底我們有寫多少個(gè)測試用例,才能滿足基本路徑測試。
                      這里有有了一個(gè)新概念——圈復(fù)雜度
                      圈復(fù)雜度是一種為程序邏輯復(fù)雜性提供定量測試的軟件度量。將該度量用于計(jì)算程序的基本獨(dú)立路徑數(shù)目。為確保所有語句至少執(zhí)行一次的測試數(shù)量的上界。
                      公式圈復(fù)雜度V(G)=E-N+2,E是流圖中邊的數(shù)量,N是流圖中結(jié)點(diǎn)的數(shù)量。
                      公式圈復(fù)雜度V(G)=P+1 ,P是流圖G中判定結(jié)點(diǎn)的數(shù)量。
                      通俗的說圈負(fù)責(zé)度就是判斷單元是不是復(fù)雜,是不是好測試的標(biāo)準(zhǔn)。一般來說如果圈復(fù)雜度如果大于20就表示這個(gè)單元的可測試性不好,太復(fù)雜(也許有人覺得無所謂,但是如果你們公司實(shí)行了CMMI5的話,對這個(gè)是有規(guī)定的)。
                      從圖中我們可以看到,
                      V(G)=10條邊-8結(jié)點(diǎn)+2=4
                      V(G)=3個(gè)判定結(jié)點(diǎn)+1=4
                      上圖的圈復(fù)雜圖是4。這個(gè)結(jié)果對我們來說有什么意義呢?它表示我們只要最多4個(gè)測試用例就可以達(dá)到基本路徑覆蓋。
                      3.導(dǎo)出程序基本路徑。
                      現(xiàn)在我們知道了起碼要寫4個(gè)測試用例,但是怎么設(shè)計(jì)這4個(gè)測試用例?
                      導(dǎo)出程序基本路徑,根據(jù)程序基本路徑設(shè)計(jì)測試用例子。
                       程序基本路徑:基本獨(dú)立路徑就是從程序的開始結(jié)點(diǎn)到結(jié)束可以選擇任何的路徑遍歷,但是每條路徑至少應(yīng)該包含一條已定義路徑不曾用到的邊。(看起來不好理解,讓我們看例子)。
                       讓我們看上面的流程圖:從結(jié)點(diǎn)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)算嗎?
                      不算,為什么?因?yàn)樯厦娴?條路徑已經(jīng)包括了所有的邊。第5條路徑已經(jīng)不包含沒有用過的邊了。所有的路徑都遍歷過了。
                      好了,現(xiàn)在我們有了4條基本獨(dú)立路徑根據(jù)獨(dú)立路徑我們可以設(shè)計(jì)測試用例。
                      1 B(4,24)
                      輸入數(shù)據(jù):i_flag=0,或者是i_flag<0的某一個(gè)值。
                      預(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ā)人員一不小心寫錯(cuò)了,變成了int i_temp=1;根據(jù)程序?qū)С龅念A(yù)期結(jié)果就會(huì)是一個(gè)錯(cuò)誤的值,但是單元測試不出來問題。
                      那單元測試就失去了意義。
                      有人也許會(huì)問這么簡單的函數(shù)就有4個(gè)測試用例,如果還復(fù)雜一些的怎么辦?上面的測試用例還可以簡化嗎?答案是可以。
                      我們來看 路徑    1 B(4,24)和   4 C,D,G,I,A,B(4,6,13,19,22,4,24),路徑1是路徑4的真子集,     所以1是可以不必要的。上圖的圈復(fù)雜度是4。這個(gè)結(jié)果對我們來說有什么意義呢?它表示我們只要最多4個(gè)測試用例就可以達(dá)到基本路徑覆蓋。所以說圈復(fù)雜度標(biāo)示是最多的測試用例個(gè)數(shù),不是一定要4個(gè)測試用例才可以。不過有一點(diǎn)要申明的是測試用例越簡化代表你的測試越少,這樣程序的安全性就越低了。
          四、完成測試
                      接下來根據(jù)測試用例使用工具測試NUNIT,VS2005都可以。
                      接下來根據(jù)測試結(jié)果編寫測試報(bào)告,測試人,時(shí)間,結(jié)果,用例,是否通過,格式網(wǎng)上一大把,每個(gè)公司的格式也不一樣就不說了。(來自cnblogs)

           

          本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/Joe_wang/archive/2009/11/23/4857371.aspx

          posted on 2009-12-05 12:50 何克勤 閱讀(430) 評論(0)  編輯  收藏 所屬分類: 其他
          主站蜘蛛池模板: 芒康县| 咸宁市| 云南省| 阿坝| 许昌县| 齐齐哈尔市| 呼伦贝尔市| 蓝田县| 博爱县| 屏东县| 沂南县| 德保县| 桓台县| 凌云县| 合作市| 哈巴河县| 大荔县| 建始县| 仁化县| 静安区| 新闻| 青海省| 安义县| 新乐市| 延津县| 唐海县| 泌阳县| 吐鲁番市| 北海市| 万全县| 蓬莱市| 洛隆县| 河北区| 武平县| 防城港市| 姚安县| 阿巴嘎旗| 夹江县| 晴隆县| 额敏县| 宝兴县|