gpt4 book ai didi

python - 使用 pytest 进行惰性参数化

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:39 25 4
gpt4 key购买 nike

在 pytest 中参数化测试和固定装置时,pytest 似乎急切地评估所有参数并在开始执行测试之前构建一些测试列表数据结构。

这是两种情况下的问题:

  1. 当您有很多参数值(例如来自生成器)时 - 生成器和测试本身可能运行得很快,但所有这些参数值会占用所有内存
  2. 当使用不同类型的昂贵资源对 fixture 进行参数化时,您只能负担得起同时运行一种资源(例如,因为它们监听相同的端口或类似的东西)

因此我的问题是:是否可以告诉 pytest 即时评估参数(即懒惰地)?

最佳答案

编辑:我的第一 react 是“这正是参数化 fixture 的用途”:函数范围的 fixture 一个在测试节点执行之前调用的惰性值,并通过参数化您可以根据需要预定义尽可能多的变体(例如来自数据库键列表)。

from pytest_cases import fixture_plus

@fixture_plus
def db():
return <todo>

@fixture_plus
@pytest.mark.parametrize("key", [<list_of keys>])
def sample(db, key):
return db.get(key)

def test_foo(sample):
return sample

也就是说,在某些(罕见的)情况下,您仍然需要参数化函数中的惰性值,并且您不希望这些成为参数化 fixture 的变体。对于这些情况,pytest-cases 中现在也有解决方案。 , 与 lazy_value .有了它,您可以在参数值中使用函数,并且只有在执行手头的测试时才会调用这些函数。

这是一个显示两种编码风格的示例(将 use_partial bool 参数切换为 True 以启用另一种选择)

from functools import partial
from random import random

import pytest
from pytest_cases import lazy_value

database = [random() for i in range(10)]

def get_param(i):
return database[i]


def make_param_getter(i, use_partial=False):
if use_partial:
return partial(get_param, i)
else:
def _get_param():
return database[i]

return _get_param

many_lazy_parameters = (make_param_getter(i) for i in range(10))

@pytest.mark.parametrize('a', [lazy_value(f) for f in many_lazy_parameters])
def test_foo(a):
print(a)

请注意,如果您希望自定义测试 ID,lazy_value 也有一个 id 参数。默认是使用函数 __name__,对部分函数的支持是 on the way .

您可以用同样的方式参数化 fixture,但请记住您必须使用 @fixture_plus 而不是 @pytest.fixture。参见 pytest-cases documentation了解详情。

顺便说一下,我是 pytest-cases 的作者 ;)

关于python - 使用 pytest 进行惰性参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54163532/

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