我正在构建 API,允许用户发送输入数据以生成可打印文档。
最重要的是,我需要允许管理员用户为这些文档定义/调整模板(HTML),用户在其中定义布局和逻辑。管理员用户使用定制的 Django Admin 来维护这些文档模板。
要求之一是管理员用户能够测试他们的模板:(1) 从 Django Admin 生成并下载文档以获取一些测试输入数据,(2) 运行测试来评估文档是否具有多个测试用例的正确内容.
用户可以为其模板定义测试用例:输入数据和预期输出的组合。他们还可以选择测试用例并使用自定义 Django 管理操作,他们可以为这些选定的测试用例运行测试(使用 pytest)。
Pytest 使用测试输入数据,呈现输出文档并将其与用户定义的基准输出进行比较。 pytest 的标准输出应该写入文本文件,然后包含在自定义 Django 管理操作的响应中(通过浏览器下载)。
我在 Django admin 背后的最初实现是使用 pytest.main() 功能。
...
import sys
from io import StringIO
...
import pytest
class TestCaseAdmin(admin.ModelAdmin):
...
def run_selected_test_cases(self, request, queryset):
sys.stdout = StringIO()
pytest.main([
"tests/functional/test_user_cases.py",
"-vv",
])
result = sys.stdout.getvalue()
response = HttpResponse(result, content_type="text/plain")
response["Content-Disposition"] = f"attachment; filename={filename}"
return response
上述实现将运行 test_user_cases.py 中定义的测试并使用 pytest stdout 下载文本文件。 然而完成此操作后,pytest 崩溃并出现错误:
RuntimeError: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.
即使 test_user_cases.py 中的测试函数仅执行简单的操作,也会抛出此错误
assert True
如果我在 CLI 之外运行相同的测试,则不会抛出错误。
有谁知道为什么 pytest / pytest-django 在这种情况下崩溃?
使用
subprocess
的替代实现:
import subprocess
...
def run_selected_test_cases(self, request, queryset):
result = subprocess.run(
[
"python3",
"-m",
"pytest",
"tests/functional/test_user_cases.py",
"-vv",
],
capture_output=True,
text=True,
)
response = HttpResponse(result, content_type="text/plain")
response["Content-Disposition"] = f"attachment; filename={filename}"
return response
不会抛出上面的错误,但是执行速度慢很多。
任何人都可以看到使用 pytest.main 函数时明显的错误吗?