如何在运行测试用例后保留Django测试数据库
当我通过输入以下内容来运行测试用例时
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:')
另外,你也可以使用 pdb
的 set_trace
函数,这样同样会让执行暂停并等待输入,同时也能让你在那段代码执行时进行调试。
只要确保在把代码发送到自动构建系统之前,删除 input()
(或 pdb.set_trace()
)的调用,否则它会等待用户输入,导致超时。
16
你可以通过使用 test --keepdb
这个选项,来防止测试数据库被删除。
https://docs.djangoproject.com/en/dev/topics/testing/overview/#the-test-database