使用Python测试框架hypothesis,我想实现一个相当复杂的测试策略组合: 1.我想测试创建s由唯一字符集组成的字符串。2. 每个示例我都想运行一个函数func(s: str, n: int) -> Tuple[str, int],该函数接受一个字符串s和一个整数n作为参数。在这里,我想让整数也由假设填充,但 的最大值n应该是len(s), 的长度s。我尝试过使用flatmap,但还没有充分理解它,无法让它发挥作用。这是我尝试过的最小示例:from typing import Tuplefrom hypothesis import givenfrom hypothesis.strategies import text, integersdef 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工作原理有一些误解,但我自己无法弄清楚。我需要做什么才能正确定义我的测试策略?
1 回答
扬帆大鱼
TA贡献1799条经验 获得超9个赞
使用,您不能组合两个依赖策略 - 这可以使用装饰器来flatmap完成:composite
@composite
def 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,所以我的术语可能有点偏差。
添加回答
举报
0/150
提交
取消