使用平面图时获取“LazyStrategy”对象而不是假设中的整数

使用Python测试框架hypothesis,我想实现一个相当复杂的测试策略组合: 1.我想测试创建s由唯一字符集组成的字符串。2. 每个示例我都想运行一个函数func(s: str, n: int) -> Tuple[str, int],该函数接受一个字符串s和一个整数n作为参数。在这里,我想让整数也由假设填充,但 的最大值n应该是len(s), 的长度s。我尝试过使用flatmap,但还没有充分理解它,无法让它发挥作用。这是我尝试过的最小示例:


from typing import Tuple


from hypothesis import given

from hypothesis.strategies import text, integers



def func(s: str, n: int) -> Tuple[str, int]:

    for i in range(n):

        pass  # I do something here on s, which is not relevant to the question


    return (s, n)


# 1. Create the strategy for unique character strings:

unique_char_str = text().map(lambda s: "".join(set(s)))


#2. Create the complex strategy with flatmap:

confined_tuple_str_int = unique_char_str.flatmap(

    lambda s: func(s, integers(min_value=0, max_value=len(s)))

)

当我尝试使用这个新策略时,



@given(tup=confined_tuple_str_int)

def test_foo(tup):

    pass

我的测试失败了,声称


test_foo - 类型错误:“LazyStrategy”对象无法解释为整数


在行 中,for i in range(n):in不是整数,而是对象。funcnLazyStrategy


这告诉我,我对flatmap工作原理有一些误解,但我自己无法弄清楚。


我需要做什么才能正确定义我的测试策略?


HUH函数
浏览 64回答 1
1回答

扬帆大鱼

使用,您不能组合两个依赖策略 - 这可以使用装饰器来flatmap完成:composite@compositedef confined_tuple_str_int(draw, elements=text()):    s = draw(lists(characters(), unique=True).map("".join))    i = draw(integers(min_value=0, max_value=len(s)))    return func(s, i)@given(confined_tuple_str_int())def test_foo(tup):    print(tup)该draw参数允许您获取策略的绘制值(例如示例) - 在本例中是唯一字符串 - 并使用它来创建依赖于该值的策略 - 在本例中是依赖于字符串长度的整数策略。在从该策略中绘制示例之后,复合装饰器从这些示例值创建一个新策略并返回它。免责声明:我是新手hypothesis,所以我的术语可能有点偏差。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python