扩展Hypothesis以添加对类型注解函数的完全自动测试
项目描述
hypothesis-auto 是 Hypothesis 项目的扩展,它能够为类型注解函数提供完全自动的测试。
关键特性
- 类型注解驱动:利用你函数现有的类型注解自动构建数十个测试用例。
- 低门槛:以可能最低的门槛开始使用基于属性的测试。只需运行
auto_test(FUNCTION)
即可运行数十个测试。 - pytest兼容:与Hypothesis本身一样,hypothesis-auto内置了对流行的 pytest 测试框架的兼容性。这意味着你可以通过一行代码将自动生成的测试用例转换为单个pytest测试用例。
- 可扩展:当你发现自己需要自定义auto_test测试用例时,可以轻松利用包括按参数自定义策略在内的所有 Hypothesis 功能。
安装
要开始使用 - 将 hypothesis-auto
安装到你的项目虚拟环境中
pip3 install hypothesis-auto
或
poetry add hypothesis-auto
或
pipenv install hypothesis-auto
使用示例
!!! 注意 在旧的示例中,您将看到以 _
前缀的参数,例如 _auto_verify=
。这样做是为了避免与现有函数参数冲突。根据社区反馈,项目已切换到 _
后缀,例如 auto_verify_=
,以降低冲突的可能性,同时避免将它们视为私有参数的暗示。
框架独立的使用
基本 auto_test
使用
from hypothesis_auto import auto_test
def add(number_1: int, number_2: int = 1) -> int:
return number_1 + number_2
auto_test(add) # 50 property based scenarios are generated and ran against add
auto_test(add, auto_runs_=1_000) # Let's make that 1,000
添加允许的异常
from hypothesis_auto import auto_test
def divide(number_1: int, number_2: int) -> int:
return number_1 / number_2
auto_test(divide)
-> 1012 raise the_error_hypothesis_found
1013
1014 for attrib in dir(test):
<ipython-input-2-65a3aa66e9f9> in divide(number_1, number_2)
1 def divide(number_1: int, number_2: int) -> int:
----> 2 return number_1 / number_2
3
0/0
ZeroDivisionError: division by zero
auto_test(divide, auto_allow_exceptions_=(ZeroDivisionError, ))
使用自定义验证方法与 auto_test
from hypothesis_auto import Scenario, auto_test
def add(number_1: int, number_2: int = 1) -> int:
return number_1 + number_2
def my_custom_verifier(scenario: Scenario):
if scenario.kwargs["number_1"] > 0 and scenario.kwargs["number_2"] > 0:
assert scenario.result > scenario.kwargs["number_1"]
assert scenario.result > scenario.kwargs["number_2"]
elif scenario.kwargs["number_1"] < 0 and scenario.kwargs["number_2"] < 0:
assert scenario.result < scenario.kwargs["number_1"]
assert scenario.result < scenario.kwargs["number_2"]
else:
assert scenario.result >= min(scenario.kwargs.values())
assert scenario.result <= max(scenario.kwargs.values())
auto_test(add, auto_verify_=my_custom_verifier)
自定义验证方法应接受单个 场景 并抛出异常以表示错误。
有关可传递给 auto_test 的完整参数集,请参阅其 API 参考文档。
pytest 使用
使用 auto_pytest_magic
自动生成数十个 pytest 测试用例
from hypothesis_auto import auto_pytest_magic
def add(number_1: int, number_2: int = 1) -> int:
return number_1 + number_2
auto_pytest_magic(add)
使用 auto_pytest
在临时目录中运行数十个测试用例
from hypothesis_auto import auto_pytest
def add(number_1: int, number_2: int = 1) -> int:
return number_1 + number_2
@auto_pytest()
def test_add(test_case, tmpdir):
tmpdir.mkdir().chdir()
test_case()
使用 auto_pytest_magic
与自定义验证方法
from hypothesis_auto import Scenario, auto_pytest
def add(number_1: int, number_2: int = 1) -> int:
return number_1 + number_2
def my_custom_verifier(scenario: Scenario):
if scenario.kwargs["number_1"] > 0 and scenario.kwargs["number_2"] > 0:
assert scenario.result > scenario.kwargs["number_1"]
assert scenario.result > scenario.kwargs["number_2"]
elif scenario.kwargs["number_1"] < 0 and scenario.kwargs["number_2"] < 0:
assert scenario.result < scenario.kwargs["number_1"]
assert scenario.result < scenario.kwargs["number_2"]
else:
assert scenario.result >= min(scenario.kwargs.values())
assert scenario.result <= max(scenario.kwargs.values())
auto_pytest_magic(add, auto_verify_=my_custom_verifier)
自定义验证方法应接受单个 场景 并抛出异常以表示错误。
有关 pytest 集成的完整 API 参考,请参阅 API 参考文档。
为什么创建 hypothesis-auto?
我希望以无/低阻力方式开始在项目中整合属性测试。这样的解决方案还鼓励使用类型提示,对我来说是双赢。
希望你也觉得 hypothesis-auto
有用!
~Timothy Crosley