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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:39:53