Why does Pytest perform a nested loop over fixture parameters(为什么Pytest在装置参数上执行嵌套循环)
问题描述
使用Pytest,我想编写一个测试函数,该函数接受多个fixture作为参数。每个灯具都有几个参数。
例如,在test_demo.py中,有一个函数test_squared_is_less_than_10
,它将fixturenegative_integer
和positive_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个测试,即positive_integer
执行[-1, -2, -3]
,negative_integer
执行[1, 2, 3]
。
[(-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个测试,这是浪费计算时间。
如何处理此问题。
附注:我希望避免编写两个单独的测试,例如
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
这篇关于为什么Pytest在装置参数上执行嵌套循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么Pytest在装置参数上执行嵌套循环


- 使用Heroku上托管的Selenium登录Instagram时,找不到元素';用户名'; 2022-01-01
- python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令 2022-01-01
- 如何将一个类的函数分成多个文件? 2022-01-01
- 如何在 Python 的元组列表中对每个元组中的第一个值求和? 2022-01-01
- padding='same' 转换为 PyTorch padding=# 2022-01-01
- 分析异常:路径不存在:dbfs:/databricks/python/lib/python3.7/site-packages/sampleFolder/data; 2022-01-01
- 沿轴计算直方图 2022-01-01
- pytorch 中的自适应池是如何工作的? 2022-07-12
- 如何在 python3 中将 OrderedDict 转换为常规字典 2022-01-01
- python-m http.server 443--使用SSL? 2022-01-01