Python 如何使用Django';在多个数据库上使用原子_请求测试客户端?
我在我的Python 如何使用Django';在多个数据库上使用原子_请求测试客户端?,python,django,unit-testing,Python,Django,Unit Testing,我在我的设置.py中设置了两个数据库,每个数据库都有原子请求: 数据库={ “默认值”:{ “引擎”:“django.db.backends.postgresql_psycopg2”, 'NAME':'lolomg', 'USER':'lolomg', “密码”:“密码”, '主机':'本地主机', “端口”:“5432”, “原子请求”:True, }, “分析”:{ “引擎”:“django.db.backends.postgresql_psycopg2”, “名称”:“分析”, 'USER
设置.py中设置了两个数据库,每个数据库都有原子请求
:
数据库={
“默认值”:{
“引擎”:“django.db.backends.postgresql_psycopg2”,
'NAME':'lolomg',
'USER':'lolomg',
“密码”:“密码”,
'主机':'本地主机',
“端口”:“5432”,
“原子请求”:True,
},
“分析”:{
“引擎”:“django.db.backends.postgresql_psycopg2”,
“名称”:“分析”,
'USER':'lolomg',
“密码”:“密码”,
'主机':'本地主机',
“端口”:“5432”,
“原子请求”:True,
},
}
如果我然后编写任何使用Django的测试客户机的测试,例如
来自django.test的导入测试用例
类TestEndpoints(TestCase):
def测试手册(自我):
self.client.get(“api/v1/books”)
我将得到一个回溯和一个异常,如下所示:
======================================================================
FAIL: test_books (lolomg.books.tests.test_api.EndpointsTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jordi/vcs/lolomg/lolomg/books/tests/test_api.py", line 6, in test_books
resp = self.client.get(self.url)
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/client.py", line 535, in get
response = super().get(path, data=data, secure=secure, **extra)
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/client.py", line 347, in get
**extra,
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/client.py", line 422, in generic
return self.request(**r)
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/client.py", line 503, in request
raise exc_value
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python3.7/contextlib.py", line 73, in inner
with self._recreate_cm():
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/db/transaction.py", line 175, in __enter__
if not connection.get_autocommit():
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/db/backends/base/base.py", line 379, in get_autocommit
self.ensure_connection()
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection
self.connect()
File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/testcases.py", line 144, in __call__
raise AssertionError(self.message)
AssertionError:此测试中不允许数据库连接到“analytics”。将“分析”添加到lolomg.books.tests.test\u api.EndpointsTests.databases,以确保正确的测试隔离并消除此故障。
通过跟踪堆栈跟踪,我们看到这是因为由于设置了原子_请求
,测试客户端试图为分析
数据库建立事务。然而,自Django 2.2以来,现在必须在测试中显式启用与数据库的连接,而不是default
:
这很酷,但实际上我根本不想为了这个测试连接到analytics
数据库。事实上,只有少数几个测试需要连接到这个数据库,所以即使把这个数据库考虑到所有其他测试也是错误的。
虽然我可以对使用测试客户机的任何测试类执行databases='\uuuuuuuu all\uuuuuu'
,但这似乎也是错误的。我只是不希望测试客户机试图对大多数测试的分析数据库做任何事情
那么我应该怎么做呢?如何在每个数据库上保留原子请求
,但仅为实际需要的测试启用分析
数据库?我对Django 2还不是非常熟悉,但似乎实现这一点的唯一方法可能是禁用分析在测试运行程序中打开数据库,然后在涉及它的测试中显式地重新打开它
看
我认为这并不理想,因为您将在与代码运行环境不同的环境中运行测试,但我不确定是否有其他方法不只是为所有测试启用所有数据库。我想我可能会接受这个答案。Django在使用UserWarning执行此操作时会抱怨:覆盖设置数据库可能会导致意外行为。
但我不知道还能做什么。