else{
messagelist [i+k+1]是messagelist [i]的直接后繼;
條件為messagelist [i+1]的條件取假; k:=k+1;//不發送
}endif
}enddo
}endif
i:=i+1;
}endif
}endfor;
}endfindsuccessor;
spathgenerator()通過訪問消息后繼表中消息及其直接后繼生成場景路徑,在遍歷場景路徑時同時記錄路徑上相應的控制流和數據流信息,執行完畢得到一個場景路徑集spath相應的控制流數據流測試規約。其算法描述如下:
s-pathgenerator(m:msuccessorlist){
//輸入:messagelist; (消息后繼表)
//輸出:spath;(場景路徑集)
spath{
sid:integer;//場景路徑順序號
pathcondition: list of gardcondition; //場景路徑的實現條件
mlist:list of message;//場景路徑上的消息流列表
parameters:list of variable;//場景路徑上定義和使用的變量列表
userinputparameters: list of variable; //場景路徑上外界輸入參數列表
methodsequence:{objectname,methodname,next};場景路徑上由消息激活的方法序列
}[n];
i,j:integer;
i:=1; j:=1;
Sid:=j;//場景路徑序號
//遞歸訪問消息及其直接后繼
訪問消息m,在消息標簽中取出并記錄返回值、參數、調用的對象方法;
記錄消息條件到路徑條件中;
if m的后繼消息為空
{ 一條場景路徑結束;j:=j+1;return;}//回溯到m[i]的直接前驅繼續
else{
k:=1;
while m.link<>nil do { //m的后繼消息列表不空
successor:=m.link;
spathgenerator(successor) //深度優先遍歷該消息及其后繼消息
m.link:=successor->next;//下一后繼消息;
}endwhile
}endif;
}endfind;
testcasegenerator()選定遍歷一個場景路徑過程中生成的控制流和數據流,定義相關范疇,生成測試用例的規約。消息激活的方法序列正是我們要測試的對象間的交互,是軟件執行時表現出來的對象之間的控制流傳遞行為,是對象之間通過消息交互的結果,定義為交互范疇Interaction Category;輸入參數列表為測試該場景時外界的輸入,定義為輸入參數范疇input parameter Category;我們通過對參與協作對象的類圖的分析,以及用例描述,可以獲取我們所研究的交互行為定義、輸入參數的定義、其他影響消息執行的變量的定義、系統環境條件的定義等,從而可以獲取這些系統環境條件、輸入參數、方法行為的可能選擇,然后結合。
利用范疇-劃分思想,用相應場景路徑的路徑條件和加在消息上的約束、以及系統本身的屬性約束來限定這些選擇,排除無意義和有沖突的值,然后通過這些不同的范疇的不同選擇的可能組合作為一個場景路徑的測試用例,這樣每個場景路徑生成一個集成測試用例。具體算法描述如下:
Testcasegenerator(){
//輸入:spath[n]
//輸出:tcsuite[n]{ envirnmentpara,input(inputpara,paravaliue),expectoutput,postcondition}
i:integer;
for i:=1 to n do {
tcsuite[i].postcondition:=spath[i].pathcondition;
tcsuite[i].environmentpara:={滿足路徑條件的環境條件}
tcsuite[i].input.inputpara=spath[i].userinputsparamenters;
選擇對本場景路徑條件有影響的參數確定其可能的取值;
tcsuite[i].input.paravalue={符合路徑條件的輸入參數可能的取值};
取出spath[i]的方法激活序列,分析每一個方法的定義,確定其可能的行為,選擇符合場景路徑條件的行為,并將方法序列的執行過程的輸出序列存到tcsuite[i].expectoutput中;
i:=i+1;
}endfor;
}endtestcasegenerator;
為說明問題,我們選一條最長路徑spath[5](消息序列為:1.1,1.2,2.1,2.2,2.3,4.1,4.2,4.3,5)來演示使用上述方法生成覆蓋該路徑的測試用例的過程。,從該路徑獲取相關范疇如下:
Tcsuite[5]
Pathcongdition:!notATMCard, !isStolen, !accountClosed, validPIN&&n=1,!declineFee
Environmentcondition:
ATM卡,非成員卡,卡沒有被盜,帳戶沒有關閉
parameter category:
inputPIN //影響validPIN
123456 [property validPIN][if !notAtmCard]
564821
123258
……..
deClineFee //影響deClineFee
T [property declineFee][if !isMemberCard]]
F
interaction behavior category:
session.beginSession(),
插卡事件創建session對象
cardSlot.isATMCard(),
判斷是ATM卡,讀取卡號,定義cardNum,notATMCard=F[if !notATMCard]
判斷不是ATM卡,notATMCard=T
screen.prompt(),
屏幕提示“please input PIN”,n=1[if !notATMCard][property n]
屏幕提示“please input PIN”,n=2[if !notATMCard] [property n]
屏幕提示“please input PIN”,n=3[if !notATMCard] [property n]
numkeyPad.getEntry(),
輸入正確的PIN inputPIN=’123456’[if n=1]
輸入錯誤的PIN inputPIN<>’123456’[if n=1]
輸入正確的PIN inputPIN=’123456’[if n=2] and [if !validPIN&&n=1]
原文轉自:http://www.anti-gravitydesign.com