为何Coverage会将所有基于类的视图标记为已测试?
Django测试覆盖率误判的解决办法
给导入时执行的代码添加忽略标记
类视图里的顶层代码(比如你示例中的print语句)在模块导入时就会执行,Coverage会误判为已测试。可以在这类代码行末尾加上# pragma: no cover,告诉Coverage跳过统计:class AuthorDelete(View): print("导入时执行的代码") # pragma: no cover def get(self, request, pk): # 实际需要测试的视图逻辑 pass也可以在项目根目录创建
.coveragerc配置文件,批量设置忽略规则:[run] exclude_lines = pragma: no cover # 还可以添加其他要忽略的模式,比如所有print语句 print\(.*\)调整urls.py的导入方式,避免提前加载视图
不要用from . import views这种一次性导入所有视图的写法,改用字符串引用或者延迟导入,让视图只有在实际被路由访问时才会加载:# urls.py from django.urls import path urlpatterns = [ # 用字符串路径引用视图类 path('author/delete/<int:pk>/', 'myapp.views.AuthorDelete.as_view', name='author-delete'), ]或者用Django提供的
import_string实现延迟导入:from django.urls import path from django.utils.module_loading import import_string urlpatterns = [ path( 'author/delete/<int:pk>/', import_string('myapp.views.AuthorDelete').as_view(), name='author-delete' ), ]这样测试启动时不会加载所有视图类,只有当测试用例实际请求对应路由时,才会导入并执行视图类的代码,Coverage就能准确统计实际被测试的部分。
不需要更换工具
Coverage是Python生态里最成熟的测试覆盖率工具之一,只要做好上述配置,就能得到准确的测试覆盖报告,没必要换其他工具。
内容的提问来源于stack exchange,提问作者mohsenof
相关产品推荐
相关产品推荐

