繁体   English   中英

如何使用 pytest 为类范围夹具制造工厂?

[英]How can I make a factory for class-scope fixtures with pytest?

我有一组都做同样事情的夹具,打开一个 json 文件并使其可用于测试 class。

@pytest.fixture(scope="class")
def category_params(request):
    base_path = os.path.abspath(..)
    path = os.path.join(base_path, "data/category_params.json")
    with open(path, "r") as fp:
        category_params = json.load(f)
    return category_params

我为测试域中的所有不同测试类别重复此设置。 这似乎是我应该写一个 function 的东西,但我不确定如何使用 pytest 来完成它。 我相信我应该问如何制作夹具工厂,即制作其他夹具对象的 pytest 夹具 object。

(警告:我没有测试这段代码。)

我认为这样的事情应该有效。

def make_fixture_for(data_file):
    @pytest.fixture(scope="class")
    def params_fixture(request):
        base_path = os.path.abspath(..)
        path = os.path.join(base_path, data_file)
        with open(path, "r") as fp:
            return json.load(fp)
    return params_fixture

foo_params = make_fixture_for("data/foo.json")
bar_params = make_fixture_for("data/bar.json")

这在模块的顶层定义了夹具功能, pytest期望它们,但以一种紧凑的方式这样做。

这可以在一个循环中通过数据文件名和一些globals来完成,以将它们放入模块的顶级上下文中,但这感觉就像是难以理解的魔法。 上面的代码非常简单。

也许pytest不喜欢内部有很多同名的夹具函数; 然后在 function 上设置.__name__可能有帮助,也可能没有; 再次,我没有测试这段代码,我不记得pytest的夹具发现过程的细节。

您可以参数化您的夹具function 这意味着每个测试都可以给它一个不同的 JSON 文件来加载:

import pytest
import os
import json


@pytest.fixture(scope="class")
def json_content(request):
    base_path = os.path.abspath(..)
    path = os.path.join(base_path, request.param)

    with open(path, "r") as fp:
        data = json.load(fp)

    return data


@pytest.mark.parametrize("json_content", ["abc.json"], indirect=True)
def test_a(json_content):
    print(json_content)


@pytest.mark.parametrize("json_content", ["xyz.json"], indirect=True)
def test_b(json_content):
    print(json_content)

注意:测试示例未显示每个 class 使用相同的夹具,但这不是演示参数化所必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM