天天看點

軟體測試的藝術——學習筆記

軟體測試是為發現錯誤而執行程式的過程

黑盒測試:窮舉輸入測試

白盒測試:窮舉路徑測試

軟體測試的重要原則:

檢查程式是否“未做其應該做的”僅是測試的一半,測試的另一半是檢查程式是否“做了其不應該做的”

原則1:測試用例中一個必需部分是對預期輸出或結果的定義

測試用例包括:

1.對程式的輸入資料的描述

2.對程式在上述輸入資料下的正确輸出結果的精确描述。

原則5:測試用例的編寫不僅應當根據有效和預期的輸入情況,而且也應當根據無效和未預料到的輸入情況。

主要的人工測試方法:

代碼檢查、走查以及可用性測試

代碼檢查錯誤清單總結(可以參考平時代碼審查)

資料引用錯誤

1.是否有引用的變量未指派或者未初始化?

2.下标的值是否在範圍之内?

3.是否存在非整數下标?

4.是否存在虛調用?(既指針或引用變量的引用的記憶體單元是否已配置設定)

5.記錄和結構的屬性是否比對?

6.索引或下标操作是否有“僅差一個”的錯誤?(數組從0開始)

7.繼承的函數是否都被定義?

運算錯誤

1.是否存在非算術變量間的運算?

2.是否存在混合模式的運算?(int/float)

3.是否存在不同字長變量間的運算?

4.目标變量的大小是否小于指派大小?(一直指長度或者取值範圍,int與long)

5.中間結果是否溢出(上下)?

6.是否存在被0除?

7.變量的值是否超過了有意義的範圍?(int型位數大于32)

8.操作符的優先順序是否被正确的了解?(2*i/2==i?i如果為奇數?如果先執行除法?)

9.整數除法是否正确?

資料聲明錯誤

1.是否所有變量都已聲明?(int a)

2.預設屬性是否被正确了解?(java中)

3.數組和字元串的初始化是否正确?

4.變量是否賦予了正确的長度、類型和存儲類?

5.初始化是否與存儲類相一緻?

6.是否有相似的變量名?(一般是warning)

比較錯誤

1.是否存在不同類型變量間的比較?

2.是否存在混合模式的比較運算?

3.比較運算符是否正确?(至多,最少……)

4.布爾表達式是否正确?(與或非正确表達 c++中,&& || !)

5.布爾運算符的操作數是否是布爾類型的?比較運算符和布爾運算符是否錯誤的混在一起?(2>x>1 => x<2 &&x>1)

6.包含一個以上的布爾運算符的表達式,指派順序以及運算符的優先順序是否正确?

7.!!編譯器計算布爾表達式的方式是否會對程式産生影響?(if((x==0 && (x/y)>z) 有可能引起一個被0除的錯誤!!)

控制流程錯誤

1.是否所有的循環最終都終止了?

2.程式、子產品或者子程式是否最終都終止了?

3.由于實際情況沒有滿足循環的入口條件,循環體是否有可能從未執行過?(是否這裡會有疏漏?)

4.如果循環同時由疊代變量和布爾條件所控制,如果循環越界??

5.是否存在僅差一個的錯誤,off-by-one?

6.!是否存在不能窮盡的判斷?

接口錯誤

1.被調用子產品接收到的形參數量是否等于調用子產品發送的實參數量?順序是否正确?

2.實參的屬性(類型和大小)是否與相應形參的屬性相比對?

3.如果調用了内置函數,實參的數量、屬性、順序是否正确?

4.是否有子程式改變了某個原本僅為輸入值的形參?

5.如果存在全局變量,在所有引用它們的子產品中,他們的定義和屬性是否相同?

輸入/輸出錯誤

1.如果對檔案明确聲明過,其屬性是否正确?

2.打開檔案的語句中各項屬性的設定是否正确?

3.格式規範是否與I/O語句中的資訊相吻合?(屬性)

4.是否有足夠的可用記憶體空間,來保留程式将要讀取的檔案?

5.是否所有的檔案都在使用之前打開了?

6.是否所有的檔案都在使用之後關閉了?

7.是否判斷檔案結束的條件,并正确處理?(EOF)

8.對I/O出錯情況如何正确處理?

9.程式是否正确處理類似于“File Not Found”這樣的錯誤?

其他檢查

1.程式或子產品是否具有足夠的魯棒性?(輸入的合法性)

2.程式是否遺漏某個功能?

3.如果程式編譯通過,但計算機提供了一個或多個“警告”或“提示”資訊,應對此逐一進行認真檢查。“警告”資訊指出編譯器對程式某些操作的正确性有所懷疑;“提示”資訊可能會羅列出沒有聲明的變量,或者是不利于代碼優化的用法。