如何测试读取API、更新Excel并上传Dropbox的Python脚本
你完全不需要仅靠全量集成测试验证这个脚本的逻辑,只要对现有代码做小幅解耦重构,就能覆盖绝大多数核心逻辑的单元测试,仅需要保留极少量的集成测试做端到端冒烟验证即可。
单元测试落地方式(完全不依赖外部服务)
你现在的代码之所以难写单测,核心问题是把所有外部依赖都硬编码成了全局变量:全局的请求session、全局的workbook/sheet对象、硬编码的Dropbox令牌、固定的输出文件名、直接取系统当前时间的now变量,这些耦合点拆开之后,单测写起来非常简单:
- 第一步:抽离核心业务逻辑为纯函数
脚本里最核心的业务规则是「筛选最近24小时更新的数据、提取对应字段准备写入Excel」,这部分逻辑完全不依赖网络、Excel操作、云存储服务,可以单独拆出来:
这个函数是纯逻辑,测的时候只需要构造测试用的字典数据、传入固定的from datetime import datetime, timedelta def extract_valid_row(unit: dict, now: datetime) -> list | None: """输入单条API返回数据和基准时间,符合时间要求就返回待写入Excel的行内容,否则返回None""" last_update_date = parser.parse(unit['lastupdatedate']) if not (now - timedelta(hours=24) <= last_update_date <= now): return None return [ unit['lastupdatedate'], unit['Make'], unit['Model'], unit['ModelYear'], unit['NewUsed'], unit['DSRP'] ]now时间,就能断言所有分支逻辑:比如23小时前更新的数据应该返回正确行、25小时前更新的数据应该返回None、字段值为空的场景处理是否符合预期,全程不需要任何外部依赖。 - 第二步:把硬编码的依赖改成参数传入
把三个核心函数的全局依赖都改成入参:get_info接收session对象作为参数,不要用全局sessionpopulate_excel_file接收info列表、sheet对象、workbook对象、输出文件名、基准时间now作为参数,不要用全局的sheet/workbook,不要在函数内部直接取系统时间upload_file接收Dropbox客户端实例、本地文件路径、云端存储路径作为参数,不要在函数内部初始化Dropbox连接
改完之后测这三个函数完全不需要真实外部服务:- 测
get_info时传入mock的session对象,预设mock的get请求返回值为自定义的测试JSON,断言函数解析结果符合预期即可,不需要真实发API请求 - 测
populate_excel_file时传入mock的sheet和workbook对象,构造好包含有效/无效时间的测试数据集,执行函数后断言mock对象的方法调用参数正确:比如有效数据是否对应写入了正确的行列、无效数据是否被跳过、save方法是否被正确触发,全程不需要生成真实的Excel文件 - 测
upload_file时传入mock的Dropbox客户端对象,断言files_upload方法被调用时传入的文件内容、目标路径符合预期即可,不需要真实连接Dropbox服务
集成测试的合理定位
你提到的「真实写入Excel、实际访问Dropbox校验上传」的全量集成测试不需要覆盖各种分支场景,只需要保留1~2条冒烟用例即可,作用仅仅是验证依赖对接没有偏差:比如确认openpyxl生成的文件格式正常、Dropbox SDK的调用参数符合官方要求,这类用例只需要跑通主流程,不需要反复执行。
另外顺便提一句,你贴的现有代码存在明显变量错误:get_info函数里把接口解析结果赋值给了sold_units,最后返回的却是未定义的info变量,这类低级错误靠单测第一时间就能发现,不需要等到跑全量集成测试连真实接口的时候才暴露。
内容的提问来源于stack exchange,提问作者s_jack_frost
相关产品推荐
相关产品推荐

