在面向對象程序中,類成員函數通常都很小,功能單一,函數的間調用頻繁,容易出現一些不宜發現的錯誤。例如:
· if (-1==write (fid, buffer, amount)) error_out();
該語句沒有全面檢查write()的返回值,無意中斷然假設了只有數據被完全寫入和沒有寫入兩種情況。當測試也忽略了數據部分寫入的情況,就給程序遺留了隱患。
· 按程序的設計,使用函數strrchr()查找最后的匹配字符,但誤程序中寫成了函數strchr(),使程序功能實現時查找的是第一個匹配字符。
· 程序中將if (strncmp(str1,str2,strlen(str1)))誤寫成了
if (strncmp(str1,str2,strlen(str2)))。如果測試用例中使用的數據str1和str2長度一樣,就無法檢測出。
因此,在做測試分析和設計測試用例時,應該注意面向對象程序的這個特點,仔細的進行測試分析和設計測試用例,尤其是針對以函數返回值作為條件判斷選擇,字符串操作等情況。
面向對象編程的特性使得對成員函數的測試,又不完全等同于傳統的函數或過程測試。尤其是繼承特性和多態特性,使子類繼承或過載的父類成員函數出現了傳統測試中未遇見的問題。在[7]中,Brian Marick 給出了二方面的考慮:
1. 繼承的成員函數是否都不需要測試?
根據[7]中的論述,對父類中已經測試過的成員函數,兩種情況需要在子類中重新測試:a)繼承的成員函數在子類中做了改動;b)成員函數調用了改動過的成員函數的部分。例如:
假設父類Bass有兩個成員函數:Inherited()和Redefined(),子類Derived只對Redefined()做了改動! erived::Redefined()顯然需要重新測試。對于Derived::Inherited(),如果它有調用Redefined()的語句(如:x=x/Redefined()),就需要重新測試,反之,無此必要。
文章來源于領測軟件測試網 http://www.kjueaiud.com/