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

Django单元测试(含Coverage)如何实现?字段测试困惑求助

Django单元测试问题解答

一、Coverage显示测试未覆盖的排查方向

你的测试代码里出现了重复定义TagTest类的情况,后面的类会覆盖前面的,这会导致测试逻辑混乱,甚至部分测试方法根本没执行,这大概率是Coverage显示未覆盖的原因之一。除此之外,还可以从这些方面排查:

  • 测试文件命名必须符合Django规范:文件名要以test_开头,比如test_models.py,否则Django测试框架不会自动发现它。
  • 测试方法必须以test_开头:你的test_get符合要求,但如果有其他方法没按这个规则命名,会被跳过。
  • 确认测试命令是否正确执行:运行python manage.py test your_app_name指定目标应用,确保测试被触发。
  • Coverage配置问题:检查Coverage是否正确包含了你的应用代码,比如在.coveragerc里设置source = your_app,避免排除了被测文件。

二、blank=True字段的测试方法

blank=True表示字段在表单验证时可以为空(数据库层面允许空值还要看null=True),测试要点:

  1. 测试字段为空时能成功创建对象
def test_blank_field(self):
    # 假设name字段有blank=True,创建时传空字符串
    tag = models.Tag.objects.create(name='')
    self.assertEqual(tag.name, '')
    # 或者不传该字段(如果字段无默认值但允许空白)
    tag = models.Tag.objects.create()
    self.assertEqual(tag.name, '')
  1. 测试字段非空的正常场景(确保基础功能正常)
def test_normal_field_value(self):
    tag = models.Tag.objects.create(name='test_tag')
    self.assertEqual(tag.name, 'test_tag')

三、unique=True字段的测试方法

unique=True表示字段值在数据库中必须唯一,测试要点:

  1. 测试创建重复值时抛出IntegrityError
from django.db.utils import IntegrityError

def test_unique_field_duplicate(self):
    # 先创建一个对象
    models.Tag.objects.create(name='unique_tag')
    # 再创建同名的,应该抛出异常
    with self.assertRaises(IntegrityError):
        models.Tag.objects.create(name='unique_tag')
  1. 测试创建不同值的对象成功
def test_unique_field_different_values(self):
    tag1 = models.Tag.objects.create(name='tag1')
    tag2 = models.Tag.objects.create(name='tag2')
    self.assertNotEqual(tag1.name, tag2.name)
    self.assertEqual(models.Tag.objects.count(), 2)
  1. 测试更新字段为重复值时抛出异常
def test_unique_field_update_duplicate(self):
    tag1 = models.Tag.objects.create(name='tag1')
    tag2 = models.Tag.objects.create(name='tag2')
    # 尝试把tag2的name改成tag1的name,应该报错
    with self.assertRaises(IntegrityError):
        tag2.name = 'tag1'
        tag2.save()

四、修正后的测试代码示例

from django.test import TestCase
from django.db.utils import IntegrityError
from . import models

class TagTest(TestCase):
    def create_tag(self, name='test'):
        return models.Tag.objects.create(name=name)

    def test_tag_basic(self):
        tag = self.create_tag()
        self.assertIsInstance(tag, models.Tag)
        self.assertEqual(tag.name, str(tag))
        self.assertEqual(len(tag.name), 4)

    # 测试blank=True(假设name字段有blank=True)
    def test_tag_name_blank(self):
        tag = models.Tag.objects.create(name='')
        self.assertEqual(tag.name, '')
        tag_empty = models.Tag.objects.create()
        self.assertEqual(tag_empty.name, '')

    # 测试unique=True
    def test_tag_name_unique(self):
        self.create_tag(name='unique_name')
        with self.assertRaises(IntegrityError):
            self.create_tag(name='unique_name')
        
        tag2 = self.create_tag(name='another_name')
        self.assertEqual(models.Tag.objects.count(), 2)

内容的提问来源于stack exchange,提问作者Ghazi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:57:20