如何進行單元測試

發表于:2008-02-03來源:作者:點擊數: 標簽:
摘要:單元測試是 軟件測試 的基礎,本文詳細的論述了單元測試的兩個步驟人工靜態檢查法與動態執行跟蹤法,所需執行的工作項目及相關的策略和方法。通過對這兩個步驟的描述作者將多年的單元測試經驗及測試理論注入于全文。 關鍵詞:單元測試、人工檢查、白盒測
摘要:單元測試是軟件測試的基礎,本文詳細的論述了單元測試的兩個步驟人工靜態檢查法與動態執行跟蹤法,所需執行的工作項目及相關的策略和方法。通過對這兩個步驟的描述作者將多年的單元測試經驗及測試理論注入于全文。

  關鍵詞:單元測試、人工檢查、白盒測試、測試用例、跟蹤調試

  1 概述

  單元測試是針對軟件設計的最小單位——程序模塊,進行正確性檢驗的測試工作。其目的在于發現每個程序模塊內部可能存在的差錯。

  單元測試也是程序員的一項基本職責,程序員必須對自己所編寫的代碼保持認真負責的態度,這是也程序員的基本職業素質之一。同時單元測試能力也是程序員的一項基本能力,能力的高低直接影響到程序員的工作效率與軟件的質量。

  在編碼的過程中作單元測試,其花費是最小的,而回報卻特別優厚的。在編碼的過程中考慮測試問題,得到的將是更優質的代碼,因為在這時您對代碼應該做些什么了解得最清楚。如果不這樣做,而是一直等到某個模塊崩潰了,到那時您可能已經忘記了代碼是怎樣工作的。即使是在強大的工作壓力下,您也還必須重新把它弄清楚,這又要花費許多時間。進一步說,這樣做出的更正往往不會那么徹底,可能更脆弱,因為您喚回的理解可能不那么完全。

  通常合格的代碼應該具備以下性質:正確性、清晰性、規范性、一致性、高效性等(根據優先級別排序)。

  1. 正確性是指代碼邏輯必須正確,能夠實現預期的功能。

  2. 清晰性是指代碼必須簡明、易懂,注釋準確沒有歧義。

  3. 規范性是指代碼必須符合企業或部門所定義的共同規范包括命名規則,代碼風格等等。

  4. 一致性是指代碼必須在命名上(如:相同功能的變量盡量采用相同的標示符)、風格上都保持統一。

  5. 高效性是指代碼不但要滿足以上性質,而且需要盡可能降低代碼的執行時間。

  2 單元測試步驟

  在代碼編寫完成后的單元測試工作主要分為兩個步驟人工靜態檢查和動態執行跟蹤。

  人工靜態檢查是測試的第一步,這個階段工作主要是保證代碼算法的邏輯正確性(盡量通過人工檢查發現代碼的邏輯錯誤)、清晰性、規范性、一致性、算法高效性。并盡可能的發現程序中沒有發現的錯誤。

  第二步是通過設計測試用例,執行待測程序來跟蹤比較實際結果與預期結果來發現錯誤。經驗表明,使用人工靜態檢查法能夠有效的發現30%到70%的邏輯設計和編碼錯誤。但是代碼中仍會有大量的隱性錯誤無法通過視覺檢查發現,必須通過跟蹤調試法細心分析才能夠捕捉到。所以,動態跟蹤調試方法也成了單元測試的重點與難點。

  3 人工檢查

  通常在人工檢查階段必須執行以下項目的活動:

  第一、 檢查算法的邏輯正確性;確定所編寫的代碼算法、數據結構定義(如:隊列、堆棧等)是否實現了模塊或方法所要求的功能。

  第二、 模塊接口的正確性檢查;確定形式參數個數、數據類型、順序是否正確;確定返回值類型及返回值的正確性。

  第三、 輸入參數有沒有作正確性檢查;如果沒有作正確性檢查,確定該參數是否的確無需做參數正確性檢查,否則請添加上參數的正確性檢查。經驗表明,缺少參數正確性檢查的代碼是造成軟件系統不穩定的主要原因之一。

  第四、 調用其他方法接口的正確性;檢查實參類型正確與否、傳入的參數值正確與否、個數正確與否,特別是具有多態的方法。返回值正確與否,有沒有誤解返回值所表示的意思。最好對每個被調用的方法的返回值用顯濕代碼作正確性檢查,如果被調用方法出現異?;蝈e誤程序應該給予反饋,并添加適當的出錯處理代碼。

  第五、 出錯處理;模塊代碼要求能預見出錯的條件,并設置適當的出錯處理,以便在一旦程序出錯時,能對出錯程序重做安排,保證其邏輯的正確性,這種出錯處理應當是模塊功能的一部分。若出現下列情況之一,則表明模塊的錯誤處理功能包含有錯誤或缺陷:出錯的描述難以理解;出錯的描述不足以對錯誤定位,不足以確定出錯的原因;顯示的錯誤信息與實際的錯誤原因不符;對錯誤條件的處理不正確;在對錯誤進行處理之前,錯誤條件已經引起系統的干預等。

  第六、 保證表達式、SQL語句的正確性;檢查所編寫的SQL語句的語法、邏輯的正確性。對表達式應該保證不含二義性,對于容易產生歧義的表達式或運算符優先級(如:《 、=、 》、 &&、||、++、 --等)可以采用擴號“()”運算符避免二義性,這樣一方面能夠保證代碼的正確可靠,同時也能夠提高代碼的可讀性。

  第七、 檢查常量或全局變量使用的正確性;確定所使用的常量或全局變量的取值和數值、數據類型;保證常量每次引用同它的取值、數值和類型的一致性。

  第八、 表示符定義的規范一致性;保證變量命名能夠見名知意,并且簡潔但不宜過長或過短、規范、容易記憶、最好能夠拼讀。并盡量保證用相同的表示符代表相同功能,不要將不同的功能用相同的表示符表示;更不要用相同的表示符代表不同的功能意義。

  第九、 程序風格的一致性、規范性;代碼必須能保證符合企業規范,保證所有成員的代碼風格一致、規范、工整。例如對數組做循環,不要一會兒采用下標變量從下到上的方式(如:for(I=0;I++;I<10)),一會兒又采用從上到下的方式(如:for(I=10;I--;I>0));應該盡量采用統一的方式,或則統一從下到上,或則統一從上到下。建議采用for循環和While循環,不要采用do{}while循環等。

  第十、 檢查程序中使用到的神秘數字是否采用了表示符定義。神秘的數字包括各種常數、數組的大小、字符位置、變換因子以及程序中出現的其他以文字形式寫出的數值。在程序源代碼里,一個具有原本形式的數對其本身的重要性或作用沒提供任何指示性信息,它們也導致程序難以理解和修改。對于這類神秘數字必須采用相應的標量來表示;如果該數字在整個系統中都可能使用到務必將它定義為全局常量;如果該神秘數字在一個類中使用可將其定義為類的屬性(Attribute),如果該神秘數字只在一個方法中出現務必將其定義為局部變量或常量。

  第十一、 檢查代碼是否可以優化、算法效率是否最高。如:SQL語句是否可以優化,是否可以用1條SQL語句代替程序中的多條SQL語句的功能,循環是否必要,循環中的語句是否可以抽出到循環之外等。

  第十二、 檢查您的程序是否清晰簡潔容易理解。注意:冗長的程序并不一定不是清晰的。

  第十三、 檢查方法內部注釋是否完整;是否清晰簡潔;是否正確的反映了代碼的功能,錯誤的注釋比沒有注釋更糟;是否做了多余的注釋;對于簡單的一看就懂的代碼沒有必要注釋。

  第十四、 檢查注釋文檔是否完整;對包、類、屬性、方法功能、參數、返回值的注釋是否正確且容易理解;是否會落了或多了某個參數的注釋,參數類型是否正確,參數的限定值是否正確。特別是對于形式參數與返回值中關于神秘數值的注釋,如:類型參數 應該指出 1.代表什么,2.代表什么,3.代表什么等。對于返回結果集(Result Set)的注釋,應該注釋結果集中包含那些字段及字段類型、字段順序等。

  4 動態執行跟蹤

  動態執行測試通常分為黑盒測試與白盒測試。黑盒測試指已知產品的功能設計規格,可以進行測試證明每個實現了的功能是否符合要求。白盒測試指已知產品的內部工作過程,可以通過測試證明每種內部操作是否符合設計規格的要求,所有內部成分是否已經經過檢查。

  對于單元測試來說主要應該采用白盒測試法對每個模塊的內部作跟蹤檢查測試。對于單元白盒測試,應該對程序模塊進行如下檢查:

  1. 對模塊內所有獨立的執行路徑至少測試一次;

  2. 對所有的邏輯判定,取“真”與“假”的兩種情況都至少執行一次;

  3. 在循環的邊界和運行界限內執行循環體;

  4. 測試內部數據的有效性等等。

  單元白盒跟蹤測試,通常需要做如下三項工作:

  1. 設計測試用例;

  2. 設計測試類模塊;

  3. 跟蹤調試。

  4.1 測試用例設計

  通常動態執行跟蹤調試是在編碼階段進行的。在對源程序作靜態人工檢查之后就可以開始進行單元測試的測試用例設計。利用設計文檔,設計可以驗證程序功能、找出程序錯誤的多個測試用例。

  4.1.1 測試用例的設計基本原則

  設計測試用例基本的原則是:

  1. 一個好的測試用例在于能夠發現至今沒有發現的錯誤;

  2. 測試用例應由測試輸入數據和與之對應的預期輸出結果這兩部分組成;

  3. 在測試用例設計時,應當包含合理的輸入條件和不合理的輸入條件。

  4.1.2 白盒測試的測試用例設計

  白盒測試測試用例一般采用邏輯覆蓋法和基本路徑法進行設計。

  一、邏輯覆蓋法

  邏輯覆蓋是以程序內部的邏輯結構為基礎的測試用例設計技術,這一方法要求測試人員對程序的邏輯結構有清楚的了解。邏輯覆蓋可分為:語句覆蓋、判定覆蓋、條件覆蓋、判定-條件覆蓋、條件組合覆蓋與路徑覆蓋。

  1. 語句覆蓋就是設計若干個測試用例,運行所測程序,使得每一可執行語句至少執行一次。

  2. 判定覆蓋就是設計若干個測試用例,運行所測程序,使得程序中每個判斷的取真分支和取假分支至少經歷一次。

  3. 條件覆蓋就是設計若干個測試用例,運行所測程序,使得程序中每個判斷的每個條件的可能取值至少執行一次。

  4. 判定--條件覆蓋就是設計足夠的測試用例,使得判斷中每個條件的所有可能取值至少執行一次,同時每個判斷的所有可能判斷結果也至少執行一次。

  5. 條件組合覆蓋就是設計足夠的測試用例,運行所測程序,使得每個判斷的所有可能的條件取值組合至少執行一次。

  6. 路徑測試就是設計足夠的測試用例,覆蓋程序中所有可能的路徑。

  每一種覆蓋方法都有其優缺點,這6種覆蓋方法關系,如圖1:

  

  圖1

  通常在設計測試用例時應該根據代碼模塊的復雜度,選擇覆蓋方法。一般的代碼的復雜度與測試用例設計的復雜度成正比。因此,設計人員必須做到模塊或方法功能的單一性、高內聚性,使得方法或函數代碼盡可能的簡單;這樣將可大大提高測試用例設計的容易度,提高測試用例的覆蓋程度。

  

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97