当我通过输入
运行测试用例时python manage.py test myapp
测试用例完成后,django test runner默认删除了测试数据库。我不希望它被删除。
我可以使用任何数据库!
我想保留我的数据库,因为数据库中存在我想在创建的数据库中看到的错误。这样我就能确定它们了!
答案 0 :(得分:8)
您可以使用test --keepdb
选项阻止测试数据库被破坏。
https://docs.djangoproject.com/en/1.10/topics/testing/overview/#the-test-database
答案 1 :(得分:3)
答案 2 :(得分:2)
虽然将-k
传递到manage.py test
将保留测试数据库,但仍将删除在测试用例中创建的记录。这是因为Django的TestCase
类仍然会在每个测试用例之后重置您的数据库(django.test.TransactionTestCase
将执行flush
,而django.test.TestCase
会将每个测试用例包装在一个事务中并在测试用例完成后进行回滚。
使Django保留测试数据的唯一真正的解决方案是扩展TestCase
类并覆盖用于重置数据库的代码。
但是,如果您没有时间执行此操作,还可以在测试用例执行完 pause 之前使它暂停,让您有时间检查数据库重置之前。有多种方法可以实现此目的,但是现在,这是一个问题,在您的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
的{{1}}函数,该函数还将使执行暂停并等待输入,同时您还可以在该代码点调试环境。执行。
在将代码发送到自动生成系统之前,请确保先删除set_trace
(或input()
)调用,否则它将等待用户输入和超时。
答案 3 :(得分:1)
要在测试执行后保留整个Django测试数据库的状态 (不仅是表结构)
django.test.SimpleTestCase
(不是从django.test导入TestCase,TransactionTestCase)raise Exception('db savepoint')
(如果要在完整测试执行后保存状态,请跳过此步骤) def tearDown(self) -> None:
pass
@classmethod
def tearDownClass(cls):
pass
--keepdb
参数(例如./manage.py test app.test --keepdb
)运行测试-以防止在测试执行后清理整个数据库请参见测试示例 test_copy
./manage.py test --noinput --keepdb api.tests.SomeTests.test_copy
class SomeTests(SimpleTestCase):
def setUp(self):
super(SomeTests, self).setUp()
self.huge_set_up_operations()
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.huge_init_database()
def tearDown(self):
pass
@classmethod
def tearDownClass(cls):
pass
def test_copy(self):
subscription_models.COPY_SUBSCRIPTION_CHUNK_SIZE = 1 # verifies that everything goes ok even if chunked
target_list = AutoResponderFactory.create(user=self.user).list
target_contact = ContactFactory.create(user=self.user)
SubscriptionFactory.create(contact=target_contact, list=target_list)
答案 4 :(得分:0)
根据docs:
无论测试是否通过 或者失败,测试数据库 所有测试都被破坏了 已被执行。
虽然fixtures可能对您的情况有所帮助。只需创建初始数据,您希望在测试开始时就在那里,作为纹理,并使测试加载它。
答案 5 :(得分:0)
对于 Pytest 环境中的任何人,我使用以下 pytest.ini 进行测试
[pytest]
DJANGO_SETTINGS_MODULE=myapp.settings.test
python_files = tests.py test_*.py *_tests.py
addopts =
--ds=myapp.settings.test
--reuse-db
--nomigrations
注意“--resuse-db”命令参数/addpots