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),测试要点:
- 测试字段为空时能成功创建对象
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, '')
- 测试字段非空的正常场景(确保基础功能正常)
def test_normal_field_value(self): tag = models.Tag.objects.create(name='test_tag') self.assertEqual(tag.name, 'test_tag')
三、unique=True字段的测试方法
unique=True表示字段值在数据库中必须唯一,测试要点:
- 测试创建重复值时抛出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')
- 测试创建不同值的对象成功
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)
- 测试更新字段为重复值时抛出异常
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
相关产品推荐
相关产品推荐

