軟體測試是sampling的活動


我想你一定聽過很多人說, 測試應該要涵蓋所有狀況, 或是抱怨未甚麼連簡單的東西都沒有測試到, 或者測試為什麼需要這麼多時間....

這是因為他們對測試這個活動的本質有點誤解, 他們不知道軟體測試是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, 那不會有什麼幫助的. 

arrow
arrow
    全站熱搜

    kojenchieh 發表在 痞客邦 留言(6) 人氣()