單元測(cè)試等價(jià)于白箱測(cè)試嗎?
單元測(cè)試 = 白箱測(cè)試? 這是很多人的想法. 一聽到白箱測(cè)試, 就認(rèn)為他就是單元測(cè)試. 或者認(rèn)為單元測(cè)試時(shí), 就是要用白箱測(cè)試的方法來進(jìn)行.
事情是這樣嗎? 讓我們繼續(xù)看下去:
當(dāng)我們要測(cè)試這個(gè)程序時(shí)
Stack push(Stack s, int key)
你會(huì)怎么測(cè)試呢? 你可能會(huì)考慮以下幾種狀況
(1) 空的 stack, 第一次 push
(2) 不是空的 stack, 然后 push 東西
(3) stack 是滿的, push 個(gè)東西看會(huì)不會(huì)有問題
(4) 不是空的 stack, 然后 push 一個(gè)字符
(5) 不是空的 stack, 然后 push 一個(gè)指標(biāo)
你所做的大多是根據(jù)程序思考邏輯, 或者是根據(jù)輸入的值域來做參考, 來建立測(cè)試個(gè)案.
這些方式其實(shí)都是黑箱測(cè)試(用到了 use case testing 和 Equivalence Class Testing等方法, 可自行去網(wǎng)絡(luò)上找詳細(xì)介紹), 也就是不管程序內(nèi)部如何被實(shí)作. 只根據(jù)行為和輸入值域來開立測(cè)試.
那真正的白箱測(cè)試會(huì)是怎么進(jìn)行呢?
基本上, 可以測(cè)試的狀況有無限多種. 而白箱測(cè)試是要根據(jù)程序內(nèi)容來決定要怎樣挑最小可測(cè)試的集合.
那程序內(nèi)有甚么東西, 可以讓我們來做挑選的判斷呢? 一般常見的是根據(jù)程控邏輯. 例如: 是否經(jīng)過所有的敘述(statement); 是否經(jīng)過程序所有分支等等.
如果以經(jīng)過所有的敘述為例, 對(duì)于下面的程序
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: }
你會(huì)找出這組路徑, 來當(dāng)作最小需要測(cè)試的集合, 然后對(duì)它建立其相對(duì)應(yīng)的測(cè)試個(gè)案
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)
(當(dāng)然你可以只用test case 2, 因?yàn)樗w了 test case 1 的狀況)
一般人通常不會(huì)先分析執(zhí)行路徑, 再找測(cè)試個(gè)案. 大多是根據(jù)一些準(zhǔn)則, 找出測(cè)試個(gè)案就開始測(cè)試了. 所以一般單元測(cè)試是用黑箱測(cè)試方式在進(jìn)行, 而非白箱測(cè)試.
那為何大家會(huì)有錯(cuò)覺單元測(cè)試 = 白箱測(cè)試呢?
那 是因?yàn)樵谶M(jìn)行白箱測(cè)試時(shí), 對(duì)于一個(gè)大的系統(tǒng)要找出可執(zhí)行路徑, 會(huì)是一件很復(fù)雜的事情. 但是對(duì)于每個(gè)單元時(shí), 這件事情變得比較容易, 比較有可能不藉由工具的輔助, 就能自己進(jìn)行. 也就是說在單元測(cè)試時(shí), 比較容易進(jìn)行白箱測(cè)試. 可是不知怎么傳的, 很多人就把這兩個(gè)視為同義.
posted on 2014-07-23 09:36 順其自然EVO 閱讀(167) 評(píng)論(0) 編輯 收藏 所屬分類: 測(cè)試學(xué)習(xí)專欄