【軟體測試】功能性測試方法(黑盒測試)
題目
對電話賬單來說,春季和秋季的標準時間與夏時制時間的轉換會帶來有意思的問題。春 季,這種轉換髮生在(3 月末,4 月初的)星期日凌晨 2:00 時,這時時鐘要設定為凌晨 3: 00 時。對稱的轉換通常發生在 10 月最後一個星期日,時鐘要從 2:59:59 調回到 2:00: 00。 請為採用以下費率計算使用者的每月通話費: (1)通話時間<=20 分鐘時,每分鐘收費 0.05 美元,通話時間不到 1 分鐘時按 1 分鐘 計算。 (2)通話時間>20 分鐘時,收費 1.00 美元,外加每分鐘 0.10 美元,超過 20 分鐘的部 分,不到 1 分鐘時按 1 分鐘計算。
假設: (1)通話計費時間從被叫方應答開始計算,到呼叫方掛機時結束。 (2)通話時間的秒數四捨五入到分鐘。 (3)沒有超過 20 個小時的通話。一 測試結果
等價類劃分:T1={通話時長不到1分鐘};T2={1分鐘 ≤ 通話時長 ≤ 20分鐘};T3={通話時長大於20分鐘};S1={無時制轉換};S2={春時制與夏時制轉換};S3={夏時制與秋時制轉換};
用例ID | 輸入資料 | 預期輸出 | 實際輸出 | 是否通過 | 備註 |
1 | 2018 03 20 12 12:15:26 20 12 12:15:56 | 0.05 | 話費為0.05美元 | 是 | 對應等價類T1,S1 |
2 | 2018 03 26 01 01:59:30 26 03 03:00:15 | 0.05 | 話費為0.05美元 | 是 | 對應等價類T1,S2 |
3 | 2018 10 29 02 02:59:50 29 02 02:00:15 | 0.05 | 話費為0.05美元 | 是 | 對應等價類T1,S3 |
4 | 2018 07 15 02 02:05:30 15 02 02:15:20 | 0.5 | 話費為0.5美元 | 是 | 對應等價類T2,S1 |
5 | 2018 03 26 01 01:50:20 26 03 03:05:10 | 0.75 | 話費為0.75美元 | 是 | 對應等價類T2,S2 |
6 | 2018 10 29 02 02:50:50 29 02 02:05:30 | 0.75 | 話費為0.75美元 | 是 | 對應等價類T2,S3 |
7 | 2018 08 05 06 06:30:45 05 08 08:29:50 | 11 | 話費為11.0美元 | 是 | 對應等價類T3,S1 |
8 | 2018 03 26 01 01:30:25 26 03 03:50:25 | 7 | 話費為7.0美元 | 是 | 對應等價類T3,S2 |
9 | 2018 10 28 23 23:50:25 29 03 03:50:25 | 29 | 話費為29.0美元 | 是 | 對應等價類T3,S3 |
邊界值測試
邊界值分析:
通話時長:{59s,1min,1min1s,19min,19min59s,20min,20min1s,21min}
通話日期:{無時制轉換時間,三月末四月初的一個星期日(春時制與夏時制轉換),十月的最後一個星期日(夏時制與秋時制轉換)}
用例ID | 輸入資料 | 預期輸出 | 實際輸出 | 是否通過 | 備註 |
1 | 2017 10 05 05 05:20:10 05 05 05:21:09 | 0.05 | 話費為0.05美元. | 是 | 59s,無轉換 |
2 | 2017 03 26 01 01:59:50 26 03 03:00:49 | 0.05 | 話費為0.05美元. | 是 | 59s,春夏轉換 |
3 | 2017 10 29 02 02:59:40 29 02 02:00:39 | 0.05 | 話費為0.05美元. | 是 | 59s,夏秋轉換 |
4 | 2017 08 26 16 16:50:12 26 16 16:51:12 | 0.05 | 話費為0.05美元. | 是 | 1min,無轉換 |
5 | 2017 03 26 01 01:59:50 26 03 03:00:50 | 0.05 | 話費為0.05美元. | 是 | 1min,春夏轉換 |
6 | 2017 10 29 02 02:59:45 29 02 02:00:45 | 0.05 | 話費為0.05美元. | 是 | 1min,夏秋轉換 |
7 | 2017 05 06 21 21:25:56 06 21 21:26:57 | 0.1 | 話費為0.1美元. | 是 | 1min1s,無轉換 |
8 | 2017 03 26 01 01:59:20 26 03 03:00:21 | 0.1 | 話費為0.1美元. | 是 | 1min1s,春夏轉換 |
9 | 2017 10 29 02 02:59:35 29 02 02:00:36 | 0.1 | 話費為0.1美元. | 是 | 1min1s,夏秋轉換 |
10 | 2017 08 27 12 12:56:15 27 13 13:15:15 | 0.95 | 話費為0.95美元. | 是 | 19min,無轉換 |
11 | 2017 03 26 02 02:00:00 26 03 03:19:00 | 0.95 | 話費為0.95美元. | 是 | 19min,春夏轉換 |
12 | 2017 10 29 02 02:50:06 29 02 02:09:06 | 0.95 | 話費為0.95美元. | 是 | 19min,夏秋轉換 |
13 | 2017 01 09 11 11:10:01 11 11 11:30:00 | 1 | 話費為1.0美元. | 是 | 19min59s,無轉換 |
14 | 2017 03 26 01 01:50:20 26 03 03:10:19 | 1 | 話費為1.0美元. | 是 | 19min59s,春夏轉換 |
15 | 2017 10 29 02 02:50:50 29 02 02:10:49 | 1 | 話費為1.0美元. | 是 | 19min59s,夏秋轉換 |
16 | 2017 06 26 17 17:50:16 26 18 18:10:16 | 1 | 話費為1.0美元. | 是 | 20min,無轉換 |
17 | 2017 03 26 01 01:56:26 26 03 03:16:26 | 1 | 話費為1.0美元. | 是 | 20min,春夏轉換 |
18 | 2017 10 29 02 02:50:22 29 02 02:10:22 | 1 | 話費為1.0美元. | 是 | 20min,夏秋轉換 |
19 | 2017 02 03 23 23:50:26 04 00 00:10:27 | 1.1 | 話費為1.1美元. | 是 | 20min1s,無轉換 |
20 | 2017 03 26 01 01:55:26 26 03 03:15:27 | 1.1 | 話費為1.1美元. | 是 | 20min1s,春夏轉換 |
21 | 2017 10 29 02 02:50:59 29 02 02:11:00 | 1.1 | 話費為1.1美元. | 是 | 20min1s,夏秋轉換 |
22 | 2017 09 08 12 12:59:22 08 13 13:20:22 | 1.1 | 話費為1.1美元. | 是 | 21min,無轉換 |
23 | 2017 03 26 01 01:50:26 26 03 03:11:26 | 1.1 | 話費為1.1美元. | 是 | 21min,春夏轉換 |
24 | 2017 10 29 02 02:56:11 29 02 02:17:11 | 1.1 | 話費為1.1美元. | 是 | 21min,夏秋轉換 |
import java.util.Scanner;
public class bill {
public static int[] starttime = new int[3];
public static int[] endtime = new int[3];
public static int[] poortime = new int[3];
public static int time;
public static float money;
public static int year;
public static int month;
public static int day;
public static int T = 0;
public static int W = 1;
public static int M = 1;
public static void main(String []args){
Scanner input=new Scanner(System.in);
System.out.println("開始年月日:");
year = input.nextInt();
month = input.nextInt();
day = input.nextInt();
System.out.println("開始時間:");
for(int i = 0;i < 3;i++){
starttime[i] = input.nextInt();
}
System.out.println("結束時間:");
for(int i = 0;i < 3;i++){
endtime[i] = input.nextInt();
}
Date();
Time();
if(M == 0){
System.out.println("時間是否經過變化了(是:1;否:0)");
int n = input.nextInt();
if(n == 1){
time = time + 60;
}
}
Money();
System.out.println("話費為" + money + "美元.");
}
public static void Date(){
if(month == 1 || month == 2)
{
year--;
month += 12;
}
W = (day + 2 * month + 3 * (month + 1)/5 + year + year/4 - year/100 + year/400 + 1) % 7;//0是週日,其他對應
if(month > 12)
{
year++;
month -= 12;
}
if(W == 0){
if(month == 3 && day >=25 && day <= 31){
T = 1;
}
else if(month == 10 && day >=25 && day <= 31){
T = 2;
}
else T = 0;
}
else T = 0;
}
public static void Time(){
if(starttime[0] > endtime[0]){
endtime[0] += 24;
}
for(int i = 0;i < 3;i++){
poortime[i] = endtime[i] - starttime[i];
}
if(T == 0){
if(W == 6 && endtime[0] >= 27){
if(month == 3 && day >=24 && day <= 30){
poortime[0]--;
}
else if(month == 10 && day >=25 && day <= 31){
poortime[0]++;
}
}
else if(W == 6 && endtime[0] >= 26 && endtime[0] <= 27 && month == 10 && day >=25 && day <= 31){
M = 0;//判斷時間是否經過變化了的
}
}
else if(T == 1){
if(starttime[0] <= 2 && endtime[0] >= 3){
poortime[0]--;
}
}
else if(T == 2){
if(starttime[0] < 2 && endtime[0] >= 3){
poortime[0]++;
}
else if(poortime[1] < 0 && starttime[0] == 2 && endtime[0] == 2){
poortime[0]++;
}
else if(starttime[0] <= 2 && endtime[0] == 2){
M = 0;//判斷時間是否經過變化了的
}
else if(starttime[0] == 2 && endtime[0] > 2){
M = 0;//判斷時間是否經過變化了的
}
}
time = poortime[0] * 60 + poortime[1];
if(poortime[2] > 0){//為負數或0時不像前進,為正確值
time++;
}
}
public static void Money(){
if(time <= 20){
money = (float)(time * 0.05);
}
else{
money = (float) (1 + (time - 20) * 0.10);
}
}
}
二 實驗總結
等價類劃分法是根據需求對輸入範圍進行細分,然後在分出的每一個區域內選取一個有代表性的測試資料開展測試。等價類=有效等價類+無效等價類。
邊界值分析法就是對輸入或輸出的邊界值進行測試的一種黑盒測試方法,通常作為等價類劃分法的補充;基於“錯誤更可能出現在輸入變數的極值附近”原理
兩種方法對比:
不同點:邊界值分析是對輸入的邊界值進行測試,未來查詢在邊界值上發生的錯誤;等價類劃分所有的輸入可能都被考慮進去,不僅僅考慮到邊界值的出錯;大量的錯誤是發生在輸入或輸出範圍的邊界上,而不是發生在輸入輸出範圍的內部。因此針對各種邊界情況設計測試用例,可以查出更多的錯誤。
相同點:均可撲抓邊界值這類較容易發生的錯誤。通常邊界值分析法是作為對等價類劃分法的補充,這種情況下,其測試用例來自等價類的邊界。
本次實驗缺點:當通話時期為10月最後一個星期日時,如果通話開始時間為2:20,截止時間為2:30,不能確定通話時長是10分鐘還是70分鐘,程式時間判斷會出錯。