Python doctest跨目录导入模块失败及语法错误求助
问题解决步骤
1. 修正模块命名(推荐方案)
Python模块名需遵循PEP8规范,应使用下划线替代连字符,避免语法冲突。将0-add_integer.py重命名为0_add_integer.py,此时测试文件中的导入语句可直接写成:
>>> from 0_add_integer import add_integer # doctest: +NORMALIZE_WHITESPACE
在项目根目录运行测试命令即可正常执行:
python -m doctest tests/0-add_integer.txt -v
根目录会自动加入Python的搜索路径,测试文件能直接找到上级目录的模块。
2. 保留原模块名的临时解决方案
若必须保留原模块名,需同时解决语法错误和路径问题:
- 语法错误:带连字符的模块名无法直接用
from ... import语法,需借助importlib动态导入 - 路径问题:手动将上级目录添加到Python搜索路径
修改测试文件中的导入代码块:
>>> import sys >>> sys.path.append('..') # 将上级目录加入Python路径 >>> import importlib >>> add_module = importlib.import_module('0-add_integer') >>> add_integer = add_module.add_integer
同样在项目根目录运行上述测试命令即可。
测试驱动开发(TDD)学习建议
- 严格遵循"红-绿-重构"循环:先写必然失败的测试用例(红),再编写刚好能通过测试的最简代码(绿),最后优化代码结构、性能且不破坏现有功能(重构)。
- 从小案例练手:从简单函数(如当前的加法函数)开始,用doctest或unittest编写测试,熟悉边界场景(如非整数输入、零、负数)的测试逻辑,再逐步过渡到复杂模块。
- 重视测试覆盖率:确保每个功能分支都有对应测试用例,避免遗漏潜在逻辑漏洞。
- 拓展测试工具:除doctest外,学习使用
unittest或pytest框架,它们支持测试夹具、参数化测试等复杂场景;用coverage.py检查测试覆盖情况。 - 养成先测试后编码的思维:写代码前先明确需求的输入输出,将需求转化为测试用例,再实现功能,提前规避逻辑错误,减少后期调试成本。
内容的提问来源于stack exchange,提问作者Nahid Isayev
相关产品推荐
相关产品推荐

