校验country_list非空的单元测试是否合理?有无其他测试优化建议?
现有单元测试的适配性判断
你编写的两个断言方法本身逻辑是符合Python规则的:Python中空列表的布尔值为False,非空列表的布尔值为True,因此:
assertEmpty方法可以校验目标列表是否为空assertNotEmpty方法可以校验目标列表是否非空
但当前存在一个核心问题:country_list是onCountry方法内部的局部变量,单元测试无法直接获取该变量的状态,所以你写的断言方法暂时无法直接生效。
更合理的测试方案
1. 先改造业务方法,暴露测试入口
可以选择两种改造方式:
- 把
country_list作为onCountry方法的返回值,修改示例:
def onCountry(self, doc_id): if(doc_id==None): return [] # 中间原有逻辑保持不变 # 末尾新增返回 return country_list
- 把国家列表计算的逻辑抽成独立的公共方法单独测试,绘图、打印逻辑留在
onCountry中,测试聚焦性更强。
2. 补全测试覆盖场景
除了基础的空/非空校验,建议补充以下测试场景,保证业务逻辑正确性:
- 传入
None作为doc_id,校验返回的country_list为空 - 传入没有对应访问数据的doc_id(mock
findBySubjectDocId返回空列表),校验返回的country_list为空 - 传入有访问数据的doc_id(mock
findBySubjectDocId返回固定测试数据,比如[{"visitor_country":"CN"}, {"visitor_country":"US"}]),校验:- 返回的
country_list非空 - 列表内容符合预期(比如开启
SHOW_FULL_NAMES时返回["China", "United States"],关闭时返回["CN", "US"]) - 统计的国家数量和对应计数符合预期
- 返回的
3. 隔离外部依赖
单元测试时需要mock两类外部依赖,避免测试被外部环境影响、产生不必要的交互:
- mock
findBySubjectDocId方法,固定返回预设的测试数据,无需依赖真实的数据库查询 - mock
matplotlib的绘图相关方法,避免执行测试时弹出绘图窗口,影响自动化测试执行
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

