软件测试python版本‘电话账单’题解

Dara ·
更新时间:2024-11-10
· 569 次阅读

题目:对电话账单来说,春季和秋季的标准时间与夏时制时间的转换会带来有意思的问题。春 季,这种转换发生在(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 个小时的通话。 

 

最近,软件测试实验要求,写一个程序,关于电话账单的题目,要交作业了,我现在修改了代码,写个博客。在网上,也找搜了好些,但是基本上都是用Java或者c++来写的,我觉得这个代码太麻烦了,使用了python来解决了这道题,可能有点不对,但是可以参考。使用Python的时间类datetime包处理时间比Java和c++简单得多。

先说说我对这道题的理解,也不知道对不对,我是按照我的理解来写的代码。我的理解是春夏时制转换的时候,需要减去一个小时,如从01:30:00开始通话,当到达02:00:00的时候,由于存在转换,此时显示的是03:30:00。相应的夏秋时制转换的时候,需要加上一个小时,如从02:00:00通话,到02:10:00结束,由于存在转换,可以是由02:00:00通话到02:59:59后,调回到02:00:00然后又继续通话十分钟,实际是70分钟,当然这个02:00:00也可以是从02:59:59调回到02:00:00后在进行通话的,所有也有可能是10分钟。

from datetime import datetime as dt import datetime print("请输入如'2020-03-20 14:16:30'的时间格式") # 判读输入的时间是否正确,是否超过20小时,如果错误,将重新输入 while True: start_time = input("输入通话开始时间:\n") end_time = input("输入通话结束时间:\n") s_time = dt.strptime(start_time, '%Y-%m-%d %H:%M:%S') #标准化输入时间 e_time = dt.strptime(end_time, '%Y-%m-%d %H:%M:%S') time_difference = (e_time - s_time) if time_difference.total_seconds() 20: month = s_time.strftime("%m") day = s_time.strftime("%d") week = s_time.strftime("%w") hour_str = s_time.strftime("%H") hour_end = e_time.strftime("%H") # 这里判断时间是否是十月最后一个星期日,如果是可以输入开始时间为02:30:00,结束时间为02:10:00 if int(month) == 10 and 31-int(day)<7 and int(week) == 0 and int(hour_str) == 2 and int(hour_end) == 2: break else: print("输入的时间有误,请重新输入!") else: break # 春夏时制转换收费 def fee_transformation_sum(minute, second): total_minute = minute - 60 fee_transformation_no(total_minute, second) # 夏秋时制转换收费 def fee_transformation_aut(minute, second): total_minute = minute + 60 fee_transformation_no(total_minute, second) # 无时制转换收费 def fee_transformation_no(minute, second): if second == 0: if minute <= 20: fee = minute * 0.05 print("通话费用是:", fee) else: fee = 1 + (minute - 20) * 0.1 print("通话费用是:", fee) else: if (minute + 1) <= 20: fee = (minute + 1) * 0.05 print("通话费用是:", fee) else: fee = 1 + (minute + 1 -20) * 0.1 print("通话费用是:", fee) # 获取输入的时间的月份、天数、星期几、小时 month = s_time.strftime("%m") day_s = s_time.strftime("%d") week_s = s_time.strftime("%w") hour_s = s_time.strftime("%H") hour_e = e_time.strftime("%H") # 取得通话时长 minutes = time_difference.total_seconds() // 60 seconds = time_difference.total_seconds() % 60 if int(month) == 3 and 31-int(day_s) 2: print("是三月最后一个星期日且通话时间是在02:00:00之前,调至03:00:00之后") fee_transformation_sum(minutes, seconds) elif int(month) == 4 and int(day_s) 2: print("是四月最初一个星期日且通话时间是凌晨两点到三点之间") fee_transformation_sum(minutes, seconds) elif int(month) == 10 and 31-int(day_s)= 0: print("如果是十月最后一个星期日且通话时间是在02:00:00之前,转换到02:00:00,则") fee_transformation_aut(minutes, seconds) print("或者是十月最后一个星期日且通话时间是在02:00:00之前,未转换到02:00:00,则") fee_transformation_no(minutes, seconds) elif int(hour_s) == 2 and int(hour_e) == 2 and minutes < 0: minu = (time_difference.total_seconds() + 3600) // 60 seco = (time_difference.total_seconds() + 3600) % 60 fee_transformation_no(minu, seco) else: fee_transformation_no(minutes, seconds) else: fee_transformation_no(minutes, seconds)

以下是按照等价类和边界值进行测试的数据

等价类划分:

T1={通话时长不到1分钟}

T2={1分钟 ≤ 通话时长 ≤ 20分钟}
T3={通话时长大于20分钟} 
S1={无时制转换}
S2={春时制与夏时制转换}

S3={夏时制与秋时制转换}

用例ID

输入数据

预期输出

实际输出

是否通过

备注

1

2020-02-26 14:00:00

2020-02-26 14:00:10

0.05

0.05

对应等价类T1,S1

2

2020-03-29 02:00:00

2020-03-29 03:00:20

0.05

0.05

对应等价类T1,S2

3

2020-10-25 02:59:34

2020-10-25 02:00:22

0.05

0.05

对应等价类T1,S3

4

2020-10-25 01:59:22

2020-10-25

02:00:20

5.1或0.05

5.1或0.05

对于等价类T1,S3

5

2020-02-26 14:00:00

2020-02-26 14:18:10

0.95

0.95

对应等价类T2,S1

6

2020-03-29 01:59:00

2020-03-29 03:16:10

0.9

0.9

对应等价类T2,S2

7

2020-10-25 02:58:00

2020-10-25 02:16:10

0.95

0.95

对应等价类T2,S3

8

2020-10-25 01:58:00

2020-10-25 02:16:10

6.9或0.95

6.9或0.95

对应等价类T2,S3

9

2020-02-26 14:00:00

2020-02-26 15:30:30

8.1

8.1

对应等价类T3,S1

10

2020-03-29 01:59:00

2020-03-29 03:16:10

0.9

0.9

对应等价类T3,S2

11

2020-10-25 01:58:00

2020-10-25 02:36:10

8.9或2.9

8.9或2.9

对应等价类T3,S3

12

2020-10-25 02:36:10

2020-10-25 02:26:10

4.0

4.0

对应等价类T3,S3

边界值测试:

边界值分析: 
通话时长:{59s,1min,1min1s,19min,19min59s,20min,20min1s,21min} 
通话日期:{无时制转换时间,三月末四月初的一个星期日(春时制与夏时制转换),十月的最后一个星期日(夏时制与秋时制转换)}

用户ID

输入数据

预期输出

实际输出

是否通过

备注

1

2020-02-27 14:00:00

2020-02-27 14:00:59

0.05

0.05

59s,无转换

2

2020-03-29 01:59:10

2020-03-29 03:00:09

0.05

0.05

59s,春夏转换

3

2020-10-25 02:59:10

2020-10-25 02:00:09

0.05

0.05

59s,夏秋转换

4

2020-02-27 14:00:12

2020-02-27 14:01:12

0.05

0.05

1min,无转换

5

2020-03-29 01:59:10

2020-03-29 03:00:10

0.05

0.05

1min,春夏转换

6

2020-10-25 02:59:10

2020-10-25 02:00:10

0.05

0.05

1min,夏秋转换

7

2020-02-27 14:00:12

2020-02-27 14:01:13

0.1

0.1

1min1s,无转换

8

2020-03-29 01:59:10

2020-03-29 03:00:11

0.1

0.1

1min1s,春夏转换

9

2020-10-25 02:59:10

2020-10-25 02:00:11

0.1

0.1

1min1s,夏秋转换

10

2020-02-27 14:00:12

2020-02-27 14:19:12

0.95

0.95

19min,无转换

11

2020-03-29 01:59:10

2020-03-29 03:18:10

0.95

0.95

19min,春夏转换

12

2020-10-25 02:59:10

2020-10-25 02:18:10

0.95

0.95

19min,夏秋转换

13

2020-02-27 14:00:12

2020-02-27 14:20:11

1.0

1.0

19min59s,无转换

14

2020-03-29 01:59:10

2020-03-29 03:19:09

1.0

1.0

19min59s,春夏转换

15

2020-10-25 02:59:10

2020-10-25 02:19:09

1.0

1.0

19min59s,夏秋转换

16

2020-02-27 14:00:12

2020-02-27 14:20:12

1.0

1.0

20min,无转换

17

2020-03-29 01:59:10

2020-03-29 03:19:10

1.0

1.0

20min,春夏转换

18

2020-10-25 02:59:10

2020-10-25 02:19:10

1.0

1.0

20min,夏秋转换

19

2020-02-27 14:00:12

2020-02-27 14:20:13

1.1

1.1

20min1s,无转换

20

2020-03-29 01:59:10

2020-03-29 03:19:11

1.1

1.1

20min1s,春夏转换

21

2020-10-25 02:59:10

2020-10-25 02:19:11

1.1

1.1

20min1s,夏秋转换

22

2020-02-27 14:00:12

2020-02-27 14:21:12

1.1

1.1

21min,无转换

23

2020-03-29 01:59:10

2020-03-29 03:20:10

1.1

1.1

21min,春夏转换

24

2020-10-25 02:59:10

2020-10-25 02:20:10

1.1

1.1

21min,夏秋转换

 实验测试的部分截图:

我个人觉得还是python写起来简单很多的。


作者:foolishbig



电话 Python 软件

需要 登录 后方可回复, 如果你还没有账号请 注册新账号