如何测试Python编写的包裹状态查询UI交互代码?
包裹状态查询UI代码测试方案
一、测试前先修复代码中的关键问题
测试前必须修正代码里的明显bug,否则测试无法正常进行:
- Option 2缺失打印逻辑:遍历所有包裹ID(1-40),通过
myHash.search获取每个包裹,更新状态后打印。同时要把原来只针对pkg1的状态判断逻辑改成对每个包裹生效:
# 在Option 2的末尾添加 for i in range(40): pkg = myHash.search(i + 1) # 这里复用状态判断逻辑(建议封装成函数避免重复代码) if rtime < pkg.timeLeftHub0: pkg.status = 'At Hub' elif rtime >= pkg.time_delivered: pkg.status = 'Delivered' else: pkg.status = 'En Route' print(f"包裹ID {pkg.package_id} 在 {checkTime} 的状态: {pkg.status}")
- Option 3包裹ID处理错误:输入的包裹ID是字符串,直接转成整数即可,不需要遍历字符:
checkPackage = int(input('Please enter a package using its package ID')) pkg1 = myHash.search(checkPackage) # 移除原来的for循环
- 时间比较逻辑错误:
checkTime是字符串,不能直接和timedelta类型的包裹时间属性比较,必须用转换后的rtime进行判断:
# Option 3中替换所有checkTime为rtime if rtime < pkg1.timeLeftHub0: pkg1.status = 'At Hub' # 后续条件同理
二、手动测试步骤
模拟真实用户操作,逐个验证每个功能的正确性:
测试Option 1:查询所有包裹状态与总卡车里程
- 操作:运行程序,输入
1 - 预期结果:
- 依次打印40个包裹的详细信息,每条信息末尾附带
t1.mileage + t2.mileage + t3.mileage的总里程数 - 无报错,所有包裹信息正常输出
- 依次打印40个包裹的详细信息,每条信息末尾附带
- 异常测试:输入范围外的包裹ID(如果代码有涉及)时,
myHash.search是否能返回合理提示或不崩溃
测试Option 2:查询指定时间所有包裹状态
- 操作:运行程序,输入
2,再输入合法时间(如09:00:00) - 预期结果:
- 每个包裹根据输入时间,正确显示
At Hub/En Route/Delivered状态(比如包裹出库时间为08:30:00、送达时间为10:00:00,输入09:00:00时状态应为En Route)
- 每个包裹根据输入时间,正确显示
- 异常测试:
- 输入非法时间格式(如
9:00、abc),程序是否捕获错误并提示用户重新输入 - 输入超出合理范围的时间(如
25:00:00),是否有容错处理
- 输入非法时间格式(如
测试Option 3:查询指定时间单个包裹状态
- 操作:运行程序,输入
3,先输入合法包裹ID(如5),再输入合法时间(如11:00:00) - 预期结果:
- 按格式输出指定包裹的状态,例如
5package status at 11:00:00 = Delivered - 状态判断准确:早于出库时间显示
At Hub,晚于送达时间显示Delivered,中间时段显示En Route
- 按格式输出指定包裹的状态,例如
- 异常测试:
- 输入不存在的包裹ID(如
41、0),myHash.search是否返回合理提示 - 输入非数字的包裹ID(如
abc),程序是否处理类型错误 - 输入非法时间格式,程序是否报错或提示
- 输入不存在的包裹ID(如
测试Option 4:退出程序
- 操作:运行程序,输入
4 - 预期结果:程序立即退出循环,终止运行,无报错
边界情况测试
- 时间刚好等于包裹出库时间:验证状态是否符合需求(如
En Route) - 时间刚好等于包裹送达时间:验证状态是否为
Delivered - 卡车总里程为0的情况:Option 1是否正确显示0
三、自动化测试方案(批量验证用)
用unittest或pytest框架,模拟输入并验证输出逻辑:
- 模拟输入输出:用
unittest.mock替换input和print,验证特定输入下的输出是否符合预期:
import unittest from unittest.mock import patch, MagicMock import datetime class TestPackageUI(unittest.TestCase): def setUp(self): # 模拟包裹和哈希表对象 self.mock_pkg = MagicMock() self.mock_pkg.package_id = 5 self.mock_pkg.timeLeftHub0 = datetime.timedelta(hours=8, minutes=30) self.mock_pkg.time_delivered = datetime.timedelta(hours=10) self.mock_myHash = MagicMock() self.mock_myHash.search.return_value = self.mock_pkg @patch('builtins.input', side_effect=['3', '5', '09:00:00']) @patch('builtins.print') def test_option3_en_route(self, mock_print, mock_input): # 假设你的UI逻辑封装在run_ui函数中 from your_module import run_ui # 替换全局myHash为模拟对象 with patch('your_module.myHash', self.mock_myHash): run_ui() # 验证打印内容是否符合预期 mock_print.assert_called_with('5package status at 09:00:00 = En Route') if __name__ == '__main__': unittest.main()
- 单元测试状态判断逻辑:把状态判断逻辑封装成独立函数(如
get_package_status(pkg, check_time)),单独测试该函数在各种时间场景下的返回值是否正确。
内容的提问来源于stack exchange,提问作者user24021390
相关产品推荐
相关产品推荐

