單元測試又稱模塊測試,是對軟件設(shè)計(jì)的最小單元的功能、性能、接口和設(shè)計(jì)約束等的正確性進(jìn)行檢驗(yàn),檢查程序在語法、格式和邏輯上的錯(cuò)誤,并驗(yàn)證程序是否符合規(guī)范,以發(fā)現(xiàn)單元內(nèi)部可能存在的各種缺陷。
單元測試的對象是軟件設(shè)計(jì)的最小單位——模塊、函數(shù)或者類。在傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)語言(如C語言)中,單元測試的對象一般是函數(shù)或者過程。在面向?qū)ο笤O(shè)計(jì)語言(如Java、C#)中,單元測試的對象可以是類,也可以是類的成員函數(shù)/方法。由此可見,單元測試與程序設(shè)計(jì)和編碼密切關(guān)聯(lián),測試者需要根據(jù)詳細(xì)設(shè)計(jì)說明書和源程序清單來了解模塊的I/O條件和邏輯結(jié)構(gòu)。
本節(jié)利用風(fēng)靡全球的“俄羅斯方塊游戲排行榜”的程序作為案例來串講單元測試的內(nèi)容。
01、測試策劃
1. 目的
俄羅斯方塊游戲(Tetris)的排行榜功能經(jīng)過編碼后,在與其他模塊進(jìn)行集成之前,需要經(jīng)過單元測試,測試其功能點(diǎn)的正確性和有效性。以便在后續(xù)的集成工作中不會引入更多的問題。
2. 背景
俄羅斯方塊是一款風(fēng)靡全球的電視游戲機(jī)和掌上游戲機(jī)游戲,它由俄羅斯人阿列克謝·帕基特諾夫發(fā)明,故得此名。俄羅斯方塊的基本規(guī)則是移動(dòng)、旋轉(zhuǎn)和擺放游戲自動(dòng)輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。
排行榜功能是俄羅斯方塊游戲中不可或缺的一部分,其用于將當(dāng)前用戶的得分與歷史得分記錄進(jìn)行比較并重新排序。
該程序主要涉及的功能點(diǎn)有歷史記錄文件的讀取、分?jǐn)?shù)排名的計(jì)算與排序、新記錄文件的保存、新記錄的顯示等。這些功能將在一局游戲結(jié)束,并獲取到該局游戲的得分后啟動(dòng)。
3. 待測源代碼
private void gameOver (int score)//游戲結(jié)束
{//Display game over
string s="您的得分為:";
string al =".
char[]A={};
int i=1;
_blockSurface.FontStyle= new Font(FontFace,BigFont);//設(shè)置基本格式_blockSurface.FontFormat.Alignment = StringAlignment.Near;
_blockSurface.DisplavText ="GAME OVER!!
string sc = Convert.ToString( score);//得到當(dāng)前玩家的分?jǐn)?shù)//write into file;
string path="D: test2.txt";//文件路徑
try{
FileStream fs = newFileStream
(path,FileMode.OpenOrCreate,FileAccess.ReadWrite);
StreamReader strmreader = new StreamReader(fs);//建立讀文件流
String[] str = new String[5];
String[] split = new String[5];
while(strmreader.Peek()!= -1)
for(i=0;i<5;i++)
strli] = strmreader.ReadLine();//以行為單位進(jìn)行讀取,賦予數(shù)組
//str[i]
split [i]split[i]= str[i].split(':')[1];//按照":"將文字分開,賦予數(shù)組
person1 = Convert.ToInt32(split[0]); //splt[0]的值賦予第一名
person2 = Convert.ToInt32(split[1]); //splt[1]的值賦予第一名
person3 = Convert.ToInt32(split[2]); //splt[2]的值賦予第一名
person4 = Convert.ToInt32(split[3]); //splt[3]的值賦予第一名
person5 = Convert.ToInt32(split[4]); //splt[4]的值賦予第一名
strmreader.Close(); //關(guān)閉流
fs.Close();
FileStream ffs = new
FileStream(path, FileMode.OpenOrCreate,
FileAccess.ReadWrite));
StreamWriter sw = new StreamWriter(ffs)//建立寫文件流
if(_score > person1)//如果當(dāng)前分?jǐn)?shù)大于第一名,排序
{
person5=person4; person4 = person3; person3 = person2; person2 = person1;
person1=score;
}
else if(_score> person2)//如果當(dāng)前分?jǐn)?shù)大于第二名,排序
{
person5 = person4; person4 = person3; person3 = person2; person2=
_score;
}
else if(_score> person3)//如果當(dāng)前分?jǐn)?shù)大于第三名,排序
{
person5 = person4; person4 = person3; person3 =_score;
else if(_score> person4)//如果當(dāng)前分?jǐn)?shù)大于第四名,排序
{
person5 = person4; person4 =_score;
}
else if(_score > person5)//如果當(dāng)前分?jǐn)?shù)大于第五名,排序
{
person5 = _score;
//在文件中的文件內(nèi)容
string ppl ="第一名:“+ Convert.ToString(person1);
string pp2 ="第二名:"+ Convert.ToString(person2);
string pp3 ="第三名:”+ Convert.ToString(person3);
string pp4 ="第四名:"+ Convert.ToString(person4);
string pp5 ="第五名"+ Convert.ToString(person5);
string
ppR= pp1+"r\n"+ pp2 +"r\n" + pp3 +"r\n"+ pp4+"r\n"+ pp5 +"r\n";
byte[] info = new UTF8Encoding(true).GetBytes(ppR);
sw.Write(ppR); //將內(nèi)容寫入文件
sw.Close();
ffs.Close();
}
Catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
S=s+""+ sC;
//Draw surface to display text;
MessageBox.Show(s); //在界面中顯示排行榜內(nèi)容
}
02、測試設(shè)計(jì)
下面將利用相關(guān)靜態(tài)和動(dòng)態(tài)(白盒測試、黑盒測試)方法對案例進(jìn)行相應(yīng)的測試,得到測試報(bào)告與錯(cuò)誤列表,在實(shí)際項(xiàng)目中可進(jìn)一步反饋給開發(fā)方進(jìn)行Bug的確認(rèn)與修復(fù)。
1. 代碼走查
利用代碼走查的方法檢查該模塊的代碼,對代碼質(zhì)量進(jìn)行初步評估。具體實(shí)現(xiàn)如表1所示。
????????■?表1 代碼走查情況記錄
從表1的分析中可以看出,本模塊的代碼基本情況如下。
(1) 代碼直觀。
(2) 代碼和設(shè)計(jì)文檔對應(yīng)。
(3) 無用的代碼已經(jīng)被刪除。
(4) 注釋過于簡單。
2. 基本路徑測試法
基本路徑測試法是在程序控制流圖的基礎(chǔ)上,通過分析控制構(gòu)造的環(huán)路復(fù)雜性,導(dǎo)出可執(zhí)行的路徑集合,從而設(shè)計(jì)測試用例的方法。首先需要簡化程序模塊,繪制程序模塊如圖2所示。接著按照模塊圖的設(shè)計(jì)路徑來覆蓋策略。主要可分為以下4步執(zhí)行。
■?圖2 程序模塊圖
1) 繪制程序的控制流圖
基本路徑測試法的第一步是繪制控制流圖,根據(jù)程序模塊圖的邏輯關(guān)系,獲得該程序塊的控制流圖,如圖3所示。
■?圖3 程序模塊的控制流圖
2) 計(jì)算環(huán)路復(fù)雜度
其次是根據(jù)控制流圖計(jì)算環(huán)路復(fù)雜度,環(huán)路復(fù)雜度是一種為程序邏輯復(fù)雜性提供定量測度的軟件度量,該度量將用于計(jì)算程序基本的獨(dú)立路徑數(shù)目,為確保所有語句至少執(zhí)行一次的測試數(shù)量的上界。
V(G)=P+1=5+1=6
根據(jù)以上公式確定至少要覆蓋6條路徑。
3) 導(dǎo)出獨(dú)立路徑
根據(jù)控制流圖可以方便地得到以下6條路徑。
path1:1—2—11。
path2:1—3—4—11。
path3:1—3—5—6—11。
path4:1—3—5—7—8—11。
path5:1—3—5—7—9—10—11。
path6:1—3—5—7—9—11。
4) 設(shè)計(jì)測試用例
最后設(shè)定一組初始參數(shù),以此來設(shè)計(jì)測試用例。令:
person1=23
person2=20
person3=10
person4=6
person5=4
作為測試輸入,可設(shè)計(jì)測試用例如表2所示。
■?表2 基本路徑法測試用例
3. 邊界值分析
邊界值分析法利用輸入變量的最小值、略大于最小值、輸入范圍內(nèi)任意值、略小于最大值、最大值等來設(shè)計(jì)測試用例。
由于輸入的只會是數(shù)據(jù),且數(shù)據(jù)均大于0,因此可令:
person1 = 23
person2 = 20
person3 = 10
person4 = 6
person5 = 4
采用邊界值法設(shè)計(jì)測試用例如表3所示。
■?表3 邊界值法測試用例
03、測試執(zhí)行
將設(shè)計(jì)的測試用例整理合并為測試用例集合,必要時(shí)需要開發(fā)相應(yīng)的驅(qū)動(dòng)模塊和樁模塊。本次測試需要開發(fā)一個(gè)驅(qū)動(dòng)模塊,用于初始化相應(yīng)的參數(shù),并調(diào)用待測模塊以達(dá)到測試效果。驅(qū)動(dòng)模塊代碼如下。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main(){
public static void main(String[]args)
throws IOException{
int person1 = 23,person2 = 20, person3 = 10,person4 = 6,person5 = 4;
int score;
String s;
BufferedReader bf = new BufferedReader(newInputStreamReader(System.in));
s = bf.readLine():
score = Integer.valueOf(s);
_gameOver(score);
}
}
04、測試總結(jié)
測試結(jié)果可利用Bug記錄平臺進(jìn)行記錄,在實(shí)際項(xiàng)目中則可反饋給開發(fā)人員,由開發(fā)人員確認(rèn)并修復(fù)。
測試結(jié)束后,形成測試報(bào)告。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-687796.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-687796.html
?
?
?
?
?
?
到了這里,關(guān)于軟件測試用例經(jīng)典方法 | 單元測試法案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!