Django中配置测试数据库并保留测试记录至手动/tearDown清理
解决Django测试中setUp插入记录无法保留到测试后的问题
问题原因
Django的TestCase默认会为每个测试方法开启数据库事务,测试方法执行完成后自动回滚事务。即便你用--keepdb参数保留了测试数据库文件,setUp中插入的记录也会因为事务回滚被删除,所以SQLite浏览器里看不到这些数据。
解决方案
1. 禁用测试类的事务特性
在TestTopic测试类中添加transaction = False属性,让Django不为测试方法自动创建事务,测试中插入的记录会保留到数据库中,直到你手动清理或在tearDown方法中删除:
from django.test import TestCase from .models import Topic class TestTopic(TestCase): transaction = False # 禁用自动事务回滚 def setUp(self): # 插入测试记录 Topic.objects.create(name="Topic 1") Topic.objects.create(name="Topic 2") Topic.objects.create(name="Topic 3") def test_topic_count(self): # 示例测试逻辑 self.assertEqual(Topic.objects.count(), 3) def tearDown(self): # 可选:手动清理记录,避免影响后续测试 Topic.objects.all().delete()
2. 类级别初始化配合事务禁用
如果希望在整个测试类执行前只插入一次数据并保留到测试结束,可以结合transaction = False使用setTestData类方法:
class TestTopic(TestCase): transaction = False @classmethod def setTestData(cls): # 类级别初始化,仅执行一次 Topic.objects.create(name="Topic 1") Topic.objects.create(name="Topic 2") Topic.objects.create(name="Topic 3") def test_topic_existence(self): self.assertTrue(Topic.objects.filter(name="Topic 1").exists())
注意事项
- 禁用事务后,测试方法之间会共享数据库状态,若多个测试方法修改数据库,务必在
tearDown中手动清理,避免测试相互干扰。 --keepdb仅负责保留数据库结构,不会改变Django测试的事务行为,必须配合上述配置才能保留测试数据。
内容的提问来源于stack exchange,提问作者Kapil Yadav
相关产品推荐
相关产品推荐

