閱讀下列說明,回答問題1至問題3,將解答填入答題紙的對應欄內。
【說明】
邏輯覆蓋法是設計白盒測試用例的主要方法之一,它是通過對程序邏輯結構的遍歷實現程序的覆蓋。針對以下由C語言編寫的程序,按要求回答問題。
Struct _ProtobufCIntRange{
Int start_value;
Unsigned orig_index;
};
typedef struct_ProtobufCIntRange ProtobufCIntRange;
int int_range_lookup(unsigned n_ranges,const ProtobufCIntRange*ranges,int value){
unsigned start,n; //1
start=0;
n=n_ranges;
while (n>l) { //2
unsigned mid=start+n/2;
if(value<ranges[mid].start_value { //3
n=mid-start; //4
}
else if (value>=ranges[mid].start_value+
(int)(ranges[mid+1].orig_index-ranges[mid].orig_index)){ //5
unsigned new_start=mid+1; //6
n=start+n-new_start;
start=new_start;
}
else //7
return(value-ranges[mid].start_value)+ranges[mid].orig_index;
}
if(n>0){ //8
unsigned start_orig_index=ranges[start].orig_index;
unsigned range_size=ranges[start+1].orig_index-start_orig_index;
if (ranges[start].start_value<=value
&&value<(int)(ranges[start].start_value+range_size)) //9,10
Return(value-ranges[start].start_value)+start_orig_index; //11
}
Return -1; //12
} //13
【問題1】(5分)
請給出滿足100%DC(判定覆蓋)所需的邏輯條件。
【問題2】(7分)
請畫出上述程序的控制流圖,並計算其控制流圖的環路複雜度V(G)。
【問題3】(3分)
請給出【問題2】中控制流圖的線性無關路徑。
分析
本題考查白盒測試技術,屬於比較傳統的題目,考查點也與往年類似。
【問題1】
本題考查白盒測試方法中的判定覆蓋法。
判定覆蓋法指設計足夠的測試用例,使得被測程序中每個判定表達式至少獲得一次“真”值和“假”值,從而使程序的每一個分支至少都通過一次。
本題中程序一共5個判定,所以滿足判定覆蓋一共就需要10個邏輯條件。具體如下:
編號 |
條件 |
---|---|
1 |
n>1 |
2 | n<=1 |
3 | value<ranges[mid].start_value |
4 | value>=ranges[mid].start_value |
5 |
(value>=ranges[mid].start_value)&& (value>=ranges[mid].start_value+ (int)(ranges[mid+1].orig_index-ranges[mid].orig_index)) |
6 |
(value>=ranges[mid].start_value)&& (value<ranges[mid].start_value+ (int)(ranges[mid+1].orig_index-ranges[mid].orig_index)) |
7 | n>0 |
8 | n<=0 |
9 |
ranges[start].start_value<=value &&value<(int)(ranges[start].start_value+range_size) |
10 |
ranges[start].start_value>value || value>=(int)(ranges[start].start_value+range_size) |
【問題2】
本題考查白盒測試方法中的基本路徑法。涉及的知識點包括:根據代碼繪製控制流圖、計算環路複雜度。
控制流圖是描述程序控制的一種圖示方法。其基本符號有圓圈和箭線:圓圈爲控制流圖中的一個結點,表示一個或多個無分支的語句;帶箭頭的線段稱爲邊或連接,表示控制流。基本結構如下所示:
根據題中程序繪製的控制流圖如下所示。其中要特別注意的是,如果判斷中的表達式是複合條件,即條件表達式是由一個或多個邏輯運算符連接的邏輯表達式,則需要改變複合條件的判斷爲一系列之單個條件的嵌套的判斷。本題程序中,if(ranges[start].start_value<=value &&value<(int)(ranges[start].start_value+range_size))這條判斷語句中的判定由兩個條件組成,因此在畫控制流圖的時候需要拆開成兩條判斷語句。
環路複雜度用來衡量一個程序模塊所包含的判定結構的複雜程度,數量上表現爲獨立路徑的條數,即合理地預防錯誤所需測試的最少路徑條數。環路複雜度等於圖中判定節點的個數加1,圖中判定節點個數爲6,所以V(G)=7。
【問題3】
本題考查白盒測試方法中的基本路徑法。涉及的知識點包括根據控制流圖和環路複雜度確定線性無關路徑。
線性無關路徑是指包括一組以前沒有處理的語句或條件的一條路徑,從控制流圖來看,一條線性無關路徑是至少包含有一條在其他線性無關路徑中從未有過的邊的路徑。
對問題2中的控制流圖,其線性無關路徑的集合爲:
1 |
1-2-3-4-2... |
2 | 1-2-3-5-6-2... |
3 | 1-2-3-5-7-13 |
4 | 1-2-8-9-10-11-13 |
5 | 1-2-8-9-10-12-13 |
6 | 1-2-8-9-12-13 |
7 | 1-2-8-12-13 |
這7條路徑組成問題2中控制流圖的一個基本路徑集。只要設計出的測試用例能確保這些基本路徑的執行,就可以使程序中的每個可執行語句至少執行一次,每個條件的取真和取假分支也能得到測試。需要注意的是,基本路徑集不是唯一的,對於給定的控制流圖,可以得到不同的基本路徑集。