[英]Hypothesis strategies for pydantic nested classes
對於我們的 API,我開始在頂級 pydantic 上使用假設,以便使用自動生成的數據增強測試套件。 我們的協議是分層的,所以我很容易用 pydantic 中的嵌套類來描述它:
from pydantic import BaseModel, Field, conint
from hypothesis import given, strategies as st
class Inner(BaseModel):
start: conint(ge=0, le=9) = Field(description="starting value")
end: conint(ge=0, le=9) = Field(description="it should be greater than start")
class Outer(BaseModel):
inner: Inner = Field(description="I level class")
@given(st.builds(Outer))
def test_shema(schema):
assert schema.inner.start <= schema.inner.end, "Nope!"
test_shema()
一切都按預期工作,但我試圖用一些策略來豐富語義,例如inner.start
和inner.end
之間的規則。 在這個例子中,一個應該更大。
暫定我:
生成不同范圍內的值:
roles = {'inner.start':st.integers(max_value=5), 'inner.end':st.integers(min_value=5)}
@given(st.builds(Outer, **roles))
對於這種方法,我無法在內部數據類中指定字段,這個解決方案根本行不通。 嘗試嵌套字典,點符號。
試探二:像這樣對生成的測試函數進行更正,但僅限於測試函數:
if schema.inner.start >= schema.inner.end:
schema.inner.start ,schema.inner.end = schema.inner.end ,schema.inner.start
這可能是一種有效的方法,但如何將其描述為假設?
那這個呢?
@given(
st.builds(
Outer,
inner=st.builds(
Inner,
start=st.integers(min_value=0, max_value=5),
end=st.integers(min_value=5, max_value=9),
),
)
)
文檔顯示您可以對builds()
的arg
或kwarg
使用策略:
例如
builds(target, integers(), flag=booleans())
將繪制一個整數i
和一個布爾值b
並調用target(i, flag=b)
。
因此,您可以使用builds()
策略來提供inner
kwarg
(pydantic 期望__init__()
中的kwargs
),並使用類似的方法來使用integers()
策略自定義start
和end
。
您似乎需要在場景中同時提供min_value
和max_value
,因為integers()
策略可以在ge
和le
之外生成整數。 我猜這是因為integers()
不知道它的值將用於提供start
和end
字段,這對我來說似乎可以接受。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.