gpt4 book ai didi

python - 测试。使用堆叠参数化装饰器时定义预期结果的最佳方法?

转载 作者:行者123 更新时间:2023-12-04 16:45:17 24 4
gpt4 key购买 nike

我有两个相似的测试用例,每个测试用例都有超过 100 行代码为测试创建辅助对象,这些行非常相似,事实上,测试设置之间只有 2 行不同,我不想摆脱的代码重复。我认为多重参数化可能会帮助我完成这项任务。使用多重参数化,我可以将设置组合在一个中,实际上为测试提供更好的条件。 Bun 当每个组合会产生不同的结果时,当使用多个参数化时,我无法确定指定预期结果的最佳方法是什么?

考虑这个测试用例

@pytest.mark.parametrize('country', ['US', 'DE', 'FR', 'IT'])
@pytest.mark.parametrize('number', ['12345', '54321'])
def test_correct_record_is_selected_for_number(country, number):
# 100 line long setup of different objects.
record = get_record(country, number)
assert record = expected_record

我希望对于 (country, number) get_record 函数的不同组合将返回不同的结果,而我认为提供预期结果的唯一方法是在测试本身中重新实现 get_record 功能逻辑的一部分,以便根据提供的 countrynumber 确定期望的结果,这我觉得不对。

有没有办法很好地为堆叠的parametrize 装饰器指定预期的输出?或者我最好将设置代码移动到多个不同的装置并将其保留为 2 个使用不同设置装置的单独测试?

最佳答案

通常我将结果放在一个单独的装置中,该装置根据其他参数选择预期值。示例:

expected_records = {'US': {'12345': 'fizz', '54321': 'buzz'}, 'DE': ...}


@pytest.fixture
def expected_record(request):
country = request.node.funcargs['country']
number = request.node.funcargs['number']
return expected_records.get(country, dict()).get(number, None)


@pytest.mark.parametrize('country', ['US', 'DE', 'FR', 'IT'])
@pytest.mark.parametrize('number', ['12345', '54321'])
def test_correct_record_is_selected_for_number(country, number, expected_record):
record = get_record(country, number)
assert record == expected_record

然而,实际上数据很少硬编码在脚本中,所以expected_record的逻辑通常是数据驱动的,例如:

@pytest.fixture
def expected_record(request):
country = request.node.funcargs['country']
number = request.node.funcargs['number']
file = pathlib.Path(request.config.rootdir, 'data', country).with_suffix('.json') # data/DE.json
data = json.loads(file.read_text()) # {12345: "fizz", 54321: "buzz"}
return data[number]

关于python - 测试。使用堆叠参数化装饰器时定义预期结果的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61285578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com