我目前有一些使用内置的 unittest 框架编写的测试,当我进行 python manage.py 测试时效果很好测试的位置。
但是,我决定(最终)切换到 pytest。我安装了 pytest-playwright (因为我还想创建一些功能测试)以及 pytest-django。剧作家似乎建议使用 pytest 插件,而且从我读到的内容来看……pytest 的 testrunner 与单元测试、测试完全兼容,我就这么做了。
但是......当我尝试使用 pytest 测试位置运行测试时。我收到以下错误:
django.core.exceptions.ImproperlyConfigured: Circular dependency in TEST[DEPENDENCIES]
我尝试了很多方法,但无法让它发挥作用。
一些补充说明:
.
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 来不启动测试数据库,但这并没有改变任何东西:(
感谢任何帮助!
谢谢您!
我找到原因了!
我的 config.settings.base 文件中有多个数据库。其中只有 1 个是本地的,其他的是远程的(这对于我的测试来说不是必需的)。
我的 config.settings.test 文件继承了 .base 文件。这些数据库一直存在。我上面提到的那个错误在所有这些远程数据库上都被捕获(但不是我的本地数据库)。
我最终所做的是将我需要的本地数据库信息移动到测试文件中,基本上覆盖了所有其他不需要的信息,并且它起作用了!