在WSL的Python2.7中用unittest+coverage运行测试时遇AttributeError
错误成因与解决方案
错误成因分析
- Python 2.7 unittest规则限制:Python 2.7的unittest测试发现机制比3.x严格,仅会自动识别以
test_开头的方法;同时要求测试目录必须是可导入的Python模块,否则无法通过tests.test_xxx的方式找到对应文件。 - tests目录缺少模块标识文件:Python 2.7要求目录必须包含
__init__.py才能被当作可导入模块,否则tests.test_admin_ruta_total_posiciones这种导入路径会失效,导致loader找不到目标属性。 - 命令调用语法不兼容:Python 2.7的
unittest模块不支持3.x的-m unittest 模块名简洁调用方式,直接使用会触发解析错误。
解决步骤
1. 规范测试结构与命名
- 给
tests目录添加空的__init__.py文件:touch tests/__init__.py - 确保所有测试方法严格以
test_开头,示例:import unittest class TestAdminRutaTotalPosiciones(unittest.TestCase): def test_soporte_sin_db(self): # 测试逻辑 pass def test_admin_db(self): # 测试逻辑 pass
2. 调整测试运行命令(适配Python 2.7)
选择以下任意一种有效命令:
- 自动发现所有测试:
coverage run -m unittest discover -s tests -p "test_*.py"-s tests指定测试目录,-p "test_*.py"匹配所有测试文件。 - 直接指定测试文件路径:
coverage run -m unittest tests/test_admin_ruta_total_posiciones.py - 单独运行指定测试类:
coverage run -m unittest tests.test_admin_ruta_total_posiciones.TestAdminRutaTotalPosiciones
3. 验证模块导入有效性
在项目根目录启动Python 2.7交互环境,执行以下命令确认导入正常:
import tests.test_admin_ruta_total_posiciones from tests.test_admin_ruta_total_posiciones import TestAdminRutaTotalPosiciones
若导入失败,检查:
- 当前工作目录是否为项目根目录
- WSL中
tests目录及文件的可读权限是否正常 - 测试文件是否存在语法错误(可通过
python2.7 -m py_compile tests/test_admin_ruta_total_posiciones.py检查)
4. 生成覆盖率报告
测试运行成功后,执行以下命令生成报告:
# 生成文本报告 coverage report # 生成HTML可视化报告 coverage html
额外注意事项
- WSL环境中使用Linux风格路径(如
/home/user/your-project/),避免Windows路径格式引发的问题; - Python 2.7已停止官方维护,若长期维护项目建议升级至Python 3.x。
内容的提问来源于stack exchange,提问作者a_retr0
相关产品推荐
相关产品推荐

