在 Django Admin 自定义操作后面运行 pytest

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

我正在构建 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 函数时明显的错误吗?

django subprocess pytest stdout pytest-django
1个回答
0
投票

我在此线程中找到了问题的答案:

流程控制和失败:不允许数据库访问,使用“django_db”....错误

pytest-django
激活数据库块,测试完成后不会停用。需要明确停用它。

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