摘 要:測試用例的生成工作是指選定被測任務、分析輸入數據、確定其取值、并分析對應的輸出數據。軟件測試數據生成在軟件系統開發費用中占很大比重,如果該過程能自動實現,則會極大地減少軟件開發的周期和費用。介紹一種測試用例自動生成的鏈方法,這種測試技術,結合插裝技術及目標跟蹤方法,能有效生成測試用例,從而提高了測試效率。
關鍵詞:測試用例;鏈;目標搜索;測試數據
中圖分類號: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
測試用例的生成工作是指選定被測任務,分析輸入數據,確定其取值,并分析對應的輸出數據。這是決定測試是否成功的關鍵環節。目前最完善的工具也不能自動生成測試用例,而是采用人工選取的方法。測試用例選取的一個總的原則就是以盡可能少的測試用例發現盡可能多的錯誤。目前已有許多實用的技術幫助人們選擇測試用例,如邊值分析、等價類劃分、域測試等。
軟件測試數據生成在軟件系統開發費用中占很大比重。如果該過程能自動實現,則會極大地減少軟件開發的周期和費用。這里介紹一種鏈方法,它利用數據的相關性分析來指導測試數據的生成,因而能更有效地生成測試數據。
1 生成測試數據的方法
在初始化測試數據之后,程序員面臨的問題是找到額外的測試數據測定沒有被覆蓋的程序元素,如何找到合適的數據測試那些語句(還稱為節點)需要程序員有豐富的編程經驗,往往需要花費很多時間,從而增加了軟件開發的整體開銷。這是因為在軟件維護中,程序員并不總是處理自己編寫的代碼,經常需要修改其他人的程序,往往只能理解一部分,這給維護工作帶來一定的困難。而利用測試數據生成器能幫助程序員生成輸入數據來測定語句。它主要采用2種方法,即面向路徑和面向目標。
1.1 面向路徑
面向路徑指的是選擇程序路徑,然后生成該路徑的輸入數據。要測試的路徑可以自動生成,也可以由用戶提供。現有的面向路徑的測試數據生成器有一些不足之處,這些不足之處與選擇路徑的過程有關。不知道選定路徑是否可行,使得面向路徑的方法在使用上受到限制,也就是說常會選定一些不可執行的路徑,對這些路徑的分析計算成果往往都被浪費掉了。
1.2 面向目標
面向目標是指評定目標語句(或節點)的過程與所選取的路徑無關。它的一般方法是只考慮“必要”的分支(它影響目標節點的執行),忽略“不必要”的分支(它對目標節點的執行毫無影響)。該方法克服了面向路徑方法的局限性,完全基于程序的控制流圖。經實驗證明,該方法與以往的方法相比,能更有效地生成測試數據。
2 目標搜索的實現
本系統的研制就是基于程序的控制流圖,采用面向目標的方法,并利用動態調試工具,從而有效地生成測試數據。它的基本思想是在目標節點執行之前先執行一系列“必要”的節點。如果目標節點沒有執行,可以根據逆向推理進一步查找原因。這里定義一種探測器結構,以記錄程序的執行路線。此外,還定義了一種鏈式存儲結構——雙向鄰接表,它將傳統的鄰接表和逆鄰接表結合起來,在表結點和頭結點中分別加上指向前一條弧的指針,以及指向第一條指向該頂點的弧的指針,以便于逆向推理的實現。
2.1 探測器技術
探測器結構如下所示:
mov ax,linenum
mov bx,2
mul bx
lea di,msg
add di,ax
mov ah,31h
mov[di+1],ah
為記錄程序的執行路線,只要跟蹤跳轉語句的執行情況即可,因此,在每一個跳轉語句之后插入一個探測器,就可以很好地記錄程序的語句覆蓋情況。首先,建立一個記錄文件,初始文件中各位數據均為0,其中,相鄰的兩位分別代表跳轉語句的左右2個分支。執行插入探測器的程序之后,會將記錄文件中相應位上的0改寫為1。通過判斷文件中1的位置來確定對應的行號,并在源文件中相應的行上作出標記。在記錄文件中可出現4種組合情況:00,01,10,1l。在源程序中對應的行上分別標記為:none,left,right及double,分別表示沒有執行跳轉語句、執行了左分支、右分支以及雙向分支。
2.2 插裝技術
分支插裝技術記錄的是“遍歷”程序分支的情況。在8086/8088中的轉移指令分為條件轉移指令和非條件轉移指令(這里只考慮條件轉移指令)。以下面的源程序段中的jz labl指令為例說明分支覆蓋測試的實現。
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條分支的執行情況。本系統采用將條件轉移指令略加變換的方法來完成。變換的方法是生成2個臨時標號,如11與12,將jz labl轉化為如圖1所示的形式。
從功能上講,它與原來的程序是等價的。轉化后的程序中要想記錄jz labl產生分支的執行情況就很容易了。可在11與jmpl2之間插入一個探測器,在11與jmp labl之間放入另一個探測器,這樣就能正確記錄程序分支的執行情況。其中代表探測器。

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 目標搜索
輸入目標節點之后,即可根據記錄文件中的信息進行目標搜索,其過程如下:
(1) 建立雙向鄰接表(節點的adjvex域為行號);
(2) 輸入目標節點序號;
(3) 查找目標節點。程序執行之后,在記錄文件中將會記錄其執行路線。若從該文件中找到目標節點的記錄,說明該節點已被執行過,查找成功;若沒有找到,則沿其后向指針找到其父親節點,再查找父親節點的執行情況。若沒有執行過,則繼續查找,否則,說明目標節點的執行與此節點有關,可進一步判斷出該語句是一個跳轉語句。若改變該節點的執行條件,則一定會改變分支走向。
因此,通過更換一組測試用例的方法可以改變該點的執行流。如果無法找到合適的測試用例,可利用動態調試工具(TuboDebug)中的數據修改功能修改寄存器中的值,從而改變該點的執行流。改變后的程序執行后,在記錄文件中會生成新的執行記錄。根據新的記錄文件再次進行統計,并建立新的文件標記。重復上述操作,直到找到目標節點或其后向節點為空為止。若其后向節點為空,則說明此目標節點是不可達的。
4 結 語
基于程序的控制流圖,通過雙向鄰接表鏈式存儲結構的定義及實現,插裝技術的應用,以及目標跟蹤方法的采用,能有效地生成測試數據,從而進一步推進了軟件測試技術的自動實現。
參 考 文 獻
[1]鄭人杰.軟件測試技術\\.北京:清華大學出版社,1992.
[2]\\莫斯里.軟件測試自動化\\.鄧波,黃麗娟,曹青春,等譯.北京:機械工業出版社,2003.
[3]Doong R K,Frankl P G.The ASTOOT Approach to Testing Objectoriented Programs\\.ACM Transactionson Software Engineering and Methodology,1994,13(2):101130.
[4]夏輝,宋昕,王理.基于Z路徑覆蓋的測試用例自動生成技術研究\\.現代電子技術,2006,29(6):9294.
[5]胡濱.軟件自動測試工具的研究\\.現代電子技術,2007,30(18):9799.
作者簡介 肖 瑜 男,1964年出生,新疆伊犁人,教授。研究方向計算機仿真與模擬。