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

如何在Django测试用例间保留数据库表及其中的数据?

解决Django测试用例间保留数据库数据的问题

方法1:自定义TransactionTestCase跳过数据清理

TestCase默认通过事务回滚重置数据库,TransactionTestCase则会在每个测试后截断所有表。如果要跨测试类保留数据,可以自定义基类跳过截断操作:

from django.test import TransactionTestCase

class SharedDataTestCase(TransactionTestCase):
    @classmethod
    def _fixture_teardown(cls):
        # 跳过默认的表截断逻辑,保留测试数据
        pass

class test_1(SharedDataTestCase):
    def test_function_1(self):
        # 创建数据库条目
        someModel.objects.create(file_path=file_path)

class test_2(SharedDataTestCase):
    def test_function_2(self):
        # 可直接获取test_1创建的数据
        obj = someModel.objects.get(file_path=file_path)

注意:这种方式下测试用例会共享数据库状态,测试顺序直接影响结果,需确保执行顺序符合预期(可借助django-test-ordering库控制顺序)。

方法2:类级初始化实现单测试类内数据共享

如果仅需要单个测试类内的多个方法共享数据,用TestCase的setUpTestData即可:

from django.test import TestCase

class BaseTest(TestCase):
    @classmethod
    def setUpTestData(cls):
        # 所有测试方法执行前仅创建一次数据
        cls.test_file = someModel.objects.create(file_path=file_path)

class test_1(BaseTest):
    def test_function_1(self):
        self.assertEqual(self.test_file.file_path, file_path)

class test_2(BaseTest):
    def test_function_2(self):
        # 能获取到基类初始化的数据
        obj = someModel.objects.get(file_path=self.test_file.file_path)

每个测试类的setUpTestData独立执行,不同测试类间数据不共享;单个测试类内的方法共享初始数据,且每个方法结束后事务回滚,数据恢复到初始状态。

方法3:数据库快照批量共享数据(适合大量测试用例)

如果有大量测试需要复用复杂数据,可通过数据库快照实现:

  1. 提前创建包含测试数据的数据库备份(如pg_dump/mysqldump)
  2. 测试前恢复快照到测试库,再用--keepdb运行测试:
    # 恢复快照到测试数据库
    psql -U your_username test_db < test_data_dump.sql
    # 运行测试,保留数据库实例
    python3 manage.py test tests --keepdb
    
  3. 可自定义测试运行器,实现快照自动恢复,省去手动操作。

注意事项

  • 跨测试用例共享数据会提升测试耦合度,顺序变动可能导致失败,仅在必要场景使用。
  • 使用自定义SharedDataTestCase后,测试完成需手动清理数据库,避免影响后续测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:05:36