【C程序】
int GetMaxDay( int year, int month){
int maxday=0; //1
if( month>=1&&month<=12){ //2,3
if(month==2){ //4
if( year%4==0){ //5
if(year%100==0){ //6
if( year%400==0) //7
maxday= 29; //8
else //9
maxday= 28;
}
else //10
maxday= 29;
}
else
maxday = 28; //11
}
else{ //12
if (month=4||month=6||month=9||month=11) //13, 14,15,16
maxday = 30; //17
else //18
maxday = 31;
}
}
return maxday; //19
}
【問題1】(6分)
請針對上述C程序給出滿足100%DC(判定覆蓋)所需的邏輯條件。
【問題2】(9分)
請畫出上述程序的控制流圖,並計算其環路複雜度V(G)
【問題3】(5分)
請給出問題2中控制流圖的線性無關路徑。
【分析】
【問題1】
本問題考查白盒測試用例設計方法之判定覆蓋法。
判定覆蓋指設計足夠的測試用例,使得被測程序中每個判定表達式至少獲得一次“真”值和“假”值,從而使程序的每一個分支至少都通過一次。本題中程序有6個判定,所以滿足判定覆蓋一共需要12個邏輯條件。
編號 | 條件 |
1 | mouth>=1&&mouth<=12 |
2 | mouth<1||mouth>12 |
3 | mouth==2 |
4 | mouth!=2&&(mouth>=1&&mouth<=12) |
5 | year%4==0&&mouth==2 |
6 | year%4!=0&&mouth==2 |
7 | year%100==0&&mouth==2 |
8 | year%100!=0&&year%4==0&&mouth==2 |
9 | year%400==0&&mouth==2 |
10 | year%400!=0&&year%100==0&&mouth==2 |
11 | mouth==4||mouth==6||mouth==9||mouth==11 |
12 | (mouth!=4&&mouth!=6&&mouth!=9&&mouth!=11)&&(mouth>=1&&mouth<=12) |
【問題2】
本問題考查白盒測試用例設計方法之基本路徑法。
涉及的知識點包括根據代碼繪製控制流圖、計算環路複雜度。
控制流圖是描述程序控制流的一種圖示方式,它由節點和定向邊構成。控制流圖的節點代表一個基本塊,定向邊代表控制流的方向。其中要特別注意的是,如果判定中的條件表達式是複合條件,即條件表達式是由一個或多個邏輯運算符連接的邏輯表達式,則需要改變複合條件的判斷爲一系列之單個條件的嵌套判斷。本題程序中,if(mouth>=1&&mouth<=12)這條判斷語句中的判定由兩個條件組成,因此在畫控制流圖的時候需要拆開成兩條判斷語句。同理,if(mouth==4||moutj==6||mouth==9||mouth==11)這條判斷語句中的判定由4個條件組成。因此在畫控制流圖的時候需要拆開形成4條判斷語句。這裏需要注意的是,如果複合條件之間是“&&”的關係,則拆開後反映在流程在控制流圖上是沿左子樹往下,反之如果條件之間是“||”的關係,則拆開後反應在控制流圖上是沿右子樹往下。
程序的環路複雜度等於控制流圖中判定節點的個數加1,本題控制流圖中判定節點個數爲10,所以V(G)=11.
【問題3】
本問題考查白盒測試用例涉及方法中的基本路徑法。
涉及的知識點是根據控制流圖和環路複雜度給出線性無關路徑。
線性無關路徑是指包含一組以前沒有處理的語句或條件的路徑。從控制流圖上來看,一條線性無關路徑至少包含一條在其他線性無關路徑中從未有過的邊的路徑。程序的環路複雜度等於線性無關路徑的條數,所以本題中應該有11條線性無關路徑。
1 | 1-2-19 |
2 | 1-2-3-19 |
3 | 1-2-3-4-12-13-14-15-16-18-19 |
4 | 1-2-3-4-12-13-14-1-16-17-19 |
5 | 1-2-3-4-12-13-14-15-17-19 |
6 | 1-2-3-4-12-13-14-17-19 |
7 | 1-2-3-4-12-13-17-19 |
8 | 1-2-3-4-5-11-19 |
9 | 1-2-3-4-5-6-10-19 |
10 | 1-2-3-4-5-6-7-9-19 |
11 | 1-2-3-4-5-6-7-8-19 |