gpt4 book ai didi

Python Pytest 解压 fixture

转载 作者:行者123 更新时间:2023-11-28 20:50:09 24 4
gpt4 key购买 nike

我有一个固定装置,可以在测试期间创建项目列表。我想要另一个用第一个生成的值参数化的 fixture 。

示例代码

import random
import pytest

@pytest.fixture
def values():
return [random.randint(0, 100) for _ in range(10)]


@pytest.fixture
def value(request):
return request.param


@pytest.mark.parametrize("value", params=values):
def test_function(value):
assert value > 0

上面代码的问题是 values 是一个函数而不是一个列表。我做了很多挖掘,但没有找到任何方法来解压 fixture 以用它对另一个 fixture 进行参数化。

我知道我可以传递 values fixture 并在测试中对其进行迭代,但这不是一个好的解决方案,因为我想查看哪些值导致测试失败。

我也对替代解决方案持开放态度,例如,如果可以从已开始的测试运行子测试。

最佳答案

这似乎是对fixture的概念及其与参数概念的区别的误解。

Pytest 有两个主要阶段:

  • 收集阶段,目标是创建要运行的测试“节点”列表。一个测试“节点”对应一个测试id,即每个参数一个值。在此阶段,不执行固定装置,仅读取装饰器标记(包含参数)。因此只有在装饰器中声明的参数可以影响这个阶段。

  • 每个测试节点运行的执行阶段。在运行之前,所有尚未设置的必需灯具都已设置。因此 fixture 函数在这个阶段执行,并且只在这个阶段执行。 他们的结果不能修改前一阶段已经完成的测试列表。(换句话说,不能通过fixture动态添加新的测试节点)。

在您的示例中,您希望 fixture 设置(阶段 B)的结果更改要创建的测试列表(阶段 A):这在设计上是不可能的。您必须在其他地方创建此列表,例如在 pytest init hook 中在conftest.py或者简单地作为任何测试模块中的共享变量,并在测试或 fixture 的参数中引用它。

另请参阅这个非常相似的问题:Parametrizing tests depending of also parametrized values in pytest

注意补充hoefling's comment to your question您现在可以在参数列表中使用参数化 fixture :我已在我的 pytest-cases 中添加了此功能插件,用于评估,以便我们最终可以建议将其合并到 pytest 中(参见 this discussion,所以请毫不犹豫地提供反馈!)。但不幸的是,出于上述根本原因,这并不能解决您在这篇文章中描述的确切问题。

关于Python Pytest 解压 fixture ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50231627/

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