Pytest连接测试数据库时出现错误

5

我在运行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():

2个回答

6

看起来这是一个版本控制的问题。

pytest-django https://pypi.org/project/pytest-django/4.3.0/ 几天前进行了更新,显然由于此原因出现了新错误。我在他们的更改日志中没有看到任何信息:https://pytest-django.readthedocs.io/en/latest/changelog.html,但是将版本从 4.3.0 降低到 4.2.0 可以解决该问题。

另一种解决方法是修改 conftest.py 中的 pytest_sessionstart() 方法,使其允许访问所有数据库,方法如下:

def pytest_sessionstart(session):
    from django.test import TestCase
    TestCase.multi_db = True
    TestCase.databases = '__all__'      # here

确保锁定您的依赖项,以免发生不可预知的更新。 - AKX
@AKX 是的,我已经为其他所有内容准备好了,只是没想到对于测试很重要。我已经在需求中更改了这个。 - ViaTech

4
根据pytest-django文档中的 需要多个数据库的测试,现在可能可以通过使用以下pytest标记来解决此问题(在pytest-django版本4.3.0上已经验证过)。
@pytest.mark.django_db(databases=['default', 'test'])
def test_my_code():
    ...

databases=参数接受一个数据库键名的列表,这些键名需要在settings.DATABASES中定义。

然而,这个区域似乎存在一些变化,并且可能只部分实现,所以结果可能因人而异。


我不想使用默认的数据库,我想在测试中使用另一个数据库,我该怎么做? - Keval
传递给 databases= 的数据库列表是您在 Django settings.py 文件中的 DATABASES 字典中的键列表,因此您只需传递要使用的数据库的键即可... 如果您想为所有测试使用不同的 DB,则最简单的方法是在测试时将 DATABASES['default'] 配置为不同,您可以通过查看 sys.argv 或使用环境变量来检测到这一点。 - daphtdazz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接