为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUH函数 2023-09-12 17:14:33
使用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,所以我的术语可能有点偏差。

查看完整回答
反对 回复 2023-09-12
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信