假设装饰器,用于从类型提示中推断出所有策略

hypothesis decorator for inferring all strategies from type hints

Python 模块假设有一个 hypothesis.given 装饰器,它允许为各个参数传递 hypothesis.infer 以从相应的类型提示中导出它们的策略。这可能很乏味,因为必须重复所有参数。这是一个例子:

@given(arg1=infer, arg2=infer, arg3=infer)
def test_something(arg1: int, arg2: bytes, arg3: List[float]) -> None:
    ...

文档建议 infer is not used by default to retain backwards compatibility。 hypothesis 是否已经包含一个装饰器 given_everything_inferred,它简单地假设所有参数为 infer,或者是否容易编写一个?预期用法示例:

@given_everything_inferred
def test_something(arg1: int, arg2: bytes, arg3: List[float]) -> None:
    ...

默认情况下我们不提供此功能,因为它会干扰 Pytest fixtures 之类的东西,并且过渡到自定义策略(例如,仅正整数)现在需要您更改整个装饰器而不是单个参数。

不过,编写自己的代码非常容易:

def given_everything_inferred(func):
    return given(**{n: infer for n in inspect.getfullargspec(func).args})(func)

处理仅关键字参数,或编写允许您传递一些策略并推断其余部分的版本,是 reader (or sponsorship) 的练习。

有一个单独的包可以执行此操作:hypothesis-auto。基本上就是hypothesis_auto.auto_test。它单独集成到 pytest 中。 link 有示例使用。