軟件測試是抽樣的活動
我想你一定聽過很多人說, 測試應該要涵蓋所有狀況, 或是抱怨未甚么連簡單的東西都沒有測試到, 或者測試為什么需要這么多時間....
這是因為他們對測試這個活動的本質有點誤解, 他們不知道軟件測試是sampling的活動. 即然是取樣, 自然不會涵蓋所有狀況; 有可能你選樣不好, 導致某些狀況漏掉; 或者是隨著你取樣的多寡, 自然需要花的時間也就不同.
這時候你會問, 為什么軟件測試是sampling的活動?
這個問題的答案是, 因為可以測試的組合是無限多種, 你不可能有無限的時間去做測試, 因此你必須挑選一些有代表性的來測試, 希望他能夠涵蓋大部分的狀況, 讓你投資較小的資源, 得到最大的效益.
這時候你又問到, 為什么測試的組合是無限多種呢?
這是我們試想有一個程序, 當你按空格鍵時, 會顯示圖案在屏幕上, 按其他按鍵則不會顯示任何東西.
當你使用黑箱測試的方法, 也就是在不知道程序內容狀況下測試, 你會如何進行一個完整的測試?
把所有按鍵都按一次, 看看是否照預期的結果運作. 這樣就好了嗎?
程序設計師若是設定連按八次return鍵也出現同樣的效果, 你怎么會知道呢? 若是要防止這樣的事情, 你要試多少種組合才能發現? 答案可能無限次.
你會說不可能有能寫這樣的程序, 那你說微軟復活節彩蛋的程序是怎么出來的? 那些銀行后門程序又是怎么來的?
那你會說如果可以做白箱測試就可以避免這樣的狀況. 是嗎? 事實上是不可能的
第一, 通常程序的行數都是很龐大的, 第二, 即使程序不長, 但是程序讀入的data, 它的值域是很龐大的, 若是32 bits的 integer, 范圍是2147483647~-2147483648(大約是這樣, 我沒有記太清楚), 你如何確保每個數字進去都正確, 而且你可能是不只一個data. 所以二者組合起來, 應該也是一個天文數字吧!!
所以到這里你可以知道要測試的狀況是無限的, 你不可能有完整測試. 因此你必須要sampling.
我想可以從測試方法中, 來印證測試真的是sampling. 你知道為什么會有statement coverage, branch coverage 或是decision coverage嗎?
當初科學家在想有這么多組合, 那要怎么挑選test case呢? 那找會經所有statements的test cases, 這樣會把所有 statement都測過. 可是后來有人想, 即使測過所有statements, 還是會漏掉一些branch不會經過, 所以這樣的取樣不夠好, 因此改成取樣會經過所有branch的test cases. 可是后來又想經過所有branch, 還是不足, 因為有些decision 不會包含.
因此你會發現到, 每種測試方法都是在取樣, 只是取樣方法不同, 嚴謹度不同, 因此會有不同種類或數量的test case出來.
看到這里, 你會知道測試是測不完的, 因為組合真的太多了. 我們可以做的, 是加強取樣的能力. 不過要小心的是, 不要選太多沒有價值也就是沒有代表性的test cases, 那不會有什么幫助的.
posted on 2014-11-18 09:46 順其自然EVO 閱讀(211) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄