張新 焦豪



摘要 軟件應(yīng)用于幾乎所有的科學(xué)技術(shù)領(lǐng)域。一款特定軟件的用戶類別取決于他們的認(rèn)可以及軟件的質(zhì)量。軟件開發(fā)人員有責(zé)任確保軟件沒有缺陷,并且可以執(zhí)行所需要的功能。軟件測試是軟件開發(fā)生命周期階段的一項重要工作。各種研究分析表明軟件測試占了整個軟件開發(fā)工作的30%。所以測試對于提高軟件質(zhì)量有至關(guān)重要的作用。軟件測試主要包括單元測試、集成測試和系統(tǒng)測試。單元測試基本有兩種測試方法:黑盒測試和白盒測試。本文分析了黑盒測試方法和相關(guān)問題。
【關(guān)鍵詞】軟件測試 黑盒測試 等價類劃分邊界值分析
1 引言
軟件測試是一項涉及到人類心理學(xué)和經(jīng)濟學(xué)的技術(shù)性工作。一些測試人員對測試的誤解是這樣的:“軟件測試就是證明軟件不存在錯誤的過程”或者:“測試是確保開發(fā)的軟件能夠滿足其所有功能和非功能需求的過程”。雖然這兩個觀點理論上看起來是完美的,但是對于測試,更為合適的定義應(yīng)該是:“測試是為發(fā)現(xiàn)錯誤而執(zhí)行程序的過程”。這個定義包含以下兩點:
(1)這并不是要證明這個軟件是錯誤的;
(2)測試人員在測試之前應(yīng)該假設(shè)程序存在錯誤。
軟件測試也可以被描述為確認(rèn)和驗證軟件或應(yīng)用程序是否符合指導(dǎo)其設(shè)計和開發(fā)的業(yè)務(wù)和技術(shù)功能需求的過程。確認(rèn)和驗證是確保軟件滿足軟件需求規(guī)范文檔中提及的要求并且滿足其預(yù)期功能的過程。它可以被認(rèn)為是確保軟件質(zhì)量的一種方法。
為了分析各種測試方法,首先我們必須知道軟件測試中使用的基本術(shù)語。
測試用例(Test case):測試用例是為了特定的測試場景設(shè)計的一組測試輸入、執(zhí)行條件以及預(yù)期結(jié)果,以確保是否符某個特定的功能需求。以在兩個輸入的整數(shù)中找出最大的程序來示例,然后可以設(shè)計出以下測試用例:
Integer l=2 and Integer 2=4
Integer l=4 and Integer 2=2
Integer l=-3 and Integer 2=-2
Integer l=-2 and Integer 2=0
Integer l=1 and Integer 2=1
測試套件( Test suit):在數(shù)學(xué)上是由所有的測試用例作為元素組成的集合。通過測試套件,將服務(wù)于同一個測試目的或同一運行環(huán)境下的一系列測試用例有機的組合起來。測試套件可能有無數(shù)個測試用例。一個好的測試套件涵蓋了大多數(shù)錯誤,包含最少的測試用例。對于上面提到的計算兩個整數(shù)中最大值的程序,測試套件可以有如下定義:
{(2,4), (4,2), (.3,.2), (.2,0), (1,1))
誤差(Error):誤差是實際結(jié)果和預(yù)期結(jié)果不匹配的程度,它代表了代碼開發(fā)人員所犯的錯誤。錯誤是測試人員發(fā)現(xiàn)的,當(dāng)開發(fā)人員接收這個錯誤時,它就被稱為bug。
故障(Fault):故障是在計算機程序中使程序產(chǎn)生意想不到結(jié)果的不正確的指令、函數(shù)或數(shù)據(jù)解釋。故障會導(dǎo)致錯誤。
程序錯誤(Bug):Bug是代碼塊中產(chǎn)生意外結(jié)果的錯誤。這通常是開發(fā)人員接受的錯誤。
失敗( Failure):失敗是軟件系統(tǒng)無法執(zhí)行其預(yù)期的功能和非功能要求。
缺陷( Defect):缺陷是程序員在編碼或者邏輯中犯的錯誤,它會導(dǎo)致程序產(chǎn)生錯誤或偏差。通常在發(fā)生故障時檢測到缺陷。
2 軟件測試方法
軟件測試工作包括四個階段:
(1)設(shè)計一個適當(dāng)?shù)臏y試套件來執(zhí)行所有的代碼行。
(2)執(zhí)行每個測試用例來查找代碼塊中的錯誤。
(3)通過檢查測試結(jié)果來確定錯誤的來源。
(4)修改程序來修復(fù)Bug。
軟件產(chǎn)品通常要經(jīng)過三個層次的測試:單元測試、集成測試和系統(tǒng)測試。單元測試是指依據(jù)詳細(xì)的設(shè)計描述,對每一個功能相對獨立的程序模塊進(jìn)行測試。單獨的單元測試模塊被組合或集成在一起形成軟件。在此級別的集成模塊上執(zhí)行的測試成為集成測試。集成模塊可以是自下而上、自上而下或者混合的。集成后的軟件應(yīng)具備所有所需求的功能,這可以通過執(zhí)行系統(tǒng)測試來保證。
3 單元測試
我們使用合適的示例程序代碼來分析各種單元測試測試方法。考慮具有以下字段的特定網(wǎng)站的設(shè)置頁面:
姓名:char [50]
性別:char
系統(tǒng)時間:DD/MM/YYYY
可以認(rèn)為這個設(shè)置頁面是軟件的一個單元模塊。因此,在開發(fā)這個模塊之后,我們必須通過執(zhí)行其預(yù)期的功能來確保該單元成功執(zhí)行。首先應(yīng)用單元測試,其中包括黑盒測試和白盒測試。黑盒測試檢查軟件系統(tǒng)的功能方面,而白盒測試驗證軟件系統(tǒng)的邏輯方面。
黑盒測試人員不需要知道內(nèi)部邏輯或程序結(jié)構(gòu),因為內(nèi)部邏輯方面是不被測試人員所熟知的。就像測試人員用黑盒子遮擋了內(nèi)部結(jié)構(gòu),不知道系統(tǒng)組建是如何在盒子內(nèi)部構(gòu)成。在黑盒測試中,測試人員關(guān)注的是軟件的功能而不是軟件怎么開發(fā)出來的。表1列出了黑盒測試和白盒測試策略之間的對比。
我們通過應(yīng)用兩種黑盒測試方法來分析我們的測試模塊:等價類劃分法和邊界值分析法。
等價類劃分法就是把輸入劃為若干部分,從每個部分中選取少量的代表性數(shù)據(jù),來對被測應(yīng)用進(jìn)行測試的黑盒測試方法。測試人員面臨的挑戰(zhàn)是設(shè)計一個最小的測試套件。在這個方法中,整個輸入集被劃分成不同的子集或類。每個類代表一組具有相似特征和規(guī)格的測試輸入。根據(jù)輸入約束條件,每個子集或者多個類可能是有效的也可能是無效的。在等價類劃分技術(shù)中,我們假設(shè)一個類中的所有條件都將以相同的方式處理,所以只需要從每個子集或者分區(qū)類中測試一個條件。如果分區(qū)類中的一個條件有效,我們假設(shè)該分區(qū)中的所有條件都可以工作,如果分區(qū)類中的某個條件不起作用,那么我們假設(shè)該分區(qū)中的任何條件都不起作用。
對于一個只接受兩位整數(shù)的應(yīng)用程序,有效類等價是從10到99的整數(shù)。在這種情況下的無效分區(qū)是十進(jìn)制數(shù)、小于10的整數(shù)、大于99的整數(shù)、非數(shù)字字符等。
可以對注冊頁面字段分析如下。
3.1 姓名
字符集表示一組字母和空格。讓字符集C={A,B,C,D,E,F(xiàn),G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,e g,h,I,j,k,1,m,n,.,p,q,r,s,t,u,v,w,x,y,z,‘)。那么將會有一個有效的等價類接受集合C的所有元素,而補集C是一個無效的等價類別。所以我們可以從兩個分區(qū)中選擇任意一個隨機元素來設(shè)計測試套件。
Test suite={C,4}
其中C是來自有效分區(qū)的元素,而4是來自無效分區(qū)的元素。
3.2 系統(tǒng)時間
系統(tǒng)時間字段的月份可以從1到12取值,但也會有一個有效的分區(qū)和兩個無效的分區(qū)。用“m”表示月份值:
有效類:l
無效類1:m
無效類2:m>12(值大于12)
所以代表每個分區(qū)的3個測試用例組成了最小的測試套件Test suite={-4,6,15)。在基于月份的各種組合中,可以應(yīng)用于相同的日期字段。
3.3 性別
性別有三種可能的輸入。男(M),女(F)或其他(o)。設(shè)G={M,F(xiàn),0)表示有效類,則G表示無效等價類。
大多數(shù)程序開發(fā)人員在編寫條件語句時會在邊界值上犯錯。邊界值分析基于在各子類或分區(qū)之間的邊界處的測試。在這里我們既有有效的邊界,也有無效的邊界。在輸入域邊界出現(xiàn)的錯誤數(shù)量比“中間”多。它在每個子類的邊緣選擇測試用例。測試人員在進(jìn)行邊界值分析的時候應(yīng)該注意兩點準(zhǔn)則:
(1)如果輸入條件指定了m和n之間的值范圍,則測試用例應(yīng)設(shè)計為值m和n以及剛好在m和n之外的值。測試套件={m,n,m-l,n+l}
(2)如果輸入條件指定了若干值,則測試用例應(yīng)設(shè)計為最低和最高的數(shù)字。剛剛超過最低和最高的值也應(yīng)該要測試。
以輸入字段在哪個月作為輸入數(shù)據(jù),有效的輸入應(yīng)該是從1到12的任何整數(shù),因為一年只有12個月。如果用戶輸入數(shù)據(jù)為“20”,那么系統(tǒng)就不應(yīng)該接受。因此這個輸入用例的各個分區(qū)是:
有效分區(qū):從l到12的數(shù)字集合
第一個無效分區(qū):小于1的數(shù)字集合
第二個無效分區(qū):大于12的數(shù)字集合
在上述情況下,在邊界值分析中的邊界值是1和12。我們必須選擇剛好小于最小邊界值的值和剛好大于最大邊界值的值。因此,我們應(yīng)該選擇剛好在l以下、剛好在12以上的數(shù)字以及l(fā)和12。
測試套件={0,1,5,12,13)
4 測試分析
如圖l所示,我們可以用下面的C語言程序分析這個單元測試方法,來驗證系統(tǒng)時間的月份字段。
在上面的案例中,如果我們采用等價劃分測試套件的方法,將會得到以下的測試結(jié)果。見表2。
因此,上述程序代碼完美使用于等價劃分測試套件。現(xiàn)在我們使用邊界值分析測試套件來分析相同的代碼,測試報告如表3所示。
邊界值分析法可以識別出等價類劃分法中無法直接識別的錯誤。
性別字段表示為一組有效的輸入“M”和“F”,在這種情況下,輸入變量代表了一個集合而不是一個取值范圍。在這里邊界值劃分法無法使用,但是可以進(jìn)行等價類劃分。
一個好的測試人員對一個模塊進(jìn)行單元測試應(yīng)該同時遵循等價類劃分和邊界值分析來確保它的可靠性,這兩種黑盒測試方法確保系統(tǒng)滿足其特定功能。
5 結(jié)果
從分析中可以推導(dǎo)出輸入值與測試用例數(shù)量之間的以下關(guān)系。在邊界值分析中,如果軟件有“N”個輸入變量,那么最小測試套件中將會有4N+1個測試用例。這可以通過一個變量的測試輸入示例來證明。那么測試套件可能如下:
Test suit={最小值,最小值-1,最大值,最大值+1}
對于單個的變量輸入,將會有上述四個測試用例。為了設(shè)計一個最小的測試套件,我們應(yīng)該在中等范圍內(nèi)包含一個值,所以最小的測試套件中將會有5個測試用例。如下所示:
最小測試套件={最小值,最小值-1,正常值,最大值,最大值+1}
在等價類劃分中,如果輸入集有“N”個分區(qū),那么在最小測試機中將會有“N”個測試用例。
因此,黑盒測試策略的分析研究表明,邊界值分析比等價類劃分得到的測試用例相對較多。
我們用標(biāo)準(zhǔn)測試指標(biāo)分析了我們的系統(tǒng)時間模塊。
(1)測試用例通過的百分比:該值表示執(zhí)行測試的通過率。
在邊界值分析中,測試用例通過%=(3/3)100=100%
在等價類劃分中,測試用例通過%=(4/5)100=80%
(2)缺陷泄漏:缺陷泄漏是在測試進(jìn)入下一階段之后未發(fā)現(xiàn)的缺陷數(shù)量。
等價類劃分法的缺陷泄漏=1;
邊界值分析法的缺陷泄漏=o。
(3)最小測試套件大小:測試套件中測試用例的數(shù)量。
對于我們的系統(tǒng)時間模塊:
等價類劃分法的最小測試套件大小=3;
邊界值分析大的最小測試套件大小=5。
(4)測試的時間:測試時間是根據(jù)測試套件的大小和覆蓋區(qū)域來估計的。
邊界值分析法的測試用例更多,所用的測試時間也更長。因此邊界值分析法的測試工作相對于等價類劃分法的測試工作更多。
(5)測試中發(fā)現(xiàn)缺陷的成本。
全部工作量=總功能點×每個功能點的權(quán)重
設(shè)定執(zhí)行每個測試用例的工作量為1,
在邊界值分析中:缺陷發(fā)現(xiàn)成本=5/1=5:
在等價類劃分中:缺陷發(fā)現(xiàn)成本=3/0=0。
盡管圖2中的大多數(shù)參數(shù)都在彰顯邊界值分析法的優(yōu)點,但是在有些情況下等效類劃分法比邊界值分析法更為適用。分析研究表明,bug數(shù)量在邊界值分析中有所增加。邊界值分析法中增加的測試用例提高了bug識別率,但是對輸入值的范圍有所限制。因此如果輸入變量是布爾值或者特定值,則采用等價類劃分法。與邊界值分析法相比,等價類劃分法具有更多的缺陷泄漏。結(jié)果如表4所示。
6 結(jié)論
在模塊化編程方法中,黑盒測試起著至關(guān)重要的作用。邊界值分析法所設(shè)計的測試用例只能從其特定的等價類分區(qū)中生成,邊界值分析法是對等價類劃分法進(jìn)行補充的測試用例設(shè)計方法,每種方法都有其優(yōu)點和缺點。雖然邊界值分析法比較費時,但是它的bug識別率也相對較高。兩種測試方法的應(yīng)用提高了軟件的可靠性,同時也提升了軟件質(zhì)量從而使客戶更加的滿意。
參考文獻(xiàn)
[1]B. Beizer, “Software TestingTechniques”.London: InternationalThompson Computer Press,1990.
[2] Glenford J.Myers.軟件測試藝術(shù)(原書第2版)[M].機械工業(yè)出版社,2005.
[3]徐芳,軟件測試技術(shù)[M].北京:機械工業(yè)出版社,2006.
[4]鄭人杰.軟件工程[M].北京:清華大學(xué)出版社,1999.
[5] Ron Patton.軟件測試[M].機械工業(yè)出版社.2006.