You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测试Python编写的包裹状态查询UI交互代码?

包裹状态查询UI代码测试方案

一、测试前先修复代码中的关键问题

测试前必须修正代码里的明显bug,否则测试无法正常进行:

  1. 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}")
  1. Option 3包裹ID处理错误:输入的包裹ID是字符串,直接转成整数即可,不需要遍历字符:
checkPackage = int(input('Please enter a package using its package ID'))
pkg1 = myHash.search(checkPackage)
# 移除原来的for循环
  1. 时间比较逻辑错误: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的总里程数
    • 无报错,所有包裹信息正常输出
  • 异常测试:输入范围外的包裹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),程序是否处理类型错误
    • 输入非法时间格式,程序是否报错或提示

测试Option 4:退出程序

  • 操作:运行程序,输入4
  • 预期结果:程序立即退出循环,终止运行,无报错

边界情况测试

  • 时间刚好等于包裹出库时间:验证状态是否符合需求(如En Route)
  • 时间刚好等于包裹送达时间:验证状态是否为Delivered
  • 卡车总里程为0的情况:Option 1是否正确显示0

三、自动化测试方案(批量验证用)

用unittest或pytest框架,模拟输入并验证输出逻辑:

  1. 模拟输入输出:用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()
  1. 单元测试状态判断逻辑:把状态判断逻辑封装成独立函数(如get_package_status(pkg, check_time)),单独测试该函数在各种时间场景下的返回值是否正确。

内容的提问来源于stack exchange,提问作者user24021390

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:11:20