單元測試 = 白箱測試?


單元測試 = 白箱測試? 這是很多人的想法. 一聽到白箱測試, 就認為他就是單元測試. 或者認為單元測試時, 就是要用白箱測試的方法來進行.

事情是這樣嗎? 讓我們繼續看下去:

當我們要測試這個程式時
Stack push(Stack s, int key)

你會怎麼測試呢? 你可能會考量以下幾種狀況
(1) 空的 stack, 第一次 push
(2) 不是空的 stack, 然後 push 東西
(3) stack 是滿的, push 個東西看會不會有問題
(4) 不是空的 stack, 然後 push 一個字元
(5) 不是空的 stack, 然後 push 一個指標

你所做的大多是根據程式思考邏輯, 或者是根據輸入的值域來做參考, 來建立測試個案.

這些方式其實都是黑箱測試(用到了 use case testing 和 Equivalence Class Testing等方法, 可自行去網路上找詳細介紹), 也就是不管程式內部如何被實作. 只根據行為和輸入值域來開立測試.

那真正的白箱測試會是怎麼進行呢?

基本上, 可以測試的狀況有無限多種. 而白箱測試是要根據程式內容來決定要怎樣挑最小可測試的集合.

那程式內有甚麼東西, 可以讓我們來做挑選的判斷呢? 一般常見的是根據程式控制邏輯. 例如: 是否經過所有的敘述(statement); 是否經過程式所有分支等等.

如果以經過所有的敘述為例, 對於下面的程式

01: Stack push(Stack s, int key)
02: {
03:     if(isFull(s)){
04:        printf("Stack is full !!\n");
05:     }else{
06:         s.top = s.top + 1;
07:         s.element[s.top] = key;
08:         printf("Success push %d in the Stack\n", key);
09:     }
10:     return s;
11: }

你會找出這組路徑, 來當作最小需要測試的集合, 然後對它建立其相對應的測試個案

path1: 01-02-03-05-06-07-08-09-10-11
  test case 1:
     push (s, 3)

path2: 01-02-03-04-10-11
  test case 2:
     push (s, 3) (repeat 10 times, 如果 stack 大小是10 的話)
     push (s, 3)

(當然你可以只用test case 2, 因為它涵蓋了 test case 1 的狀況)

一般人通常不會先分析執行路徑, 再找測試個案. 大多是根據一些準則, 找出測試個案就開始測試了. 所以一般單元測試是用黑箱測試方式在進行, 而非白箱測試.

那為何大家會有錯覺單元測試 = 白箱測試呢?

那 是因為在進行白箱測試時, 對於一個大的系統要找出可執行路徑, 會是一件很複雜的事情. 但是對於每個單元時, 這件事情變得比較容易, 比較有可能不藉由工具的輔助, 就能自己進行. 也就是說在單元測試時, 比較容易進行白箱測試. 可是不知怎麼傳的, 很多人就把這兩個視為同義.

arrow
arrow
    全站熱搜

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