单元测试用例编写总结 (白盒测试)
?
1 背景
測(cè)試是開(kāi)發(fā)的一個(gè)非常重要的方面,可以在很大程度上決定一個(gè)應(yīng)用程序的命運(yùn)。良好的測(cè)試可以在早期捕獲導(dǎo)致應(yīng)用程序崩潰的問(wèn)題,但較差的測(cè)試往往總是導(dǎo)致故障和停機(jī)。
單元測(cè)試用于測(cè)試各個(gè)代碼組件,并確保代碼按照預(yù)期的方式工作。單元測(cè)試由開(kāi)發(fā)人員編寫(xiě)和執(zhí)行。大多數(shù)情況下,使用JUnit或TestNG之類(lèi)的測(cè)試框架。測(cè)試用例通常是在方法級(jí)別寫(xiě)入并通過(guò)自動(dòng)化執(zhí)行。
單元測(cè)試不僅僅用來(lái)保證當(dāng)前代碼的正確性,更重要的是用來(lái)保證代碼修復(fù)、改進(jìn)或重構(gòu)之后的正確性。
2 單元測(cè)試用例相關(guān)概念
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ū)分等方法。
2.2負(fù)面測(cè)試(Negative Testing)
測(cè)試被測(cè)對(duì)象的異常功能實(shí)現(xiàn)無(wú)誤,多在異常流程,異常數(shù)據(jù)中體現(xiàn)。該部分測(cè)試需要對(duì)被測(cè)對(duì)象進(jìn)行錯(cuò)誤發(fā)散,常依賴(lài)于邊界值區(qū)分等方法。
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)分支。
2.4 邊界值分析法
這種方法更偏向于黑盒測(cè)試用例設(shè)計(jì)中使用,對(duì)被測(cè)輸入進(jìn)行邊界分析,從各個(gè)角度都會(huì)有邊界值,例如程序內(nèi)部依賴(lài)之間,已經(jīng)有一些邊界存在,在程序集成展示后,也會(huì)有新的邊界出現(xiàn),在設(shè)計(jì)的時(shí)候,需要注意這些細(xì)節(jié)。例如我們可輸入范圍是3-6,和輸入類(lèi)型為浮點(diǎn)數(shù)。那么邊界值為7-8之間
7 8
| |
?
3 單元測(cè)試設(shè)計(jì)原則和任務(wù)
3.1 三原則
為了提高開(kāi)發(fā)人員的代碼質(zhì)量,編寫(xiě)高質(zhì)量的單元測(cè)試,要遵守3R(Responsible, Reliable, Repeative)原則,具體含義如下:
Responsible: 誰(shuí)開(kāi)發(fā)誰(shuí)負(fù)責(zé)測(cè)試,在哪里開(kāi)發(fā)就在哪里測(cè)試。
Reliable: 測(cè)試case要可靠,并且是值得信賴(lài)的,對(duì)于底層的任何改動(dòng)都要能夠及時(shí)感知。
Repeative: 所有單元測(cè)試用例都要能夠重復(fù)運(yùn)行。能夠重復(fù)運(yùn)行就能夠進(jìn)行回歸測(cè)試、覆蓋率統(tǒng)計(jì)等等。
3.2 單元測(cè)試任務(wù)
一般來(lái)說(shuō),單元測(cè)試任務(wù)包括:
1、接口功能測(cè)試:用來(lái)保證接口功能的正確性。
2、局部數(shù)據(jù)結(jié)構(gòu)測(cè)試(不常用):用來(lái)保證接口中的數(shù)據(jù)結(jié)構(gòu)是正確的
(1)比如變量有無(wú)初始值
(2)變量是否溢出
3、邊界條件測(cè)試
(1)變量沒(méi)有賦值(即為NULL)
(2)變量是數(shù)值(或字符)
a.主要邊界:最小值,最大值,無(wú)窮大(對(duì)于DOUBLE等)
b.溢出邊界(期望異常或拒絕服務(wù)):最小值-1,最大值+1
c.臨近邊界:最小值+1,最大值-1
(3)變量是字符串
a.引用"字符變量"的邊界
b.空字符串
c.對(duì)字符串長(zhǎng)度應(yīng)用"數(shù)值變量"的邊界
(4)變量是集合
a.空集合
b.對(duì)集合的大小應(yīng)用"數(shù)值變量"的邊界
c.調(diào)整次序:升序、降序
(5)變量有規(guī)律
a.比如對(duì)于Math.sqrt,給出n^2-1,和n^2+1的邊界
4、所有獨(dú)立執(zhí)行通路測(cè)試:保證每一條代碼,每個(gè)分支都經(jīng)過(guò)測(cè)試
(1)代碼覆蓋率
a.語(yǔ)句覆蓋:保證每一個(gè)語(yǔ)句都執(zhí)行到了
b.判定覆蓋(分支覆蓋):保證每一個(gè)分支都執(zhí)行到
c.條件覆蓋:保證每一個(gè)條件都覆蓋到true和false(即if、while中的條件語(yǔ)句)
d.路徑覆蓋:保證每一個(gè)路徑都覆蓋到
(2)相關(guān)軟件
a.Cobertura:語(yǔ)句覆蓋
b.Emma: Eclipse插件Eclemma
5、各條錯(cuò)誤處理通路測(cè)試:保證每一個(gè)異常都經(jīng)過(guò)測(cè)試
?
4 注意事項(xiàng)
4.1獨(dú)立性
單元測(cè)試用例在設(shè)計(jì)和數(shù)據(jù)準(zhǔn)備的過(guò)程中,需要保持良好的獨(dú)立性,確保本測(cè)試的數(shù)據(jù)是不需要依賴(lài)其他輸出的,這樣減少相互影響。
4.2盡量脫離被測(cè)代碼的束縛
在測(cè)試用例設(shè)計(jì)的過(guò)程中,尤其是測(cè)試用例編寫(xiě)在代碼編寫(xiě)完成后進(jìn)行的,一定小心被代碼實(shí)現(xiàn)功能所影響,多考慮異常分支和異常數(shù)據(jù)。
4.3面向?qū)ο蟮恼Z(yǔ)言單元測(cè)試特點(diǎn)
面向?qū)ο蟮恼Z(yǔ)言進(jìn)行單元測(cè)試還有一定的特點(diǎn),對(duì)于每一個(gè)類(lèi),可能他出現(xiàn)在程序中的情況各不相同,在進(jìn)行測(cè)試的時(shí)候,可以結(jié)合上面介紹的方法,根據(jù)內(nèi)部方法相互調(diào)用邏輯,完成測(cè)試設(shè)計(jì)。
大體劃分兩個(gè)方向,一個(gè)是功能性的,就是類(lèi)似黑盒的方法,僅僅關(guān)注實(shí)現(xiàn)的功能點(diǎn)是否正確;另一個(gè)就是結(jié)構(gòu)性測(cè)試,需要分析類(lèi)中的方法相互實(shí)現(xiàn)邏輯,進(jìn)行類(lèi)似白盒測(cè)試,確保每個(gè)分支覆蓋。
?
5 單元測(cè)試用例編寫(xiě)技巧
5.1使用斷言
使用斷言而不是Print語(yǔ)句許多新手開(kāi)發(fā)人員習(xí)慣于在每行代碼之后編寫(xiě)System.out.println語(yǔ)句來(lái)驗(yàn)證代碼是否正確執(zhí)行。這種做法常常擴(kuò)展到單元測(cè)試,從而導(dǎo)致測(cè)試代碼變得雜亂。除了混亂,這需要開(kāi)發(fā)人員手動(dòng)干預(yù)去驗(yàn)證控制臺(tái)上打印的輸出,以檢查測(cè)試是否成功運(yùn)行。更好的方法是使用自動(dòng)指示測(cè)試結(jié)果的斷言。
5.2 考慮負(fù)面場(chǎng)景
除了正面情景,還要測(cè)試負(fù)面情景和邊緣情況通常,開(kāi)發(fā)人員會(huì)花費(fèi)大量的時(shí)間和精力編寫(xiě)測(cè)試用例,以確保應(yīng)用程序按預(yù)期工作。然而,測(cè)試負(fù)面測(cè)試用例也很重要。負(fù)面測(cè)試用例指的是測(cè)試系統(tǒng)是否可以處理無(wú)效數(shù)據(jù)的測(cè)試用例。
5.3 測(cè)試結(jié)果的預(yù)知性
構(gòu)建具有確定性結(jié)果的測(cè)試,一些方法不具有確定性結(jié)果,即該方法的輸出不是預(yù)先知道的,并且每一次都可以改變,為該方法編寫(xiě)測(cè)試用例不會(huì)有任何用處。
?
?
一、?單元測(cè)試的概念
單元通俗的說(shuō)就是指一個(gè)實(shí)現(xiàn)簡(jiǎn)單功能的函數(shù)。單元測(cè)試就是只用一組特定的輸入(測(cè)試用例)測(cè)試函數(shù)是否功能正常,并且返回了正確的輸出。
測(cè)試的覆蓋種類(lèi)
1.語(yǔ)句覆蓋:語(yǔ)句覆蓋就是設(shè)計(jì)若干個(gè)測(cè)試用例,運(yùn)行被測(cè)試程序,使得每一條可執(zhí)行語(yǔ)句至少執(zhí)行一次。
2.判定覆蓋(也叫分支覆蓋):設(shè)計(jì)若干個(gè)測(cè)試用例,運(yùn)行所測(cè)程序,使程序中每個(gè)判斷的取真分支和取假分支至少執(zhí)行一次。
3.條件覆蓋:設(shè)計(jì)足夠的測(cè)試用例,運(yùn)行所測(cè)程序,使程序中每個(gè)判斷的每個(gè)條件的每個(gè)可能取值至少執(zhí)行一次。
4.判定——條件覆蓋:設(shè)計(jì)足夠的測(cè)試用例,運(yùn)行所測(cè)程序,使程序中每個(gè)判斷的每個(gè)條件的每個(gè)可能取值至少執(zhí)行一次,并且每個(gè)可能的判斷結(jié)果也至少執(zhí)行一次。
5.條件組合測(cè)試:設(shè)計(jì)足夠的測(cè)試用例,運(yùn)行所測(cè)程序,使程序中每個(gè)判斷的所有條件取值組合至少執(zhí)行一次。
6.路徑測(cè)試:設(shè)計(jì)足夠的測(cè)試用例,運(yùn)行所測(cè)程序,要覆蓋程序中所有可能的路徑。
用例的設(shè)計(jì)方案主要的有下面幾種:條件測(cè)試,基本路徑測(cè)試,循環(huán)測(cè)試。通過(guò)上面的方法可以實(shí)現(xiàn)測(cè)試用例對(duì)程序的邏輯覆蓋,和路徑覆蓋。
二、開(kāi)始測(cè)試前的準(zhǔn)備
在開(kāi)始測(cè)試時(shí),要先聲明一下,無(wú)論你設(shè)計(jì)多少測(cè)試用例,無(wú)論你的測(cè)試方案多么完美,都不可能完全100%的發(fā)現(xiàn)所有BUG,我們所需要做的是用最少的資源,做最多測(cè)試檢查,尋找一個(gè)平衡點(diǎn)保證程序的正確性。窮舉測(cè)試是不可能的。?? 所以現(xiàn)在進(jìn)行單元測(cè)試我選用的是現(xiàn)在一般用的比較多的基本路徑測(cè)試法。
三、開(kāi)始測(cè)試
基本路徑測(cè)試法:設(shè)計(jì)出的測(cè)試用例要保證每一個(gè)基本獨(dú)立路徑至少要執(zhí)行一次。
??????? 函數(shù)說(shuō)明 :當(dāng)i_flag=0;返回???? i_count+100
??????????????????????????????? 當(dāng)i_flag=1;返回?? i_count? *10
??????????????????????????????? 否則? 返回?? i_count? *20
??????? 輸入?yún)?shù):int i_count ,?
??????????????????????????? int i_flag
??????? 輸出參數(shù): int? i_return;
???????
??????
??????? 代碼:
????????
?1? int Test(int i_count, int i_flag)
?2???????? {
?3???????????? int i_temp = 0;
?4???????????? while (i_count>0)
?5???????????? {
?6???????????????? if (0 == i_flag)
?7???????????????? {
?8???????????????????? i_temp = i_count + 100;
?9???????????????????? break;
10???????????????? }
11???????????????? else
12???????????????? {
13???????????????????? if (1 == i_flag)
14???????????????????? {
15???????????????????????? i_temp = i_temp + 10;
16???????????????????? }
17???????????????????? else
18???????????????????? {
19???????????????????????? i_temp = i_temp + 20;
20???????????????????? }
21???????????????? }
22???????????????? i_count--;
23???????????? }
24???????????? return i_temp;
25???????? }
?
?
引用:https://blog.csdn.net/moshenglv/article/details/79610986
總結(jié)
以上是生活随笔為你收集整理的单元测试用例编写总结 (白盒测试)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: OpenHarmony啃论文俱乐部玩法攻
- 下一篇: 【操作系统⑩】——进程死锁【银行家算法+