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

下載本文檔

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

文檔簡(jiǎn)介

1、一、概述1二、基本概念12.1正面測(cè)試(Positive Testing)12.2負(fù)面測(cè)試(Negative Testing)22.3分支測(cè)試22.4黑盒測(cè)試22.5白盒測(cè)試2三、單元測(cè)試范圍3四、 常見(jiàn)測(cè)試用例設(shè)計(jì)方法及舉例34.1 用于語(yǔ)句覆蓋的基路徑法34.2 用于MC/DC的真值表法94.3 邊界值法114.4 等價(jià)類(lèi)法124.5循環(huán)測(cè)試法174.6錯(cuò)誤推測(cè)法18五、相關(guān)注意事項(xiàng)185.1獨(dú)立性185.2盡量脫離被測(cè)代碼的束縛185.3面向?qū)ο蟮恼Z(yǔ)言單元測(cè)試特點(diǎn)185.4單元測(cè)試的命名標(biāo)準(zhǔn)191.單元測(cè)試的命名標(biāo)準(zhǔn)192.單元測(cè)試中的變量命名規(guī)范193.斷言和操作分離194.避免濫用s

2、etup和teardown19一、概述單元測(cè)試(模塊測(cè)試)是開(kāi)發(fā)者編寫(xiě)的一小段代碼,用于檢驗(yàn)被測(cè)代碼的一個(gè)很小的、很明確的功能是否正確。通常而言,一個(gè)單元測(cè)試是用于判斷某個(gè)特定條件(或者場(chǎng)景)下某個(gè)特定函數(shù)的行為。該文檔從測(cè)試角度出發(fā),去討論如何設(shè)計(jì)單元測(cè)試的測(cè)試用例。這里強(qiáng)調(diào),單元測(cè)試用例的設(shè)計(jì)是進(jìn)入實(shí)際編碼之前的,測(cè)試用例設(shè)計(jì)在前,更能體現(xiàn)出靈活性,如果已經(jīng)編碼完成再進(jìn)行測(cè)試用例的補(bǔ)充,這樣很容易進(jìn)入一個(gè)僅僅是測(cè)試了被測(cè)代碼段功能的怪圈,所以希望所有的單元測(cè)試工作,可以放在前面完成。同時(shí)單元測(cè)試用例是一個(gè)不斷完善的過(guò)程,前期設(shè)計(jì)好的用例,在代碼已經(jīng)實(shí)現(xiàn)完成后,會(huì)發(fā)現(xiàn)覆蓋的并不是很全面,有良

3、好的習(xí)慣是需要將對(duì)應(yīng)的測(cè)試用例進(jìn)行補(bǔ)充,而在提交測(cè)試后發(fā)現(xiàn)的重要的bug,也需要進(jìn)行單元測(cè)試用例的補(bǔ)充,使單元測(cè)試和各種測(cè)試方法相結(jié)合,實(shí)現(xiàn)測(cè)試質(zhì)量的充分保證。二、基本概念2.1正面測(cè)試(Positive Testing)測(cè)試被測(cè)對(duì)象的正確功能實(shí)現(xiàn)無(wú)誤,即正常流程功能。往往需要根據(jù)設(shè)計(jì)說(shuō)明進(jìn)行用例導(dǎo)出,嚴(yán)格按照設(shè)計(jì)說(shuō)明編寫(xiě)即可,用例劃分注意等價(jià)類(lèi)區(qū)分等方法。例如:接口返回小于等于24個(gè)中文字的offer標(biāo)題(這里標(biāo)題控制不會(huì)超過(guò)24個(gè)字)進(jìn)行頁(yè)面展示。2.2負(fù)面測(cè)試(Negative Testing)測(cè)試被測(cè)對(duì)象的異常功能實(shí)現(xiàn)無(wú)誤,多在異常流程,異常數(shù)據(jù)中體現(xiàn)。該部分測(cè)試需要對(duì)被測(cè)對(duì)象進(jìn)行錯(cuò)誤

4、發(fā)散,常依賴于邊界值區(qū)分等方法。例如:接口返回25個(gè)中文字的offer標(biāo)題進(jìn)行頁(yè)面展示。2.3分支測(cè)試使用流程圖,明確可能出現(xiàn)的每條分支,制造響應(yīng)的數(shù)據(jù)進(jìn)行覆蓋,實(shí)現(xiàn)對(duì)被測(cè)對(duì)象的測(cè)試。這個(gè)過(guò)程對(duì)于分支可以進(jìn)行響應(yīng)的簡(jiǎn)化,可以穿插等價(jià)類(lèi)等方法去除同類(lèi)分支。例如:實(shí)現(xiàn)offer發(fā)布的功能,分別會(huì)出現(xiàn)發(fā)布普通產(chǎn)品,代理加盟,求購(gòu),供應(yīng)等分支,測(cè)試offer提交模塊的時(shí)候,需要區(qū)分這么多重類(lèi)型的數(shù)據(jù),那么假設(shè)對(duì)于全部供應(yīng)類(lèi)型的offer,實(shí)現(xiàn)上都是一樣的,就可以進(jìn)行等價(jià)類(lèi)劃分,區(qū)分供應(yīng)和求購(gòu)即可。2.4黑盒測(cè)試不關(guān)心被測(cè)對(duì)象內(nèi)部,將其當(dāng)做一個(gè)黑盒,僅僅關(guān)注對(duì)該模塊的輸入?yún)^(qū)分和輸出結(jié)果校驗(yàn)。2.5白盒測(cè)

5、試 將被測(cè)對(duì)象的每個(gè)實(shí)現(xiàn)都充分了解,根據(jù)內(nèi)部實(shí)現(xiàn)進(jìn)行用例設(shè)計(jì),需要保證每個(gè)獨(dú)立路徑都完成用例覆蓋,而常規(guī)的對(duì)每個(gè)獨(dú)立路徑進(jìn)行真假驗(yàn)證。三、單元測(cè)試范圍單元測(cè)試范圍的重點(diǎn)包括兩個(gè)方面:1.測(cè)試代碼實(shí)現(xiàn)的功能,這個(gè)可以通過(guò)需求文檔進(jìn)行整理,然后調(diào)整每個(gè)功能點(diǎn)的顆粒度,盡量可以和開(kāi)發(fā)實(shí)現(xiàn)的被測(cè)單元進(jìn)行對(duì)應(yīng),入口文檔包括需求文檔、設(shè)計(jì)文檔;2.外部接口和底層實(shí)現(xiàn)。4、 常見(jiàn)測(cè)試用例設(shè)計(jì)方法及舉例4.1 用于語(yǔ)句覆蓋的基路徑法       基路徑法保證設(shè)計(jì)出的測(cè)試用例,使程序的每一個(gè)可執(zhí)行語(yǔ)句至少執(zhí)行一次,即實(shí)現(xiàn)語(yǔ)句覆蓋?;窂椒ㄊ抢碚撆c應(yīng)用脫

6、節(jié)的典型,基本上沒(méi)有應(yīng)用價(jià)值,讀者稍作了解即可,不必理解和掌握?;窂椒ú襟E如下:      1)畫(huà)出程序的控制流圖      控制流圖是描述程序控制流的一種圖示方法,主要由結(jié)點(diǎn)和邊構(gòu)成,邊代表控制流的方向,節(jié)點(diǎn)代表控制流的匯聚處,邊和結(jié)點(diǎn)圈定的空間叫做區(qū)域,下面是控制流圖的基本元素:以下代碼:void Sort(int iRecordNum, int iType)      int x = 0;    &

7、#160; int y = 0;       while(iRecordNum- > 0)                 if(0 = iType)                    &#

8、160;       x = y+2;                 break;                      elseif(1 = iType) 

9、60;                          x = y+10;                  else      

10、0;                     x = y+ 20;                 可以畫(huà)出以下控制流圖:  2)計(jì)算程序環(huán)路復(fù)雜度環(huán)路復(fù)雜度V(G)可用以下3種方法求得:(1) 環(huán)路復(fù)雜度等于控制流圖中的區(qū)域數(shù);上圖中,有

11、4個(gè)區(qū)域,V(G) = 4。(2) 設(shè)E為控制流圖的邊數(shù),N為結(jié)點(diǎn)數(shù),則環(huán)路復(fù)雜度為EN2;上圖中,V(G) = 10(邊) 8(結(jié)點(diǎn)) + 2 = 4。(3) 設(shè)P為控制流圖中的判定結(jié)點(diǎn)數(shù),環(huán)路復(fù)雜度為P1。上圖中:V(G) = 3(判定結(jié)點(diǎn)) + 1 = 4。環(huán)路復(fù)雜度是獨(dú)立路徑數(shù)的上界,也就是需要的測(cè)試用例數(shù)的上界。       3)導(dǎo)出基本路徑集       基本路徑數(shù)等于V(G)。根據(jù)上面的計(jì)算方法,可得出需要的基本路徑數(shù)為4。路徑就是從程序的入口到出口的可能路線,

12、基本路徑要求每條路徑至少包含一條新的邊,直到所有的邊都被包含。需要提醒的是:基路徑法和路徑覆蓋是兩回事,用于設(shè)計(jì)用例的基路徑數(shù)一般小于全部路徑數(shù),即基本路徑集不是惟一的?;窂椒ㄍ瓿傻氖钦Z(yǔ)句覆蓋,而不是路徑覆蓋。下面選擇四條基本路徑:路徑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,

13、 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í)在是太普通了。這種成本巨高的方法,其測(cè)試效果如何呢?測(cè)試效果完全與成本不匹配,首先,基路徑法完成的只是代碼覆蓋,這是最低級(jí)別的覆蓋,其次,整個(gè)設(shè)計(jì)過(guò)程都是依據(jù)已經(jīng)存在的代碼來(lái)進(jìn)行的,沒(méi)有考慮

14、程序的設(shè)計(jì)功能,是典型的“跟著代碼走”,不足是顯而易見(jiàn)的。綜上所述,基路徑法沒(méi)有實(shí)際應(yīng)用價(jià)值。 4.2 用于MC/DC的真值表法設(shè)計(jì)用于MC/DC的用例,可以先將條件值的所有可能組合列出表格,然后從中選擇用例,稱(chēng)為真值表法。例如判定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

15、和7;為了使C獨(dú)立影響判定結(jié)果,選擇A和B相同,判定結(jié)果相反,且C相反的組合:組合5和6。因此,組合2、5、6、7符合MC/DC要求。符合MC/DC要求的用例集不是惟一的。為了提高效率,可以使用工具來(lái)生成真值表和找出符合要求的組合,有些商業(yè)工具具有這種功能。自行開(kāi)發(fā)難度也不大,下面提出開(kāi)發(fā)MC/DC用例設(shè)計(jì)小工具的思路,有興趣的讀者可以嘗試一下:1)用一個(gè)簡(jiǎn)單的詞法和語(yǔ)法分析器解析判定表達(dá)式,計(jì)算條件數(shù)量;2)生成真值表;3)用一個(gè)邏輯表達(dá)式計(jì)算器,針對(duì)每個(gè)條件C,掃描真值表,找出符合以下要求的組合:除條件C外,其他條件取值相同;將條件C的真值和假值分別代入判定表達(dá)式,判定的計(jì)算結(jié)果相反。4)

16、針對(duì)找出的組合,設(shè)計(jì)兩個(gè)用例,條件C分別取真和假。需要注意的是,判定中可能存在完全相同的條件,例如:(A=0 | B = 1) && C = 2 | (A=0 && D = 3)針對(duì)A=0設(shè)計(jì)MC/DC用例時(shí),前一個(gè)A=0取反,后一個(gè)A=0也會(huì)跟著取反,如果后一個(gè)A=0視為其他條件,則不能實(shí)現(xiàn)MC/DC覆蓋,因此,計(jì)算判定值時(shí),兩個(gè)A=0應(yīng)視為同一個(gè)條件。 4.3 邊界值法       邊界值法假定錯(cuò)誤最有可能出現(xiàn)在區(qū)間之間的邊界,一般對(duì)邊界值本身,及邊界值的兩邊都需設(shè)計(jì)測(cè)試用例。如下函數(shù):/

17、參數(shù)age表示年齡int func(int age)    int ret = 0;      / do something      return ret; 參數(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ū)斎脒€會(huì)分段處理,例如,

18、年齡在10以下,為兒童,需要特別照顧;年齡在60歲以上,為退休老人,不能安排工作,那么,10和60是內(nèi)部邊界,也要設(shè)計(jì)測(cè)試用例:用例7:age =9;用例8:age = 10;用例9:age = 11;用例10:age = 59;用例11:age = 60;用例12:age = 61;邊界值法需要了解數(shù)據(jù)所代表的實(shí)際意義,此外對(duì)于枚舉類(lèi)型等非標(biāo)量數(shù)據(jù)不適用。邊界值法對(duì)于復(fù)雜的軟件項(xiàng)目來(lái)說(shuō),適用范圍有限。 4.4 等價(jià)類(lèi)法       先從代碼編寫(xiě)的思路說(shuō)起。程序員編寫(xiě)一個(gè)函數(shù)的代碼,會(huì)如何做呢?   &#

19、160;   首先,了解代碼功能。程序的功能是什么?無(wú)非就是:有哪些輸入?執(zhí)行什么操作或計(jì)算?產(chǎn)生什么輸出?        然后,將功能細(xì)化,形成一個(gè)或多個(gè)功能點(diǎn)。一個(gè)功能點(diǎn)就是一類(lèi)輸入及其處理。什么叫“一類(lèi)”輸入?程序可能有無(wú)數(shù)輸入,但代碼并不需要用無(wú)數(shù)個(gè)判定來(lái)對(duì)每個(gè)輸入分別做處理,只需將輸入分類(lèi),需要做相同處理的輸入歸于一類(lèi),這就是“等價(jià)類(lèi)”。從編程角度來(lái)說(shuō),“等價(jià)類(lèi)”是指計(jì)算或操作過(guò)程的“等價(jià)”,一個(gè)等價(jià)類(lèi)就是處理過(guò)程完全相同的輸入的集合。程序中通常用判定來(lái)識(shí)別分類(lèi),一個(gè)判定就是一次分類(lèi),嵌套的判定

20、則會(huì)造成分類(lèi)數(shù)量的翻番。       所以,函數(shù)代碼編寫(xiě)的核心思維就是等價(jià)類(lèi)劃分和處理。一個(gè)函數(shù)要完全正確,關(guān)鍵是等價(jià)類(lèi)的劃分要正確完整,且每個(gè)等價(jià)類(lèi)的處理正確。       舉個(gè)例子,現(xiàn)在要編寫(xiě)一個(gè)函數(shù),將字符串左邊的空格刪除。函數(shù)原形如下:char* strtrml(char *str);功能:將str左邊空格刪除,并返回str本身。功能點(diǎn):1. 左邊有空格:刪除;(正常輸入)2. 左邊無(wú)空格:不作處理;(正常輸入)3. 全部是空格:全部刪除;(正常輸入)4. 空串:不作

21、處理;(邊界輸入)5. 空指針:直接返回。(非法輸入)       不一定需要針對(duì)每個(gè)功能點(diǎn)分別寫(xiě)代碼,因?yàn)槌绦蛑械膇f、for、while等語(yǔ)句本身具有“如果不符合條件就跳過(guò)”的含義,所以很多功能點(diǎn)是可以共用代碼的,例如,前4個(gè)功能點(diǎn)只需要相同的代碼,不過(guò),編程時(shí)對(duì)功能點(diǎn)的考慮還是要全面。       既然函數(shù)沒(méi)有錯(cuò)誤的關(guān)鍵是等價(jià)類(lèi)劃分正確完整且處理正確,那么測(cè)試時(shí),只要把輸入的等價(jià)類(lèi)都列出來(lái),并設(shè)定正確的預(yù)期輸出,進(jìn)行測(cè)試就行了。   

22、60;   這就是通常說(shuō)的“等價(jià)類(lèi)”法,從測(cè)試角度來(lái)說(shuō)的“等價(jià)”,是指測(cè)試效果上的等價(jià),即同類(lèi)中一個(gè)數(shù)據(jù)測(cè)試通過(guò),可以肯定其他數(shù)據(jù)也會(huì)測(cè)試通過(guò)。       用例設(shè)計(jì)的首要工作是設(shè)定輸入。輸入有哪些呢?要從正常輸入、邊界輸入、非法輸入三方面考慮,每方面進(jìn)一步劃分形成等價(jià)類(lèi),即要考慮:有哪些正常輸入?有哪些邊界輸入?有哪些非法輸入?多個(gè)輸入時(shí),例如有多個(gè)參數(shù),首先把各個(gè)參數(shù)的等價(jià)類(lèi)列出來(lái),然后要考慮參數(shù)之間是否存在特殊的組合關(guān)系。例如下面的函數(shù):/計(jì)算某年某月某日是星期幾,參數(shù)分別表示年月日int Date(int

23、year, int month, int day); 用例如下表(假設(shè)year的有效范圍是1-9999):輸入正常值邊界值非法值組合Year2000(閏年)2009(非閏年)19999010000閏年和非閏年要保證都和2月組合;2月要和28、29、30日組合;小月要和30、31日組合;大月要和31、32日組合month2(短月)3(大月)4(小月)112013Day10(普通)28(非閏年二月)29(閏年二月)30(小月)131032        用例的輸出是比較容易被輕視的工作,但是,沒(méi)有充分且正確的預(yù)期輸出,用例基本上

24、沒(méi)有意義,就像醫(yī)生要求病人做一大堆檢查,卻不看檢查結(jié)果一樣。預(yù)期輸出要根據(jù)程序的設(shè)計(jì)功能確定正確的值。一個(gè)用例的預(yù)期輸出可能有多個(gè)。       等價(jià)類(lèi)法是與程序的基本特性“對(duì)數(shù)據(jù)分類(lèi)處理”相匹配的方法。對(duì)于一個(gè)函數(shù)來(lái)說(shuō),如果對(duì)數(shù)據(jù)的分類(lèi)正確且完整,每一個(gè)分類(lèi)處理正確,那么,程序就沒(méi)有問(wèn)題。同樣,測(cè)試時(shí),只要依據(jù)設(shè)計(jì)功能,找出所有等價(jià)類(lèi),那么,用例就是完整的。所以,用例的完整性,本質(zhì)上是指等價(jià)類(lèi)是否劃分正確且完整,每一類(lèi)的正確輸出是否均依據(jù)設(shè)計(jì)功能正確設(shè)定。       使用

25、了等價(jià)類(lèi)法后,是否需要使用其他方法呢?       等價(jià)類(lèi)法從“有哪些正常輸入?有哪些邊界輸入?有哪些非法輸入?”三個(gè)方面來(lái)考慮等價(jià)類(lèi),因此,邊界值法是等價(jià)類(lèi)法的一部分。  常見(jiàn)的用例設(shè)計(jì)方法中還有正交法和錯(cuò)誤推測(cè)法。正交法考慮數(shù)據(jù)的組合,實(shí)際上,如果程序?qū)斎霐?shù)據(jù)的組合需要判斷處理,也是一種等價(jià)類(lèi)劃分,但正交法會(huì)產(chǎn)生大量的多余組合,且可能缺少必要的組合,因此不推薦采用正交法,應(yīng)該根據(jù)數(shù)據(jù)的實(shí)際意義自行組合。單獨(dú)從錯(cuò)誤推測(cè)角度去設(shè)計(jì)用例未免太不可靠,但錯(cuò)誤推測(cè)法可以作為檢查等價(jià)類(lèi)是否完整的一種思路,即用等價(jià)類(lèi)法設(shè)計(jì)用例后,可以考慮哪些輸入比較容易產(chǎn)生錯(cuò)誤,以檢查是否遺漏,這只是一種檢查思路,也包含在等價(jià)類(lèi)法之中??傊?,用例設(shè)計(jì)只需使用等價(jià)類(lèi)法,但可以從多種角度檢查等價(jià)類(lèi)的完整性。4.5循環(huán)測(cè)試法在程序中多循環(huán)判斷是,我們一樣需要重點(diǎn)關(guān)注,根據(jù)循環(huán)的重量級(jí)進(jìn)行。例如一個(gè)簡(jiǎn)單循環(huán)判斷:如下圖4-5,有如下幾個(gè)分支需要覆蓋:1、跳過(guò)整個(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ù))不難看出,通過(guò)上述分支的覆蓋,就可以驗(yàn)證循環(huán)的功能以及循環(huán)設(shè)置的邊界是否生效,

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論