Python Django py.test是否在真实数据库上运行?
py.test设置一个测试数据库 我想使用settings.py文件中的真实数据库集。Python Django py.test是否在真实数据库上运行?,python,django,pytest,Python,Django,Pytest,py.test设置一个测试数据库 我想使用settings.py文件中的真实数据库集。 (因为我在测试机上,已经有了测试数据) 可能吗?是的,您可以覆盖设置上的设置 为测试设置真实数据库并加载数据库。。但我认为,这不是一个好的做法,因为你想在不修改“真正”应用程序环境的情况下运行测试 你应该试试pytest django 有了这个库,您可以重用、创建和删除数据库测试。我认为是的,您不应该将项目数据库用作测试数据库。相反,我建议在数据库设置中创建当前项目的副本,并对其运行测试。在django测试中
(因为我在测试机上,已经有了测试数据)
可能吗?是的,您可以覆盖设置上的设置 为测试设置真实数据库并加载数据库。。但我认为,这不是一个好的做法,因为你想在不修改“真正”应用程序环境的情况下运行测试 你应该试试pytest django 有了这个库,您可以重用、创建和删除数据库测试。我认为是的,您不应该将项目数据库用作测试数据库。相反,我建议在数据库设置中创建当前项目的副本,并对其运行测试。在django测试中,您需要创建自定义的测试运行程序来完成此操作。但是在py.test中有一个名为
db
的夹具,它执行所有db设置/拆卸逻辑。因此,您需要创建自定义的db fixture,以满足您的需要。这里是默认db fixture的来源
如果您仍然想在project_db上运行测试,请注意
我只在django默认测试中使用自定义runner bellow(django版本1.6,还没有在其他版本中测试)完成了这项工作
更新
好的,这是你如何做到这一点的基本想法。首先,您必须完全重新加载默认值。您要查找的代码行是。这是py.test执行其test\u db名称分配的地方。因此,基本上您需要创建自定义的\u get\u test\u db\u name
,并在其中提供项目\u db的路径。此外,在运行测试时还必须使用
另外,您还可以使用项目数据库的转储文件填充测试数据库,然后使用
--重用数据库运行测试,py.test将针对测试数据库中的最新项目数据库版本运行测试 使用现有的外部数据库是有文档记录的,尽管我同意Ederson的观点:最好使用一个夹具,这样您的测试可以在所有环境中运行,包括生产环境 是的,谢谢你的帮助,我看到过类似的代码,我猜py.test也可以,但是我自己找不到一个例子,也无法让它工作。。py.test代码很难阅读。
# coding: utf-8
from __future__ import unicode_literals, absolute_import
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.core.management import call_command
from django.db import connection
from django.test.runner import DiscoverRunner, setup_databases
from django.test.testcases import connections_support_transactions
# configure(default_settings=settings,
settings.DEBUG = True
settings.TEMPLATE_DEBUG = True
class KeepDatabaseTestRunner(DiscoverRunner):
"""
Skips creating test database and uses default database for tests.
"""
def setup_databases(self, **kwargs):
"""Setups databases to run and migrate on settings.DATABASES['default']['TEST']['NAME']"""
old_name = settings.DATABASES['default']['NAME']
try:
test_name = settings.DATABASES['default']['TEST']['NAME']
except KeyError:
raise ImproperlyConfigured("TEST NAME is not defined in settings.DATABASES['default']")
connection.settings_dict["NAME"] = test_name
connection.settings_dict['SUPPORTS_TRANSACTIONS'] = connections_support_transactions()
call_command('syncdb')
call_command('migrate')
return [connection, old_name, False], []
def teardown_databases(self, old_config, **kwargs):
"""Will not do anything"""
pass