为什么Pytest进行了固定参数的嵌套循环

JafetVoltron:

使用Pytest,我想编写一个测试函数,该函数在多个灯具作为参数。每个灯具有几个参数。

例如,在test_demo.py是一个函数test_squared_is_less_than_10,是以固定装置,negative_integerpositive_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

“ constexpr if”与“ if”进行了优化-为什么需要“ constexpr”?

为什么在for循环中进行了一些更改后,键的值没有更改

针对循环python进行了优化

如果对appSettings条目进行了参数化,Web.config的预期内容是什么?

尽管在defaultProps中进行了设置,为什么子项prop仍未定义?

当我进行了看似正确的设置时,无效的BACKEND错误-为什么?

为什么gcc使用-O0进行了一些优化

为什么在这里对c ++输入文件流进行了两次检查?

为什么我突然在推送中进行了合并提交?

汇编:如果push命令已经进行了减法,为什么还要减去esp?

为什么在下载Ubuntu ISO时进行了重定向?

为什么请求在反应中进行了两次?

for-in循环进行了太远,展开时发现“ nil”

git:合并之前我进行了什么提交?

尽管进行了配置,为什么 NuGet 仍使用 %APPDATA%\Roaming\packages 作为存储库文件夹?

为什么助手即使进行了conv.close仍然仍然显示格式错误的响应?

如果默认情况下对整数进行了符号签名,为什么signed关键字存在?

为什么<form action =“ index.html”>在Google Chrome中的<form action =“ about:blank”>上进行了更改?

深度嵌套嵌套的iterable(或为iterables进行了改进的itertools.tee)

为什么尽管Debug进行了调试,但Release版本却没有构建,而仅对使用相同源文件的项目之一进行构建?

Rust优化器为什么不删除那些无用的指令(在Godbolt编译器资源管理器上进行了测试)?

为什么 Internet Explorer 9 需要在安装过程中关闭(这些)其他程序,并且对 Firefox 进行了任何更改?

为什么Visual Studio 2017坚持认为我在其他地方未打开的文件已在编辑器外部进行了修改?

为什么在CefSharp中的网站尽管在主UI框架的构造器中进行了初始化,但仍未预加载?

当我已经为另一个函数进行了计算时,为什么不能将这些计算调用到我的构建中

Java:针对未知数组大小的for循环进行了增强

SAS:即使进行了更改,还是陷入了循环?有指针吗?

确保React状态已针对游戏循环进行了更新

如何检查电子邮件是否已在Firebase中使用参数进行了验证?