自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

單元測(cè)試徹底測(cè)試的方法

開發(fā) 測(cè)試
單元測(cè)試是在軟件開發(fā)過程中要進(jìn)行的最低級(jí)別的測(cè)試活動(dòng),在單元測(cè)試活動(dòng)中,軟件的獨(dú)立單元將在與程序的其他部分相隔離的情況下進(jìn)行測(cè)試。本文介紹的是徹底測(cè)試的方法。

單元測(cè)試(模塊測(cè)試)是開發(fā)者編寫的一小段代碼,用于檢驗(yàn)被測(cè)代碼的一個(gè)很小的、很明確的功能是否正確。通常而言,一個(gè)單元測(cè)試是用于判斷某個(gè)特定條件(或者場(chǎng)景)下某個(gè)特定函數(shù)的行為。下面我們一起來看,徹底測(cè)試的方法。

1、徹底測(cè)試的可能性

有一種說法是,“測(cè)試總是不徹底的”,對(duì)于軟件整體來說,要做到徹底測(cè)試確實(shí)很難,但對(duì)于局部代碼,則是完全可能的。先說 “理想的徹底測(cè)試”,對(duì)于一段程序,比如一個(gè)函數(shù),如果它的所有可能輸入都測(cè)試過,并且都沒有錯(cuò)誤,那么可以肯定,這個(gè)函數(shù)是沒有錯(cuò)誤的,這就是 “理想的徹底測(cè)試”。“理想的徹底測(cè)試”是做不到的,有沒有 “現(xiàn)實(shí)的徹底測(cè)試”?有!“現(xiàn)實(shí)的徹底測(cè)試”就是所有的等價(jià)類都經(jīng)過測(cè)試。

先說說等價(jià)類。“類”是指把輸入數(shù)據(jù)分組,“等價(jià)”是指測(cè)試效果上的等價(jià),“等價(jià)類”就是在一組輸入數(shù)據(jù)中,任取一個(gè)進(jìn)行測(cè)試,如果測(cè)試通過,那么,可以認(rèn)為同組的其他輸入數(shù)據(jù)也可以測(cè)試通過,也就是說,測(cè)試了一個(gè),就等于測(cè)試了一組。如果把所有的等價(jià)類都找出來進(jìn)行測(cè)試,就相當(dāng)于所有輸入都經(jīng)過測(cè)試,這就是“現(xiàn)實(shí)的徹底測(cè)試”。

對(duì)于一段程序來說,“等價(jià)類”通常是有限的,因此,從理論上來說,對(duì)局部代碼進(jìn)行“現(xiàn)實(shí)的徹底測(cè)試”是完全可能的。

2、等價(jià)類劃分的基本方法

通常從三個(gè)方面考慮程序的輸入:正常輸入,邊界輸入,非法輸入。

正常輸入:例如字符串的Trim函數(shù),功能是將字符串前后的空格去除,那么正常的輸入可以有四類:前面有空格;后面有空格;前后均有空格;前后均無(wú)空格。

邊界輸入:上例中空字符串可以看作是邊界輸入,如果輸入是一個(gè)指針的話,空指針也算是邊界輸入。再如一個(gè)表示年齡的參數(shù),它的有效范圍是0-100,那么邊界輸入有兩個(gè):0和100。

非法輸入:非法輸入是正常取值范圍以外的數(shù)據(jù),或使代碼不能完成正常功能的輸入,如上例中表示年齡的參數(shù),小于0或大于100都是非法輸入,再如一個(gè)進(jìn)行文件操作的函數(shù),非法輸入可能有:文件不存在;目錄不存在;文件正在被其他程序打開;權(quán)限錯(cuò)誤。

一般情況下,只要考慮:有哪些正常輸入?有哪些邊界輸入?有哪些非法輸入?就可以找出大多數(shù)等價(jià)類,例如,一個(gè)函數(shù),功能是把小寫金額轉(zhuǎn)換成大寫,輸入是小寫數(shù)字,輸出是大寫金額,那么:

正常輸入有:只有整數(shù),只有小數(shù),既有整數(shù)又有小數(shù)

邊界輸入有:整數(shù)部分很大,0.0,小數(shù)位數(shù)超過兩位

非法輸入有:空串,非數(shù)字,負(fù)數(shù)

“等價(jià)類”這個(gè)詞是從測(cè)試的角度來說的,從開發(fā)的角度來看,“等價(jià)類”與“功能點(diǎn)”具有對(duì)應(yīng)關(guān)系,例如,字符串的Trim函數(shù),功能點(diǎn)有:

如果只有左邊有空格,返回刪除左邊空格后的結(jié)果(等價(jià)類:左邊有空格);

如果只有右邊有空格,返回刪除右邊空格后的結(jié)果(等價(jià)類:右邊有空格);

如果兩邊都有空格,返回刪除兩邊空格后的結(jié)果(等價(jià)類:兩邊有空格);

如果兩邊都沒有空格,返回原串(等價(jià)類:兩邊無(wú)空格);

如果是空串,直接返回(等價(jià)類:空串);

如果是空指針,直接返回(等價(jià)類:空指針);

……

一個(gè)“等價(jià)類”對(duì)應(yīng)程序的一個(gè)“功能點(diǎn)”,如果程序的所有功能點(diǎn)都正確實(shí)現(xiàn)了,那么這個(gè)程序的功能就肯定沒問題。程序員在寫代碼時(shí)肯定要想清楚程序的主要功能點(diǎn),否則代碼無(wú)從寫起,因此,如果程序員邊編碼邊測(cè)試的話,大部分等價(jià)類都是現(xiàn)成的。如果由測(cè)試部門做單元測(cè)試,測(cè)試部門只能依據(jù)設(shè)計(jì)文檔來測(cè)試,設(shè)計(jì)文檔也會(huì)規(guī)定程序的功能,要不然就無(wú)從測(cè)起,同樣可以說大部分等價(jià)類是現(xiàn)成的。

3、徹底測(cè)試的基本思路

前面說過:如果把所有的等價(jià)類都找出來進(jìn)行測(cè)試,就相當(dāng)于所有輸入都經(jīng)過測(cè)試,這就是“現(xiàn)實(shí)的徹底測(cè)試”。

如何把所有的等價(jià)類都找出來?根據(jù)程序的功能,大部分等價(jià)類都是容易想到的,甚至是現(xiàn)成的,但是,如何衡量是否完整?例如,前面所舉的兩個(gè)例子:刪除字符串兩邊空格的函數(shù)和將金額小寫轉(zhuǎn)大寫的程序,我們可以肯定,等價(jià)類最多也就十幾個(gè),相當(dāng)有限,但是,已經(jīng)列出的等價(jià)類是完整的嗎?有沒有遺漏的?

要找出所有等價(jià)類,關(guān)鍵是要有衡量完整性的指標(biāo)。等價(jià)類實(shí)際上就是程序的功能點(diǎn),程序的功能是人為規(guī)定的,很難衡量完整性,但白盒測(cè)試卻很容易衡量完整性,因此,我們可以考慮使用白盒測(cè)試的覆蓋率來衡量測(cè)試完整性。

看一下這個(gè)簡(jiǎn)單的例子:

  1. void Func(int* p)  
  2. {  
  3. if(p)  
  4. {  
  5. *p = 0;  
  6. }  
  7. else 
  8. {  
  9. return;  
  10. }  
  11. }  

參數(shù)p是一個(gè)指針,測(cè)試時(shí)當(dāng)然要將空指針作為一個(gè)等價(jià)類,如果漏了這個(gè)等價(jià)類,會(huì)怎么樣呢?分支覆蓋會(huì)不完整:else分支未覆蓋。從這個(gè)例子可以看出,未覆蓋的邏輯單位通常對(duì)應(yīng)未測(cè)試的等價(jià)類,因此,白盒覆蓋可以衡量等價(jià)類是否完整。

還是上面的例子,假如程序員完全忘了有空指針這回事,把代碼寫成這樣:

  1. void Func(int* p)  
  2. {  
  3. *p = 0;  

由于判斷p是否為空指針的代碼不存在,白盒覆蓋當(dāng)然不會(huì)提示說“某某代碼或某某分支未覆蓋”,因此,白盒覆蓋不能發(fā)現(xiàn)“程序員未處理某些特殊輸入”這種情形,也就是說,即便達(dá)到了***的白盒覆蓋率,仍然不能保證找出所有等價(jià)類。

程序員會(huì)忘記處理哪些輸入呢?常見的輸入一般是不會(huì)記的,否則程序的起碼功能都未實(shí)現(xiàn),容易忘記的是一些“偏僻”的輸入,例如,空指針、空字符串、很大的數(shù)、很小的數(shù)、合法取值邊界附近的值等等,從輸入的角度來看,這些特殊值通常跟數(shù)據(jù)類型有關(guān),從程序的行為來看,這些特殊輸入常常會(huì)導(dǎo)致崩潰、產(chǎn)生異常,或超時(shí),即具有行為特征,正好是自動(dòng)動(dòng)態(tài)測(cè)試可以發(fā)現(xiàn)的,因此,我們可以利用自動(dòng)動(dòng)態(tài)測(cè)試來捕捉“程序員未處理某些特殊輸入”形成的錯(cuò)誤。

4、徹底測(cè)試方法

基于上一節(jié)的思路,經(jīng)過長(zhǎng)時(shí)間摸索和改進(jìn),我們提出了實(shí)現(xiàn)徹底測(cè)試的“三步法”:

1)根據(jù)代碼的功能,人工設(shè)計(jì)測(cè)試用例進(jìn)行基本功能測(cè)試;

2)統(tǒng)計(jì)白盒覆蓋率,為未覆蓋的白盒單位設(shè)計(jì)測(cè)試用例,實(shí)現(xiàn)完整的白盒覆蓋,比較理想的覆蓋率是實(shí)現(xiàn)100%語(yǔ)句、條件、分支、路徑覆蓋;

3)自動(dòng)生成大量的測(cè)試用例,捕捉“程序員未處理某些特殊輸入”形成的錯(cuò)誤。

第1步的測(cè)試用例通常是現(xiàn)成的,因?yàn)樵敿?xì)設(shè)計(jì)文檔會(huì)規(guī)定程序的基本功能,沒有文檔的,程序員在編程時(shí)也要想清楚程序的功能,這些基本功能就是基本測(cè)試用例;

第2步是在第1步的基礎(chǔ)上,檢查未覆蓋的白盒單位,由于未覆蓋的邏輯單位通常對(duì)應(yīng)未測(cè)試的等價(jià)類,因此第2步可以找出第1步所遺漏的測(cè)試用例;

第3步用自動(dòng)動(dòng)態(tài)測(cè)試彌補(bǔ)第2步的固有缺陷。

“三步法”盡量避免重復(fù)工作,白盒方法和黑盒方法相結(jié)合,人工方法和自動(dòng)方法相補(bǔ)充,如果第2步的覆蓋率比較理想,那么基本上可以保證找出所有等價(jià)類。在開發(fā)過程允許的限度內(nèi),“三步法”已接近極限,當(dāng)?shù)闷?ldquo;徹底測(cè)試”四個(gè)字。

5、是否需要其他測(cè)試?

“三步法”使用了人工動(dòng)態(tài)測(cè)試和自動(dòng)動(dòng)態(tài)測(cè)試,未使用人工靜態(tài)分析和自動(dòng)靜態(tài)分析,要不要再使用這兩種方法呢?這就要看合不合算了,畢竟項(xiàng)目時(shí)間和預(yù)算是有限的。

“三步法”的測(cè)試完整性是***的,讀者可以比較一下,自己參與過的項(xiàng)目,所要求達(dá)到的覆蓋率是怎么樣的?做得比較好的,一般只是要求達(dá)到100%的代碼覆蓋,執(zhí)行中還未必能做到,而“三步法”所要達(dá)到完整性是這樣的:1)100%語(yǔ)句、條件、分支、路徑覆蓋;2)用自動(dòng)動(dòng)態(tài)測(cè)試捕捉未考慮某些特殊輸入形成的錯(cuò)誤。經(jīng)過這種徹底測(cè)試后,遺留的錯(cuò)誤可以說已經(jīng)極少了。

自動(dòng)靜態(tài)分析只能發(fā)現(xiàn)語(yǔ)法特征錯(cuò)誤,現(xiàn)代編譯器對(duì)多數(shù)這類錯(cuò)誤會(huì)給出警告,另外,現(xiàn)有的自動(dòng)靜態(tài)分析技術(shù)會(huì)產(chǎn)生大量的誤報(bào),在一大堆報(bào)告中去一條一條人工辨別,尋找遺漏的錯(cuò)誤,無(wú)異于“大海描針”。人工靜態(tài)分析也差不多。先做這兩項(xiàng)又怎么樣?顯然也是沒必要的。

為了統(tǒng)一代碼風(fēng)格,可以偶爾抽查代碼,也就是說,可以用人工靜態(tài)方法檢查代碼風(fēng)格和編碼規(guī)范。

原文鏈接:http://www.51testing.com/html/78/n-222978.html

【編輯推薦】

  1. PHP單元測(cè)試?yán)鳎篜HPUnit深入理解
  2. PHP單元測(cè)試?yán)鳎篜HPUnit深入用法
  3. 初探PHP單元測(cè)試?yán)鳎篜HPUnit
  4. 如何做好單元測(cè)試
責(zé)任編輯:于鐵 來源: 51Testing
相關(guān)推薦

2023-07-26 08:58:45

Golang單元測(cè)試

2017-01-14 23:42:49

單元測(cè)試框架軟件測(cè)試

2009-12-23 15:03:52

WPF單元測(cè)試

2009-09-01 10:20:06

protected方法單元測(cè)試

2024-10-16 16:09:32

2020-08-18 08:10:02

單元測(cè)試Java

2009-06-02 14:24:32

Hibernate單元測(cè)試HSQLDB

2011-06-20 17:25:02

單元測(cè)試

2017-01-14 23:26:17

單元測(cè)試JUnit測(cè)試

2017-01-16 12:12:29

單元測(cè)試JUnit

2011-06-14 15:56:42

單元測(cè)試

2022-05-12 09:37:03

測(cè)試JUnit開發(fā)

2017-03-23 16:02:10

Mock技術(shù)單元測(cè)試

2021-05-05 11:38:40

TestNGPowerMock單元測(cè)試

2011-07-04 18:16:42

單元測(cè)試

2020-05-07 17:30:49

開發(fā)iOS技術(shù)

2011-06-14 15:39:46

單元測(cè)試

2012-05-21 09:41:54

XcodeiOS單元測(cè)試

2011-04-18 13:20:40

單元測(cè)試軟件測(cè)試

2017-02-23 15:59:53

測(cè)試MockSetup
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)