單元測試用例設(shè)計(jì)_第1頁
單元測試用例設(shè)計(jì)_第2頁
單元測試用例設(shè)計(jì)_第3頁
單元測試用例設(shè)計(jì)_第4頁
單元測試用例設(shè)計(jì)_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

TOC\o"1-3"\h\z\u6427一、概述 將被測對象的每個(gè)實(shí)現(xiàn)都充分了解,根據(jù)內(nèi)部實(shí)現(xiàn)進(jìn)行用例設(shè)計(jì),需要保證每個(gè)獨(dú)立路徑都完成用例覆蓋,而常規(guī)的對每個(gè)獨(dú)立路徑進(jìn)行真假驗(yàn)證。三、單元測試范圍單元測試范圍的重點(diǎn)包括兩個(gè)方面:1.測試代碼實(shí)現(xiàn)的功能,這個(gè)可以通過需求文檔進(jìn)行整理,然后調(diào)整每個(gè)功能點(diǎn)的顆粒度,盡量可以和開發(fā)實(shí)現(xiàn)的被測單元進(jìn)行對應(yīng),入口文檔包括需求文檔、設(shè)計(jì)文檔;2.外部接口和底層實(shí)現(xiàn)。常見測試用例設(shè)計(jì)方法及舉例4.1用于語句覆蓋的基路徑法

基路徑法保證設(shè)計(jì)出的測試用例,使程序的每一個(gè)可執(zhí)行語句至少執(zhí)行一次,即實(shí)現(xiàn)語句覆蓋?;窂椒ㄊ抢碚撆c應(yīng)用脫節(jié)的典型,基本上沒有應(yīng)用價(jià)值,讀者稍作了解即可,不必理解和掌握?;窂椒ú襟E如下:

1)畫出程序的控制流圖

控制流圖是描述程序控制流的一種圖示方法,主要由結(jié)點(diǎn)和邊構(gòu)成,邊代表控制流的方向,節(jié)點(diǎn)代表控制流的匯聚處,邊和結(jié)點(diǎn)圈定的空間叫做區(qū)域,下面是控制流圖的基本元素:以下代碼:voidSort(intiRecordNum,intiType){

intx=0;

inty=0;

while(iRecordNum-->0)

{

if(0==iType)

{

x=y+2;

break;

}

elseif(1==iType)

{

x=y+10;

}

else

{

x=y+20;

}

}}可以畫出以下控制流圖:

2)計(jì)算程序環(huán)路復(fù)雜度環(huán)路復(fù)雜度V(G)可用以下3種方法求得:(1)環(huán)路復(fù)雜度等于控制流圖中的區(qū)域數(shù);上圖中,有4個(gè)區(qū)域,V(G)=4。(2)設(shè)E為控制流圖的邊數(shù),N為結(jié)點(diǎn)數(shù),則環(huán)路復(fù)雜度為E-N+2;上圖中,V(G)=10(邊)–8(結(jié)點(diǎn))+2=4。(3)設(shè)P為控制流圖中的判定結(jié)點(diǎn)數(shù),環(huán)路復(fù)雜度為P+1。上圖中:V(G)=3(判定結(jié)點(diǎn))+1=4。環(huán)路復(fù)雜度是獨(dú)立路徑數(shù)的上界,也就是需要的測試用例數(shù)的上界。

3)導(dǎo)出基本路徑集

基本路徑數(shù)等于V(G)。根據(jù)上面的計(jì)算方法,可得出需要的基本路徑數(shù)為4。路徑就是從程序的入口到出口的可能路線,基本路徑要求每條路徑至少包含一條新的邊,直到所有的邊都被包含。需要提醒的是:基路徑法和路徑覆蓋是兩回事,用于設(shè)計(jì)用例的基路徑數(shù)一般小于全部路徑數(shù),即基本路徑集不是惟一的。基路徑法完成的是語句覆蓋,而不是路徑覆蓋。下面選擇四條基本路徑:路徑1:1-11路徑2:1-2-3-4-5-1-11路徑3:1-2-3-6-8-9-10-1-11路徑4:1-2-3-6-7-9-10-1-11

4)設(shè)計(jì)用例根據(jù)上面的路徑,可以設(shè)計(jì)出以下用例:路徑1:1-11用例1:iRecordNum=0路徑2:1-2-3-4-5-1-11用例2:iRecordNum=1,iType=0路徑3:1-2-3-6-8-9-10-1-11用例3:iRecordNum=1,iType=1路徑4:1-2-3-6-7-9-10-1-11用例4:iRecordNum=1,iType=2

從上述步驟可以看出,基路徑法工作量巨大,如果用于五十行左右的函數(shù),將耗費(fèi)大量的時(shí)間,而五十行代碼的函數(shù)實(shí)在是太普通了。這種成本巨高的方法,其測試效果如何呢?測試效果完全與成本不匹配,首先,基路徑法完成的只是代碼覆蓋,這是最低級別的覆蓋,其次,整個(gè)設(shè)計(jì)過程都是依據(jù)已經(jīng)存在的代碼來進(jìn)行的,沒有考慮程序的設(shè)計(jì)功能,是典型的“跟著代碼走”,不足是顯而易見的。綜上所述,基路徑法沒有實(shí)際應(yīng)用價(jià)值。

4.2用于MC/DC的真值表法設(shè)計(jì)用于MC/DC的用例,可以先將條件值的所有可能組合列出表格,然后從中選擇用例,稱為真值表法。例如判定A||(B&&C),條件組合如下表:

ABC判定結(jié)果組合1TTTT組合2TTFT組合3TFTT組合4TFFT組合5FTTT組合6FTFF組合7FFTF組合8FFFF為了使A獨(dú)立影響判定結(jié)果,選擇B和C相同,判定結(jié)果相反,且A相反的組合:組合2和6;為了使B獨(dú)立影響判定結(jié)果,選擇A和C相同,判定結(jié)果相反,且B相反的組合:組合5和7;為了使C獨(dú)立影響判定結(jié)果,選擇A和B相同,判定結(jié)果相反,且C相反的組合:組合5和6。因此,組合2、5、6、7符合MC/DC要求。符合MC/DC要求的用例集不是惟一的。為了提高效率,可以使用工具來生成真值表和找出符合要求的組合,有些商業(yè)工具具有這種功能。自行開發(fā)難度也不大,下面提出開發(fā)MC/DC用例設(shè)計(jì)小工具的思路,有興趣的讀者可以嘗試一下:1)用一個(gè)簡單的詞法和語法分析器解析判定表達(dá)式,計(jì)算條件數(shù)量;2)生成真值表;3)用一個(gè)邏輯表達(dá)式計(jì)算器,針對每個(gè)條件C,掃描真值表,找出符合以下要求的組合:除條件C外,其他條件取值相同;將條件C的真值和假值分別代入判定表達(dá)式,判定的計(jì)算結(jié)果相反。4)針對找出的組合,設(shè)計(jì)兩個(gè)用例,條件C分別取真和假。需要注意的是,判定中可能存在完全相同的條件,例如:(A==0||B==1)&&C==2||(A==0&&D==3)針對A==0設(shè)計(jì)MC/DC用例時(shí),前一個(gè)A==0取反,后一個(gè)A==0也會跟著取反,如果后一個(gè)A==0視為其他條件,則不能實(shí)現(xiàn)MC/DC覆蓋,因此,計(jì)算判定值時(shí),兩個(gè)A==0應(yīng)視為同一個(gè)條件。

4.3邊界值法

邊界值法假定錯(cuò)誤最有可能出現(xiàn)在區(qū)間之間的邊界,一般對邊界值本身,及邊界值的兩邊都需設(shè)計(jì)測試用例。如下函數(shù)://參數(shù)age表示年齡intfunc(intage){

intret=0;

//…dosomething

returnret;}

參數(shù)age表示一個(gè)人的年齡,假設(shè)有效的取值范圍是0-200,那么,用邊界值法可以得出以下用例(省略輸出):用例1:age=-1;用例2:age=0;用例3:age=1;用例4:age=199;用例5:age=200;用例6:age=201;通常,程序?qū)斎脒€會分段處理,例如,年齡在10以下,為兒童,需要特別照顧;年齡在60歲以上,為退休老人,不能安排工作,那么,10和60是內(nèi)部邊界,也要設(shè)計(jì)測試用例:用例7:age=9;用例8:age=10;用例9:age=11;用例10:age=59;用例11:age=60;用例12:age=61;邊界值法需要了解數(shù)據(jù)所代表的實(shí)際意義,此外對于枚舉類型等非標(biāo)量數(shù)據(jù)不適用。邊界值法對于復(fù)雜的軟件項(xiàng)目來說,適用范圍有限。4.4等價(jià)類法

先從代碼編寫的思路說起。程序員編寫一個(gè)函數(shù)的代碼,會如何做呢?

首先,了解代碼功能。程序的功能是什么?無非就是:有哪些輸入?執(zhí)行什么操作或計(jì)算?產(chǎn)生什么輸出?

然后,將功能細(xì)化,形成一個(gè)或多個(gè)功能點(diǎn)。一個(gè)功能點(diǎn)就是一類輸入及其處理。什么叫“一類”輸入?程序可能有無數(shù)輸入,但代碼并不需要用無數(shù)個(gè)判定來對每個(gè)輸入分別做處理,只需將輸入分類,需要做相同處理的輸入歸于一類,這就是“等價(jià)類”。從編程角度來說,“等價(jià)類”是指計(jì)算或操作過程的“等價(jià)”,一個(gè)等價(jià)類就是處理過程完全相同的輸入的集合。程序中通常用判定來識別分類,一個(gè)判定就是一次分類,嵌套的判定則會造成分類數(shù)量的翻番。

所以,函數(shù)代碼編寫的核心思維就是等價(jià)類劃分和處理。一個(gè)函數(shù)要完全正確,關(guān)鍵是等價(jià)類的劃分要正確完整,且每個(gè)等價(jià)類的處理正確。

舉個(gè)例子,現(xiàn)在要編寫一個(gè)函數(shù),將字符串左邊的空格刪除。函數(shù)原形如下:char*strtrml(char*str);功能:將str左邊空格刪除,并返回str本身。功能點(diǎn):1.左邊有空格:刪除;(正常輸入)2.左邊無空格:不作處理;(正常輸入)3.全部是空格:全部刪除;(正常輸入)

4.空串:不作處理;(邊界輸入)5.空指針:直接返回。(非法輸入)

不一定需要針對每個(gè)功能點(diǎn)分別寫代碼,因?yàn)槌绦蛑械膇f、for、while等語句本身具有“如果不符合條件就跳過”的含義,所以很多功能點(diǎn)是可以共用代碼的,例如,前4個(gè)功能點(diǎn)只需要相同的代碼,不過,編程時(shí)對功能點(diǎn)的考慮還是要全面。

既然函數(shù)沒有錯(cuò)誤的關(guān)鍵是等價(jià)類劃分正確完整且處理正確,那么測試時(shí),只要把輸入的等價(jià)類都列出來,并設(shè)定正確的預(yù)期輸出,進(jìn)行測試就行了。

這就是通常說的“等價(jià)類”法,從測試角度來說的“等價(jià)”,是指測試效果上的等價(jià),即同類中一個(gè)數(shù)據(jù)測試通過,可以肯定其他數(shù)據(jù)也會測試通過。

用例設(shè)計(jì)的首要工作是設(shè)定輸入。輸入有哪些呢?要從正常輸入、邊界輸入、非法輸入三方面考慮,每方面進(jìn)一步劃分形成等價(jià)類,即要考慮:有哪些正常輸入?有哪些邊界輸入?有哪些非法輸入?多個(gè)輸入時(shí),例如有多個(gè)參數(shù),首先把各個(gè)參數(shù)的等價(jià)類列出來,然后要考慮參數(shù)之間是否存在特殊的組合關(guān)系。例如下面的函數(shù)://計(jì)算某年某月某日是星期幾,參數(shù)分別表示年月日intDate(intyear,intmonth,intday);用例如下表(假設(shè)year的有效范圍是1-9999):輸入正常值邊界值非法值組合Year2000(閏年)2009(非閏年)19999010000閏年和非閏年要保證都和2月組合;

2月要和28、29、30日組合;

小月要和30、31日組合;

大月要和31、32日組合month2(短月)

3(大月)

4(小月)112013Day10(普通)

28(非閏年二月)29(閏年二月)30(小月)131032

用例的輸出是比較容易被輕視的工作,但是,沒有充分且正確的預(yù)期輸出,用例基本上沒有意義,就像醫(yī)生要求病人做一大堆檢查,卻不看檢查結(jié)果一樣。預(yù)期輸出要根據(jù)程序的設(shè)計(jì)功能確定正確的值。一個(gè)用例的預(yù)期輸出可能有多個(gè)。

等價(jià)類法是與程序的基本特性“對數(shù)據(jù)分類處理”相匹配的方法。對于一個(gè)函數(shù)來說,如果對數(shù)據(jù)的分類正確且完整,每一個(gè)分類處理正確,那么,程序就沒有問題。同樣,測試時(shí),只要依據(jù)設(shè)計(jì)功能,找出所有等價(jià)類,那么,用例就是完整的。所以,用例的完整性,本質(zhì)上是指等價(jià)類是否劃分正確且完整,每一類的正確輸出是否均依據(jù)設(shè)計(jì)功能正確設(shè)定。

使用了等價(jià)類法后,是否需要使用其他方法呢?

等價(jià)類法從“有哪些正常輸入?有哪些邊界輸入?有哪些非法輸入?”三個(gè)方面來考慮等價(jià)類,因此,邊界值法是等價(jià)類法的一部分。

常見的用例設(shè)計(jì)方法中還有正交法和錯(cuò)誤推測法。正交法考慮數(shù)據(jù)的組合,實(shí)際上,如果程序?qū)斎霐?shù)據(jù)的組合需要判斷處理,也是一種等價(jià)類劃分,但正交法會產(chǎn)生大量的多余組合,且可能缺少必要的組合,因此不推薦采用正交法,應(yīng)該根據(jù)數(shù)據(jù)的實(shí)際意義自行組合。單獨(dú)從錯(cuò)誤推測角度去設(shè)計(jì)用例未免太不可靠,但錯(cuò)誤推測法可以作為檢查等價(jià)類是否完整的一種思路,即用等價(jià)類法設(shè)計(jì)用例后,可以考慮哪些輸入比較容易產(chǎn)生錯(cuò)誤,以檢查是否遺漏,這只是一種檢查思路,也包含在等價(jià)類法之中??傊?,用例設(shè)計(jì)只需使用等價(jià)類法,但可以從多種角度檢查等價(jià)類的完整性。4.5循環(huán)測試法在程序中多循環(huán)判斷是,我們一樣需要重點(diǎn)關(guān)注,根據(jù)循環(huán)的重量級進(jìn)行。例如一個(gè)簡單循環(huán)判斷:如下圖4-5,有如下幾個(gè)分支需要覆蓋:1、跳過整個(gè)循環(huán):不進(jìn)入循環(huán)流程2、僅有一次進(jìn)入循環(huán):需要進(jìn)行數(shù)據(jù)構(gòu)造,能夠讓循環(huán)運(yùn)行一次3、n次進(jìn)入循環(huán)(n為循環(huán)的最大次數(shù))不難看出,通過上述分支的覆蓋,就可以驗(yàn)證循環(huán)的功能以及循環(huán)設(shè)置的邊界是否生效,不會出現(xiàn)循環(huán)沒有控制好,導(dǎo)致實(shí)際使用的時(shí)候會多進(jìn)行一次或者少進(jìn)行一次循環(huán)的情況。圖4-54.6錯(cuò)誤推測法錯(cuò)誤猜測大多源于經(jīng)驗(yàn),需要從邊界值分析等其他技術(shù)獲得幫助。這種技術(shù)猜測特定軟件類型可能發(fā)生的錯(cuò)誤類型,并且設(shè)計(jì)測試用例查出這些錯(cuò)誤。對有經(jīng)驗(yàn)的工程師來講,錯(cuò)誤猜測有時(shí)是唯一最有效發(fā)現(xiàn)bug的測試設(shè)計(jì)方法。為了最好的利用現(xiàn)成的經(jīng)驗(yàn),可以列出一個(gè)錯(cuò)誤類型的檢查列表,幫助猜測錯(cuò)誤可能發(fā)生在單元中的位置,提高錯(cuò)誤猜測的有效性。五、相關(guān)注意事項(xiàng)5.1獨(dú)立性單元測試用例在設(shè)計(jì)和數(shù)據(jù)準(zhǔn)備的過程中,需要保持良好的獨(dú)立性,確保本測試的數(shù)據(jù)是不需要依賴其他輸出的,這樣減少相互影響。5.2盡量脫離被測代碼的束縛在測試用例設(shè)計(jì)的過程中,尤其是測試用例編寫在代碼編寫完成后進(jìn)行的,一定小心被代碼實(shí)現(xiàn)功能所影響,多考慮異常分支和異常數(shù)據(jù)。5.3面向?qū)ο蟮恼Z言單元測試特點(diǎn)面向?qū)ο蟮恼Z言進(jìn)行單元測試還有一定的特點(diǎn),對于每一個(gè)類,可能他出現(xiàn)在程序中的情況各不相同,在進(jìn)行測試的時(shí)候,可以結(jié)合上面介紹的方法,根據(jù)內(nèi)部方法相互調(diào)用邏輯,完成測試設(shè)計(jì)。大體劃分兩個(gè)方向,一個(gè)是功能性的,就是類似黑盒的方法,僅僅關(guān)注實(shí)現(xiàn)的功能點(diǎn)是否正確;另一個(gè)就是結(jié)構(gòu)性測試,需要分析類中的方法相互實(shí)現(xiàn)邏輯,進(jìn)行類似白盒測試,確保每個(gè)分支覆蓋。5.4單元測試的命名標(biāo)準(zhǔn)1.單元測試的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論