对电话账单来说,春季和秋季的标准时间与夏时制时间的转换会带来有意思的问题。春 季,这种转换发生在(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分钟,程序时间判断会出错。