You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已编写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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:50:10