一、單元測試步驟
**編寫完成後的單元測試工作主要分為兩個步驟:
人工靜態檢查
人工靜態檢查是測試的第一步,這個階段工作主要是保證**演算法的邏輯正確性(盡量通過人工檢查發現**的邏輯錯誤)、清晰性、規範性、一致性、演算法高效性。並盡可能的發現程式中沒有發現的錯誤。
動態執行跟蹤
執行待測程式來跟蹤比較實際結果與預期結果來發現錯誤。經驗表明,使用人工靜態檢查法能夠有效的發現30%到70%的邏輯設計和 編碼錯誤。但是**中仍會有大量的隱性錯誤無法通過視覺檢查發現,必須通過跟蹤除錯法細心分析才能夠捕捉到。所以,動態跟蹤除錯方法也成了單元測試的重點 與難點。
二、人工檢查
通常在人工檢查階段必須執行以下專案的活動:
第一、檢查演算法的邏輯正確性;確定所編寫的**演算法、資料結構定義(如:佇列、堆疊等)是否實現了模組或方法所要求的功能。
第二、模組介面的正確性檢查;確定形式引數個數、資料型別、順序是否正確;確定返回值型別及返回值的正確性。
第三、輸入引數有沒有作正確性檢查;如果沒有作正確性檢查,確定該引數是否的確無需做引數正確性檢查,否則請新增上引數的正確性檢查。經驗表明,缺少引數正確性檢查的**是造成軟體系統不穩定的主要原因之一。
第四、呼叫其他方法介面的正確性;檢查實參型別正確與否、傳入的引數值正確與否、個數正確與否,特別是具有多型的方法。返回值正確與否,有沒有誤解返回值所表示 的意思。最好對每個被呼叫的方法的返回值用顯濕**作正確性檢查,如果被呼叫方法出現異常或錯誤程式應該給予反饋,並新增適當的出錯處理**。
第五、出錯處理;模組**要求能預見出錯的條件,並設定適當的出錯處理,以便在一旦程式出錯時,能對出錯程式重做安排,保證其邏輯的正確性,這種出錯處理應當是 模組功能的一部分。若出現下列情況之一,則表明模組的錯誤處理功能包含有錯誤或缺陷:出錯的描述難以理解;出錯的描述不足以對錯誤定位,不足以確定出錯的 原因;顯示的錯誤資訊與實際的錯誤原因不符;對錯誤條件的處理不正確;在對錯誤進行處理之前,錯誤條件已經引起系統的干預等。
第六、保證表示式、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)的注釋,應該注釋結果集中包含那些欄位及字段型別、字段順序等。
如何進行Django單元測試?
django的單元測試使用python的unittest模組,這個模組使用基於類的方法來定義測試。類名為django.test.testcase,繼承於python的unittest.testcase。from django.test import testcase class animaltest...
我討厭單元測試 滕振宇談如何進行單元測試
說起單元測試的好處相信大家都能列舉出不少,可是很多時候,開發人員面對自己產品的 想寫單元測試卻無從下手,久而久之,便會有人大喊 我討厭單元測試。資深敏捷諮詢師騰振宇 daniel teng 在gtug topgeek開發工程管理沙龍就以此為題,結合最近的乙個專案,和大家分享了他對單元測試的一些看法。...
我討厭單元測試 滕振宇談如何進行單元測試
本文首發於infoq中文站 說起單元測試的好處相信大家都能列舉出不少,可是很多時候,開發人員面對自己產品的 想寫單元測試卻無從下手,久而久之,便會有人大喊 我討厭單元測試。資深敏捷諮詢師騰振宇 daniel teng 在gtug topgeek開發工程管理沙龍 就以此為題,結合最近的乙個專案,和大家...