在单元测试上运行 pytest 时出现“TEST[DEPENDENCIES] 中的循环依赖关系”错误

问题描述 投票:0回答:1

我目前有一些使用内置的 unittest 框架编写的测试,当我进行 python manage.py 测试时效果很好测试的位置

但是,我决定(最终)切换到 pytest。我安装了 pytest-playwright (因为我还想创建一些功能测试)以及 pytest-django。剧作家似乎建议使用 pytest 插件,而且从我读到的内容来看……pytest 的 testrunner 与单元测试、测试完全兼容,我就这么做了。

但是......当我尝试使用 pytest 测试位置运行测试时。我收到以下错误:

django.core.exceptions.ImproperlyConfigured: Circular dependency in TEST[DEPENDENCIES]

我尝试了很多方法,但无法让它发挥作用。

一些补充说明:

  • 我当前的单元测试没有使用测试数据库(或真实的数据库)。测试只是检查请求是否可以本质上到达视图。
  • 我尝试卸载 pytest-django,当我运行测试时出现此错误:

.

django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.co...

我 99% 确信我正确地指向了我的测试环境变量。我有一个 pyproject.toml 文件和 pytest.ini 文件,两者的 DJANGO_SETTINGS_MODULE 都指向我的 config.settings.test env。

我注意到,当我安装了 pytest-django 并且收到循环错误时,代码正在我的数据库中循环,并且似乎出现错误(在 django est\utils.py 文件中)。下面是它爆炸的代码:

def dependency_ordered(test_databases, dependencies):
"""
Reorder test_databases into an order that honors the dependencies
described in TEST[DEPENDENCIES].
"""
ordered_test_databases = []
resolved_databases = set()

# Maps db signature to dependencies of all its aliases
dependencies_map = {}

# Check that no database depends on its own alias
for sig, (_, aliases) in test_databases:
    all_deps = set()
    for alias in aliases:
        all_deps.update(dependencies.get(alias, []))
    if not all_deps.isdisjoint(aliases):
        raise ImproperlyConfigured(
            "Circular dependency: databases %r depend on each other, "
            "but are aliases." % aliases
        )
    dependencies_map[sig] = all_deps

while test_databases:
    changed = False
    deferred = []

    # Try to find a DB that has all its dependencies met
    for signature, (db_name, aliases) in test_databases:
        print("db", signature)

        if dependencies_map[signature].issubset(resolved_databases):
            resolved_databases.update(aliases)
            ordered_test_databases.append((signature, (db_name, aliases)))
            changed = True
        else:
            deferred.append((signature, (db_name, aliases)))

    if not changed:
        raise ImproperlyConfigured("Circular dependency in TEST[DEPENDENCIES]")
    test_databases = deferred
return ordered_test_databases

奇怪的是...它似乎没有循环遍历我的“默认”数据库...我不知道为什么...但无论如何我什至不需要数据库来进行测试,所以不确定为什么甚至会卡在这里...

我还尝试在最后添加命令标志 --no-migrations 来不启动测试数据库,但这并没有改变任何东西:(

感谢任何帮助!

谢谢您!

python pytest python-unittest playwright pytest-django
1个回答
0
投票

我找到原因了!

我的 config.settings.base 文件中有多个数据库。其中只有 1 个是本地的,其他的是远程的(这对于我的测试来说不是必需的)。

我的 config.settings.test 文件继承了 .base 文件。这些数据库一直存在。我上面提到的那个错误在所有这些远程数据库上都被捕获(但不是我的本地数据库)。

我最终所做的是将我需要的本地数据库信息移动到测试文件中,基本上覆盖了所有其他不需要的信息,并且它起作用了!

© www.soinside.com 2019 - 2024. All rights reserved.