Django覆盖率测试未运行全部App测试问题排查
解决Django全量测试无法发现API应用测试用例的问题
执行全量测试命令coverage run manage.py test时,API应用的测试用例没被检测到,导致覆盖率只有24%;但单独跑coverage run manage.py test api时,所有测试都能正常执行,覆盖率直接拉满到100%。API应用的测试目录结构是api/tests/test_views/filename.py,tests/__init__.py里写了from .test_views import *,test_views/__init__.py也导入了所有测试类(比如AdministrationAPIViewTest),而且API应用已经加到INSTALLED_APPS里了,其他同结构的应用都能正常被识别,就这个API应用出问题。
排查方向和解决办法
1. 检查测试文件和类的命名
Django的测试发现机制认死理,只找文件名以test开头、类名以Test结尾的测试:
- 看看
filename.py是不是test_xxxx.py的格式,要是叫views_test.py这种反着来的,直接改文件名就行。 - 测试类比如
AdministrationAPIViewTest是符合要求的,但如果类名没以Test结尾,Django就当它不是测试类,直接跳过。
2. 排查__init__.py的导入问题
要是api应用或者测试模块之间有循环导入,会搞崩Django的测试发现逻辑:
- 检查
tests/__init__.py里的from .test_views import *会不会触发循环导入——比如test_views里的测试类导入了api应用的模块,而那个模块又不小心导入了测试相关的东西。 - 其实没必要在
__init__.py里手动导入,只要文件名符合规范,Django会自己递归找tests目录下的测试文件,直接删掉这些导入语句试试。
3. 强制指定测试文件匹配规则
Django默认的测试发现规则可能漏了某些文件,全量测试时可以显式指定匹配模式:
coverage run manage.py test --pattern="test_*.py"
这样能确保test_views目录下的所有测试文件都被扫到。
4. 再核对下INSTALLED_APPS的配置
虽然已经加了api,但还是确认下应用名称对不对:
- 要是API应用在
apps子目录里,INSTALLED_APPS里得写apps.api这种完整路径,同时检查应用的AppConfig有没有配置错。
5. 看看测试有没有被标记跳过
有些测试类可能加了@unittest.skip或者@pytest.mark.skip(用pytest的话)的标记,全量测试时被跳过,但单独跑的时候可能因为某些条件没触发跳过:
- 翻下测试类和方法,把不必要的跳过标记删掉。
6. 清理测试缓存
Django有时候会缓存测试发现的结果,清掉缓存再跑试试:
- 删除项目里所有的
.pyc文件和__pycache__目录,然后重新执行全量测试。
内容的提问来源于stack exchange,提问作者HenryM
相关产品推荐
相关产品推荐

