连接到测试数据库的 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。