连接到测试数据库的 Pytest 错误
Pytest errors connecting to test database
我 运行 遇到了我以前从未见过的奇怪错误 运行 我所在的 pytest 运行 我的测试几乎所有错误都由于不允许访问数据库。
这是上周未发生的新错误,因此它不是本地代码更改,但我不确定到底发生了什么。
任何人都可以指出正确的方向吗?
这里是错误:
conftest.py:52:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/local/lib/python3.8/site-packages/django/db/models/query.py:287: in __iter__
self._fetch_all()
/usr/local/lib/python3.8/site-packages/cacheops/query.py:271: in _fetch_all
return self._no_monkey._fetch_all(self)
/usr/local/lib/python3.8/site-packages/django/db/models/query.py:1308: in _fetch_all
self._result_cache = list(self._iterable_class(self))
/usr/local/lib/python3.8/site-packages/django/db/models/query.py:53: in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py:1154: in execute_sql
cursor = self.connection.cursor()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <django.test.testcases._DatabaseFailure object at 0x7fb361b2d2b0>
def __call__(self):
> raise AssertionError(self.message)
E AssertionError: Database queries to 'test' are not allowed in this test. Add 'test' to pytest_django.fixtures._django_db_fixture_helper.<locals>.PytestDjangoTestCase.databases to ensure proper test isolation and silence this failure.
/usr/local/lib/python3.8/site-packages/django/test/testcases.py:146: AssertionError
_ ERROR at setup of TestAccountViews.test_can_edit_account_info_with_backticks[admin] _
db = None
@pytest.fixture
def slug(db):
# delete these guys because there should only ever be 1 of each
from apps.payments.models.ledger_models import TransactionCode
> for code_object in TransactionCode.objects.all():
看来这是一个版本控制问题。
pytest-django
https://pypi.org/project/pytest-django/4.3.0/ updated a few days ago and apparently this is a new error because of that. I don't see anything in their changelog: https://pytest-django.readthedocs.io/en/latest/changelog.html 但是从版本 4.3.0 降到 4.2.0 确实解决了这个问题。
该问题的另一个修复是更改 pytest_sessionstart()
以允许访问 conftest.py
中的所有数据库,如下所示:
def pytest_sessionstart(session):
from django.test import TestCase
TestCase.multi_db = True
TestCase.databases = '__all__' # here
根据 pytest-django
文档中的 Tests requiring multiple databases,现在可以(这对我在 pytest-django 版本 4.3.0 上有效)通过使用以下 pytest 标记来修复此问题:
@pytest.mark.django_db(databases=['default', 'test'])
def test_my_code():
...
传递给 databases=
的列表是您在 settings.DATABASES
中定义的数据库键列表。
然而,这个区域似乎会发生一些变化,可能只会部分实施,所以 YMMV。
我 运行 遇到了我以前从未见过的奇怪错误 运行 我所在的 pytest 运行 我的测试几乎所有错误都由于不允许访问数据库。
这是上周未发生的新错误,因此它不是本地代码更改,但我不确定到底发生了什么。
任何人都可以指出正确的方向吗?
这里是错误:
conftest.py:52:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/local/lib/python3.8/site-packages/django/db/models/query.py:287: in __iter__
self._fetch_all()
/usr/local/lib/python3.8/site-packages/cacheops/query.py:271: in _fetch_all
return self._no_monkey._fetch_all(self)
/usr/local/lib/python3.8/site-packages/django/db/models/query.py:1308: in _fetch_all
self._result_cache = list(self._iterable_class(self))
/usr/local/lib/python3.8/site-packages/django/db/models/query.py:53: in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py:1154: in execute_sql
cursor = self.connection.cursor()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <django.test.testcases._DatabaseFailure object at 0x7fb361b2d2b0>
def __call__(self):
> raise AssertionError(self.message)
E AssertionError: Database queries to 'test' are not allowed in this test. Add 'test' to pytest_django.fixtures._django_db_fixture_helper.<locals>.PytestDjangoTestCase.databases to ensure proper test isolation and silence this failure.
/usr/local/lib/python3.8/site-packages/django/test/testcases.py:146: AssertionError
_ ERROR at setup of TestAccountViews.test_can_edit_account_info_with_backticks[admin] _
db = None
@pytest.fixture
def slug(db):
# delete these guys because there should only ever be 1 of each
from apps.payments.models.ledger_models import TransactionCode
> for code_object in TransactionCode.objects.all():
看来这是一个版本控制问题。
pytest-django
https://pypi.org/project/pytest-django/4.3.0/ updated a few days ago and apparently this is a new error because of that. I don't see anything in their changelog: https://pytest-django.readthedocs.io/en/latest/changelog.html 但是从版本 4.3.0 降到 4.2.0 确实解决了这个问题。
该问题的另一个修复是更改 pytest_sessionstart()
以允许访问 conftest.py
中的所有数据库,如下所示:
def pytest_sessionstart(session):
from django.test import TestCase
TestCase.multi_db = True
TestCase.databases = '__all__' # here
根据 pytest-django
文档中的 Tests requiring multiple databases,现在可以(这对我在 pytest-django 版本 4.3.0 上有效)通过使用以下 pytest 标记来修复此问题:
@pytest.mark.django_db(databases=['default', 'test'])
def test_my_code():
...
传递给 databases=
的列表是您在 settings.DATABASES
中定义的数据库键列表。
然而,这个区域似乎会发生一些变化,可能只会部分实施,所以 YMMV。