首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Pytest在fixture参数上执行嵌套循环

为什么Pytest在fixture参数上执行嵌套循环
EN

Stack Overflow用户
提问于 2020-03-27 18:06:30
回答 1查看 1.1K关注 0票数 4

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

例如,在test_demo.py中有一个函数test_squared_is_less_than_10,它将fixture、negative_integerpositive_integer作为参数,然后检查fixture参数的平方是否小于10。

代码语言:javascript
复制
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]

然而,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"时的输出

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-27 18:46:54

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

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60883812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档