如何編寫單元測試用例(白盒測試)

來源:互聯網
上載者:User

(轉)如何編寫單元測試用例(白盒測試)
前段時間公司進行有關測試的培訓,整合測試,效能測試,壓力測試說了很多。由於本人還處於Coder階段,只是對單元測試有了些瞭解。寫下來怕以後自己忘記了。都是些自己的看法,不一定準確,歡迎高手指教。
一、 單元測試的概念
        單元通俗的說就是指一個實現簡易功能的函數。單元測試就是只用一組特定的輸入(測試案例)測試函數是否功能正常,並且返回了正確的輸出。
        測試的覆蓋種類
        1.語句覆蓋:語句覆蓋就是設計若干個測試案例,運行被測試程式,使得每一條可執行語句至少執行一次。
        2.判定覆蓋(也叫分支覆蓋):設計若干個測試案例,運行所測程式,使程式中每個判斷的取真分支和取假分支至少執行一次。
        3.條件覆蓋:設計足夠的測試案例,運行所測程式,使程式中每個判斷的每個條件的每個可能取值至少執行一次。
        4.判定——條件覆蓋:設計足夠的測試案例,運行所測程式,使程式中每個判斷的每個條件的每個可能取值至少執行一次,並且每個可能的判斷結果也至少執行一次。
        5.條件組合測試:設計足夠的測試案例,運行所測程式,使程式中每個判斷的所有條件取值組合至少執行一次。
        6.路徑測試:設計足夠的測試案例,運行所測程式,要覆蓋程式中所有可能的路徑。
        用例的設計方案主要的有下面幾種:條件測試,基本路徑測試,迴圈測試。通過上面的方法可以實現測試案例對程式的邏輯覆蓋,和路徑覆蓋。
二、開始測試前的準備
        
        在開始測試時,要先聲明一下,無論你設計多少測試案例,無論你的測試方案多麼完美,都不可能完全100%的發現所有BUG,我們所需要做的是用最少的資源,做最多測試檢查,尋找一個平衡點保證程式的正確性。窮舉測試是不可能的。   所以現在進行單元測試我選用的是現在一般用的比較多的基本路徑測試法。
三、開始測試
       基本路徑測試法:設計出的測試案例要保證每一個基本獨立路徑至少要執行一次。
        函數說明 :當i_flag=0;返回     i_count+100
                                當i_flag=1;返回   i_count  *10
                                否則  返回   i_count  *20
        輸入參數:int i_count ,  
                            int i_flag
        輸出參數: 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.畫出程式控制流程程圖
        
    圖例:
  

案例程式流程圖:
   

            圈中的數字代表的是語句的行號,也許有人問為什麼選4,6,13,8......作為結點,第2行,第3行為什麼不是結點,因為選擇結點是有規律的。讓我們看程式中;第2行,第3行是按順序執行下來的。直到第4行才出現了迴圈操作。而2,3行沒有什麼判斷,選擇等分支操作,所以我們把2,3,4全部合并成一個結點。其他的也是照這個規則合并,然後就有了上面的流程圖。
            2.計算循環複雜度
            
            有了圖以後我們要知道到底我們有寫多少個測試案例,才能滿足基本路徑測試。
            這裡有有了一個新概念——循環複雜度
            循環複雜度是一種為程式邏輯複雜性提供定量測試的軟體度量。將該度量用於計算程式的基本獨立路徑數目。為確保所有語句至少執行一次的測試數量的上界。
            公式循環複雜度V(G)=E-N+2,E是流圖中邊的數量,N是流圖中結點的數量。
            公式循環複雜度V(G)=P+1 ,P是流圖G中判定結點的數量。
            通俗的說圈負責度就是判斷單元是不是複雜,是不是好測試的標準。一般來說如果循環複雜度如果大於20就表示這個單元的可測試性不好,太複雜(也許有人覺得無所謂,但是如果你們公司實行了CMMI5的話,對這個是有規定的)。
            我們可以看到,
            V(G)=10條邊-8結點+2=4
            V(G)=3個判定結點+1=4
            的圈複雜圖是4。這個結果對我們來說有什麼意義呢?它表示我們只要最多4個測試案例就可以達到基本路徑覆蓋。
            3.匯出程式基本路徑。
            
            現在我們知道了起碼要寫4個測試案例,但是怎麼設計這4個測試案例?
            匯出程式基本路徑,根據程式基本路徑設計測試案例子。
             程式基本路徑:基本獨立路徑就是從程式的開始結點到結束可以選擇任何的路徑遍曆,但是每條路徑至少應該包含一條已定義路徑不曾用到的邊。(看起來不好理解,讓我們看例子)。
             讓我們看上面的流程圖:從結點4到24有幾條路徑呢?
             1 B(4,24)
             2 C,E,J(4,6,8,24)
             3 C,D,F,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條路徑已經包括了所有的邊。第5條路徑已經不包含沒有用過的邊了。所有的路徑都遍曆過了。
            好了,現在我們有了4條基本獨立路徑根據獨立路徑我們可以設計測試案例。
            1 B(4,24)
            輸入資料:i_flag=0,或者是i_flag這裡的輸入資料是由路徑和程式推論出來的。而要注意的是預期結果是從函數說明中匯出,不能根據程式結構中匯出。
            
            為什麼這麼說?
            讓我們看程式中的第3行。
            int i_temp=0;假如開發人員一不小心寫錯了,變成了int i_temp=1;根據程式匯出的預期結果就會是一個錯誤的值,但是單元測試不出來問題。
            那單元測試就失去了意義。
            有人也許會問這麼簡單的函數就有4個測試案例,如果還複雜一些的怎麼辦?上面的測試案例還可以簡化嗎?答案是可以。
            我們來看 路徑    1 B(4,24)和   4 C,D,G,I,A,B(4,6,13,19,22,4,24),路徑1是路徑4的真子集,     所以1是可以不必要的。的循環複雜度是4。這個結果對我們來說有什麼意義呢?它表示我們只要最多4個測試案例就可以達到基本路徑覆蓋。所以說循環複雜度標示是最多的測試案例個數,不是一定要4個測試案例才可以。不過有一點要申明的是測試案例越簡化代表你的測試越少,這樣程式的安全性就越低了。
四、完成測試
            
            接下來根據測試案例使用工具測試NUNIT,VS2005都可以。
            接下來根據測試結果編寫測試報告,測試人,時間,結果,用例,是否通過,格式網上一大把,每個公司的格式也不一樣就不說了。

www.bj120zx.com

本文來自ChinaUnix部落格,如果查看原文請點:http://blog.chinaunix.net/u2/86948/showart_1853656.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.