使用Pytest,我想编写一个测试函数,该函数在多个灯具作为参数。每个灯具有几个参数。
例如,在test_demo.py是一个函数test_squared_is_less_than_10
,是以固定装置,negative_integer
和positive_integer
作为参数,然后检查该平方夹具参数的是小于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.更大数目则params的(比方说20),pytest将执行400周的测试,而不是所期望的40次测试,这是计算时间的浪费。
我该如何处理这个问题。
PS:我想避免编写两个独立的测试,如
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句