摘 要:測試用例的生成工作是指選定被測任務、分析輸入數(shù)據(jù)、確定其取值、并分析對應的輸出數(shù)據(jù)。軟件測試數(shù)據(jù)生成在軟件系統(tǒng)開發(fā)費用中占很大比重,如果該過程能自動實現(xiàn),則會極大地減少軟件開發(fā)的周期和費用。介紹一種測試用例自動生成的鏈方法,這種測試技術,結合插裝技術及目標跟蹤方法,能有效生成測試用例,從而提高了測試效率。
關鍵詞:測試用例;鏈;目標搜索;測試數(shù)據(jù)
中圖分類號:TP311 文獻標識碼:B 文章編號:1004373X(2008)1610003
Research and Realization of the Method for Testing Examples Automatic Building
XIAO Yu
(Xi′an Military Academy,Xi′an,710108,China)
Abstract:The task,making of testing examples,is a process that choosing task,analysing input date,making sure numerical value rang and analysing output date.Software testing occupied a good many expenses in exploitation of software system.If the process can be realized automatically,the expenses will be decreased and the periods will be shortened.This paper introduces a chain method of testing examples automatic building.The test technique,which combines the inserting technique and the object tracking method,may effectually create testing examples effectively and thus improve testing efficiency.
Keywords:testing examples;chain;object searching;test data
測試用例的生成工作是指選定被測任務,分析輸入數(shù)據(jù),確定其取值,并分析對應的輸出數(shù)據(jù)。這是決定測試是否成功的關鍵環(huán)節(jié)。目前最完善的工具也不能自動生成測試用例,而是采用人工選取的方法。測試用例選取的一個總的原則就是以盡可能少的測試用例發(fā)現(xiàn)盡可能多的錯誤。目前已有許多實用的技術幫助人們選擇測試用例,如邊值分析、等價類劃分、域測試等。
軟件測試數(shù)據(jù)生成在軟件系統(tǒng)開發(fā)費用中占很大比重。如果該過程能自動實現(xiàn),則會極大地減少軟件開發(fā)的周期和費用。這里介紹一種鏈方法,它利用數(shù)據(jù)的相關性分析來指導測試數(shù)據(jù)的生成,因而能更有效地生成測試數(shù)據(jù)。
1 生成測試數(shù)據(jù)的方法
在初始化測試數(shù)據(jù)之后,程序員面臨的問題是找到額外的測試數(shù)據(jù)測定沒有被覆蓋的程序元素,如何找到合適的數(shù)據(jù)測試那些語句(還稱為節(jié)點)需要程序員有豐富的編程經(jīng)驗,往往需要花費很多時間,從而增加了軟件開發(fā)的整體開銷。這是因為在軟件維護中,程序員并不總是處理自己編寫的代碼,經(jīng)常需要修改其他人的程序,往往只能理解一部分,這給維護工作帶來一定的困難。而利用測試數(shù)據(jù)生成器能幫助程序員生成輸入數(shù)據(jù)來測定語句。它主要采用2種方法,即面向路徑和面向目標。
1.1 面向路徑
面向路徑指的是選擇程序路徑,然后生成該路徑的輸入數(shù)據(jù)。要測試的路徑可以自動生成,也可以由用戶提供?,F(xiàn)有的面向路徑的測試數(shù)據(jù)生成器有一些不足之處,這些不足之處與選擇路徑的過程有關。不知道選定路徑是否可行,使得面向路徑的方法在使用上受到限制,也就是說常會選定一些不可執(zhí)行的路徑,對這些路徑的分析計算成果往往都被浪費掉了。
1.2 面向目標
面向目標是指評定目標語句(或節(jié)點)的過程與所選取的路徑無關。它的一般方法是只考慮“必要”的分支(它影響目標節(jié)點的執(zhí)行),忽略“不必要”的分支(它對目標節(jié)點的執(zhí)行毫無影響)。該方法克服了面向路徑方法的局限性,完全基于程序的控制流圖。經(jīng)實驗證明,該方法與以往的方法相比,能更有效地生成測試數(shù)據(jù)。
2 目標搜索的實現(xiàn)
本系統(tǒng)的研制就是基于程序的控制流圖,采用面向目標的方法,并利用動態(tài)調試工具,從而有效地生成測試數(shù)據(jù)。它的基本思想是在目標節(jié)點執(zhí)行之前先執(zhí)行一系列“必要”的節(jié)點。如果目標節(jié)點沒有執(zhí)行,可以根據(jù)逆向推理進一步查找原因。這里定義一種探測器結構,以記錄程序的執(zhí)行路線。此外,還定義了一種鏈式存儲結構——雙向鄰接表,它將傳統(tǒng)的鄰接表和逆鄰接表結合起來,在表結點和頭結點中分別加上指向前一條弧的指針,以及指向第一條指向該頂點的弧的指針,以便于逆向推理的實現(xiàn)。
2.1 探測器技術
探測器結構如下所示:
mov ax,linenum
mov bx,2
mul bx
lea di,msg
add di,ax
mov ah,31h
mov[di+1],ah
為記錄程序的執(zhí)行路線,只要跟蹤跳轉語句的執(zhí)行情況即可,因此,在每一個跳轉語句之后插入一個探測器,就可以很好地記錄程序的語句覆蓋情況。首先,建立一個記錄文件,初始文件中各位數(shù)據(jù)均為0,其中,相鄰的兩位分別代表跳轉語句的左右2個分支。執(zhí)行插入探測器的程序之后,會將記錄文件中相應位上的0改寫為1。通過判斷文件中1的位置來確定對應的行號,并在源文件中相應的行上作出標記。在記錄文件中可出現(xiàn)4種組合情況:00,01,10,1l。在源程序中對應的行上分別標記為:none,left,right及double,分別表示沒有執(zhí)行跳轉語句、執(zhí)行了左分支、右分支以及雙向分支。
2.2 插裝技術
分支插裝技術記錄的是“遍歷”程序分支的情況。在8086/8088中的轉移指令分為條件轉移指令和非條件轉移指令(這里只考慮條件轉移指令)。以下面的源程序段中的jz labl指令為例說明分支覆蓋測試的實現(xiàn)。
Sub:…
jc lab1
lab: mov al,01
jz lab1
add bx,ax
lab1: add bx,ax
test al,03
如果在jz labl與add bx,ax之間插入探測器,在labl標號與add dx,ax之間插入另一個探測器,并不能準確記錄jz lab1這條轉移指令產生的2條分支的執(zhí)行情況。本系統(tǒng)采用將條件轉移指令略加變換的方法來完成。變換的方法是生成2個臨時標號,如11與12,將jz labl轉化為如圖1所示的形式。
從功能上講,它與原來的程序是等價的。轉化后的程序中要想記錄jz labl產生分支的執(zhí)行情況就很容易了。可在11與jmpl2之間插入一個探測器,在11與jmp labl之間放入另一個探測器,這樣就能正確記錄程序分支的執(zhí)行情況。其中代表探測器。
2.3 雙向鄰接表
表結點和頭結點結構如下所示:
程序流圖的雙向鄰接表存儲結構說明如下:
#define MAX_VERTEX_NUM 20
Typedef struct ArcNode
{
int arjvex;//該弧所指向的頂點的位置
struct ArcNode *nextarc; //指向下一條弧的指針
struct ArcNode *priarc; //指向前一條弧的指針
InfoType *info;//與該弧相關的信息
}Arcnode;
Typedef struct Vnode
{
VertexType data; //頂點信息
ArcNode *firstoutarc; //指向第一條依附該頂點的弧的指針
ArcNode *firstinarc; //指向第一條指向該頂點的弧的指針
}Vnode,AdjList[MAX_VERTEX_NUM];
以下面程序段為例進行說明。該程序段的流程圖如圖2所示。其雙向鄰接表如圖3所示。
…
cmp ax,[si+4];25
jnc fmax2;26
mov ax,[si+4];27
fmax2:movflag,2;28
movmax,ax;29
3 目標搜索
輸入目標節(jié)點之后,即可根據(jù)記錄文件中的信息進行目標搜索,其過程如下:
(1) 建立雙向鄰接表(節(jié)點的adjvex域為行號);
(2) 輸入目標節(jié)點序號;
(3) 查找目標節(jié)點。程序執(zhí)行之后,在記錄文件中將會記錄其執(zhí)行路線。若從該文件中找到目標節(jié)點的記錄,說明該節(jié)點已被執(zhí)行過,查找成功;若沒有找到,則沿其后向指針找到其父親節(jié)點,再查找父親節(jié)點的執(zhí)行情況。若沒有執(zhí)行過,則繼續(xù)查找,否則,說明目標節(jié)點的執(zhí)行與此節(jié)點有關,可進一步判斷出該語句是一個跳轉語句。若改變該節(jié)點的執(zhí)行條件,則一定會改變分支走向。
因此,通過更換一組測試用例的方法可以改變該點的執(zhí)行流。如果無法找到合適的測試用例,可利用動態(tài)調試工具(TuboDebug)中的數(shù)據(jù)修改功能修改寄存器中的值,從而改變該點的執(zhí)行流。改變后的程序執(zhí)行后,在記錄文件中會生成新的執(zhí)行記錄。根據(jù)新的記錄文件再次進行統(tǒng)計,并建立新的文件標記。重復上述操作,直到找到目標節(jié)點或其后向節(jié)點為空為止。若其后向節(jié)點為空,則說明此目標節(jié)點是不可達的。
4 結 語
基于程序的控制流圖,通過雙向鄰接表鏈式存儲結構的定義及實現(xiàn),插裝技術的應用,以及目標跟蹤方法的采用,能有效地生成測試數(shù)據(jù),從而進一步推進了軟件測試技術的自動實現(xiàn)。
參 考 文 獻
[1]鄭人杰.軟件測試技術\\.北京:清華大學出版社,1992.
[2]\\莫斯里.軟件測試自動化\\.鄧波,黃麗娟,曹青春,等譯.北京:機械工業(yè)出版社,2003.
[3]Doong R K,F(xiàn)rankl P G.The ASTOOT Approach to Testing Objectoriented Programs\\.ACM Transactionson Software Engineering and Methodology,1994,13(2):101130.
[4]夏輝,宋昕,王理.基于Z路徑覆蓋的測試用例自動生成技術研究\\.現(xiàn)代電子技術,2006,29(6):9294.
[5]胡濱.軟件自動測試工具的研究\\.現(xiàn)代電子技術,2007,30(18):9799.
作者簡介 肖 瑜 男,1964年出生,新疆伊犁人,教授。研究方向計算機仿真與模擬。