如何使用 pytest 为 class-scope fixtures 创建一个工厂?
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
我为测试域中的所有不同测试类别重复此设置。这似乎是我应该为其编写单个函数的东西,但我不确定如何使用 pytest 来完成它。我相信我应该问如何制作夹具工厂,这是一个制作其他夹具对象的 pytest 夹具对象。
(警告:我没有测试这段代码。)
我认为这样的事情应该有效。
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
不喜欢很多内部同名的 fixture 函数;然后在功能上设置 .__name__
可能有帮助,也可能没有帮助;再一次,我没有测试这段代码,我不记得 pytest
的 fixture 发现过程的细节。
您可以 parametrize your fixture 函数,这意味着每个测试都可以给它一个不同的 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 使用相同的夹具,但这不是演示参数化所必需的。
我有一组装置都做同样的事情,打开一个 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
我为测试域中的所有不同测试类别重复此设置。这似乎是我应该为其编写单个函数的东西,但我不确定如何使用 pytest 来完成它。我相信我应该问如何制作夹具工厂,这是一个制作其他夹具对象的 pytest 夹具对象。
(警告:我没有测试这段代码。)
我认为这样的事情应该有效。
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
不喜欢很多内部同名的 fixture 函数;然后在功能上设置 .__name__
可能有帮助,也可能没有帮助;再一次,我没有测试这段代码,我不记得 pytest
的 fixture 发现过程的细节。
您可以 parametrize your fixture 函数,这意味着每个测试都可以给它一个不同的 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 使用相同的夹具,但这不是演示参数化所必需的。