已编写Django单元测试,但覆盖率报告显示存在未覆盖语句
Django模型覆盖率报告显示未覆盖语句的排查分析
我为一个简单的Django模型编写了单元测试,但生成的覆盖率报告显示存在未覆盖语句,甚至一些实际已被测试覆盖的函数也被判定为未覆盖,拉低了整体覆盖率平均值。
模型代码
from django.db import models from model_utils import FieldTracker from generics.base_model import BaseModelMixin class AModel(BaseModelMixin): record_name = models.CharField(max_length=255) tracker = FieldTracker() class Meta(BaseModelMixin.Meta): db_table = 'a_model_records' def __str__(self): record _name = self. record_ name if record_name is None: record_name = "N/A" return record name
单元测试代码
class TestAModel(TestCase): def setUp(self): super().setUp() def test_amodel(self): record_name = "some name" is_active = True user = User.objects.first() record = AModel.objects.create( record_name=record_name, is_active=is_active, created_by_id=user.id, ) self.assertEqual(str(record), record_name) self.assertEqual(record.name, record_name) self.assertEqual(record.is_active, is_active)
执行命令
source activate set -a source local.env set +a coverage run --source="unit_test_app" --rcfile=.coveragerc project/manage.py test -v 2 coverage report coverage html
Coverage配置文件(.coveragerc)
[run] omit= */migrations/* */tests/* */manage.py */apps.py */settings.py */urls.py */filters.py */serializers.py */generics/* [report] show_missing = true
问题原因及修复方案
1. 模型代码存在语法错误
你的__str__方法有多处语法错误:
- 变量名
record _name和self. record_ name中间包含空格,这是无效的Python语法,实际运行时会直接报错,导致整个方法无法正常执行,Coverage自然会判定该方法未被覆盖。 - 返回语句
return record name同样是变量名错误,应为return record_name。
修复这些错误后,__str__方法才能被正确执行,Coverage也能正确统计其覆盖情况。
2. 测试代码存在逻辑错误
测试中的self.assertEqual(record.name, record_name)是错误的:你的模型字段名为record_name,而非name,这行代码会抛出AttributeError,导致测试提前终止,后续的断言和代码执行流程被打断,部分逻辑没有被实际覆盖。需要将这行改为:
self.assertEqual(record.record_name, record_name)
3. 未覆盖__str__方法的分支
当前测试只创建了带有有效record_name的实例,没有覆盖record_name为None的场景,所以if record_name is None:这个分支没有被执行,覆盖率报告会显示该分支未覆盖。需要补充测试用例:
def test_amodel_str_empty_name(self): user = User.objects.first() record = AModel.objects.create( record_name=None, is_active=True, created_by_id=user.id, ) self.assertEqual(str(record), "N/A")
4. 检查Coverage的source路径配置
执行命令时指定了--source="unit_test_app",需要确认AModel所在的应用确实是unit_test_app。如果模型属于其他应用,Coverage不会统计到该模型的代码,导致显示未覆盖。
5. 环境变量与测试运行环境问题
你通过source local.env加载环境变量,需要确认其中的DJANGO_SETTINGS_MODULE等关键变量是否正确设置,否则可能导致测试运行异常,Coverage的统计结果也会不准确。
内容的提问来源于stack exchange,提问作者Sencer H.
相关产品推荐
相关产品推荐

