如何在运行测试用例后保留Django测试数据库

10 投票
6 回答
10667 浏览
提问于 2025-04-16 09:29

当我通过输入以下内容来运行测试用例时

python manage.py test myapp

测试用例完成后,Django的测试工具会默认删除测试数据库。我不想让它被删除。

我可以使用任何数据库!

我想保留我的数据库,因为里面有我想查看的错误,这样我才能找到问题所在!

6 个回答

12

当你在运行 manage.py test 时加上 -k,虽然可以保留测试数据库,但测试用例中创建的数据记录还是会被删除。这是因为 Django 的 TestCase 类在每个测试用例之后都会重置数据库。具体来说,django.test.TransactionTestCase 会执行一个 flush 操作,而 django.test.TestCase 则会把每个测试用例放在一个事务中,测试结束后会回滚。

如果想让 Django 保留测试数据,唯一的办法就是扩展 TestCase 类,并重写重置数据库的代码。

不过,如果你没时间这么做,也可以让你的测试用例在结束前 暂停 执行,这样你就可以在数据库被重置之前检查一下。实现这个有几种方法,但要注意,这是一种变通方法,在你的 Python 代码中请求用户 input 会让 Python 暂停执行,等待用户输入。

from django.test import TestCase


class MyTestCase(TestCase):
    def test_something_does_something(self):
        result = do_something_with_the_database()
        self.assertTrue(result)

        # Ask for `input` so execution will pause and wait for input.
        input(
            'Execution is paused and you can now inspect the database.\n'
            'Press return/enter key to continue:')

另外,你也可以使用 pdbset_trace 函数,这样同样会让执行暂停并等待输入,同时也能让你在那段代码执行时进行调试。

只要确保在把代码发送到自动构建系统之前,删除 input()(或 pdb.set_trace())的调用,否则它会等待用户输入,导致超时。

16

你可以通过使用 test --keepdb 这个选项,来防止测试数据库被删除。

https://docs.djangoproject.com/en/dev/topics/testing/overview/#the-test-database

-5

根据文档的说明:

无论测试是通过还是失败,测试用的数据库在所有测试执行完后都会被删除。

不过,数据文件可能会对你有帮助。你可以创建一些初始数据,这些数据在测试开始时需要存在,然后让测试去加载这些数据。

撰写回答