gpt4 book ai didi

python - 为什么 Pytest 对 fixture 参数执行嵌套循环

转载 作者:行者123 更新时间:2023-12-03 23:08:16 24 4
gpt4 key购买 nike

使用 Pytest,我想编写一个测试函数,它接受多个装置作为参数。每个灯具都有几个参数。

例如,在 test_demo.py 中是一个函数 test_squared_is_less_than_10需要固定装置,negative_integerpositive_integer作为参数,然后检查 fixture 参数的平方是否小于 10。

import pytest

@pytest.fixture(params=[-1, -2, -3])
def negative_integer(request):
return request.param

@pytest.fixture(params=[1, 2, 3])
def positive_integer(request):
return request.param

def test_squared_is_less_than_10(negative_integer, positive_integer):
assert negative_integer ** 2 < 10
assert positive_integer ** 2 < 10

我期望当我在终端中运行 pytest 命令时,总共应该执行 6 个测试,即 [-1, -2, -3]positive_integer[1, 2, 3]negative_integer .

但是,pytest 似乎执行嵌套循环类型的迭代,以便执行 9 个测试
[(-1, 1), (-1, 2), (-1, 3), (-2, 1), (-2, 2), (-2, 3), (-3, 1), (-3, 2), (-3, 3)] .

这是我运行时的输出 pytest -v -k "test_squared_is_less" :
test_squared_is_less_than_10[-1-1] PASSED                                                              
test_squared_is_less_than_10[-1-2] PASSED
test_squared_is_less_than_10[-1-3] PASSED
test_squared_is_less_than_10[-2-1] PASSED
test_squared_is_less_than_10[-2-2] PASSED
test_squared_is_less_than_10[-2-3] PASSED
test_squared_is_less_than_10[-3-1] PASSED
test_squared_is_less_than_10[-3-2] PASSED
test_squared_is_less_than_10[-3-3] PASSED

这是不可取的,因为我只想执行 6 个测试而不是 9 个。如果参数较多(比如 20 个),pytest 将执行 400 个测试而不是所需的 40 个测试,这会浪费计算时间。

我该如何处理这个问题。

P.S:我想避免编写两个单独的测试,例如
test_negative_squared_is_less_than_10(negative_integer)test_positive_squared_is_less_than_10(positive_integer)

最佳答案

您可以通过 @pytest.mark.parametrize 应用非笛卡尔参数化标记。你的代码,重构:

import pytest


neg_params = [-1, -2, -3]

@pytest.fixture(params=neg_params)
def negative_integer(request):
return request.param


pos_params = [1, 2, 3]

@pytest.fixture(params=pos_params)
def positive_integer(request):
return request.param


@pytest.mark.parametrize(
"negative_integer, positive_integer",
zip(neg_params, pos_params),
indirect=True
)
def test_squared_is_less_than_10(negative_integer, positive_integer):
assert negative_integer ** 2 < 10
assert positive_integer ** 2 < 10

关于python - 为什么 Pytest 对 fixture 参数执行嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60883812/

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