我最近看了一下假设并像这样使用它:
import hypothesis.strategies as s
from hypothesis import given
@given(s.integers(min_value=-(10 ** 6), max_value=10 ** 6))
def test_factorize(an_integer):
if an_integer == 0:
# This is tested in `test_factorize_zero` and should throw an exception
return
factors = mpu.math.factorize(an_integer)
product = 1
for factor in factors:
product *= factor
assert product == an_integer
这很酷。我看到的主要限制是策略(例如s.integers
),尽管有很多策略,我仍在学习有哪些策略/如何正确使用它们。
给定使用 pydantic 的类型注释类,是否有生成对象的策略?
我的尝试
from typing import Optional
from hypothesis import given
from hypothesis.strategies import from_type
from pydantic import BaseModel
class Adress(BaseModel):
city: str
street: str
house_number: int
postal_code: int
class Person(BaseModel):
prename: str
middlename: Optional[str]
lastname: str
address: Adress
@given(from_type(Person))
def test_me(person: Person):
assert isinstance(person, Person)
当我将其另存为test_foo.py
并执行pytest
时,我得到:
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― test_me ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
@given(from_type(Person))
> def test_me(person: Person):
test_foo.py:20:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
> ???
E pydantic.error_wrappers.ValidationError: 3 validation errors for Person
E prename
E field required (type=value_error.missing)
E lastname
E field required (type=value_error.missing)
E address
E field required (type=value_error.missing)
pydantic/main.py:283: ValidationError
---------------------------------------------------------------- Hypothesis ----------------------------------------------------------------
You can add @seed(42732672939050403878146949573829059697) to this test or run pytest with --hypothesis-seed=42732672939050403878146949573829059697 to reproduce this failure.
如果假设产生一个没有中间名的人和一个有中间名的人,我会特别喜欢。