当使用假设测试我的发热模型时,我不知道如何处理自定义验证器抛出的ValidationError。这是一个很小的例子,说明了这个问题:
# model
from pydantic import BaseModel, validator
class SimpleModel(BaseModel):
a: int
b: int
@validator('b')
def check_numbers(cls, b, values):
if b*values['a'] < 0:
raise ValueError('a*b > 0 does not hold')
return b
# test
from hypothesis import given, strategies as st
@given(st.builds(SimpleModel))
def test_simple_model(instance: SimpleModel):
assert type(instance.b) == int到目前为止,我已经编写了自定义假设搜索策略,只生成有效的实例。但是对于更复杂的模型来说,这变得非常繁琐,所以在我看来,必须有一种更聪明的方法来“使用”ValidationError。在测试函数之前也会引发错误,因此我无法在测试函数中处理它。
我需要一种生成实例的可能性,即跳过引发ValidationError的实例。
发布于 2022-09-27 09:50:07
在使用了更多的假设功能之后,我提出了这个方法,它使用了composite策略和assume。使用复合,我创建了一个自定义策略,然后可以在given装饰器中使用。在假设内部,当抛出ValidationError时,用于告诉假设示例是不好的,应该跳过。
from pydantic import ValidationError
from hypothesis import given, assume, strategies as st
@st.composite
def simple_model_strategy(draw) -> SimpleModel:
try:
simple_model = draw(st.builds(SimpleModel))
except ValidationError:
assume(False)
return simple_model
@given(simple_model_strategy())
def test_simple_model(instance: SimpleModel):
assert type(instance.b) == int备注:
https://stackoverflow.com/questions/73865567
复制相似问题