簡體   English   中英

pydantic 嵌套類的假設策略

[英]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.startinner.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()argkwarg使用策略:

例如builds(target, integers(), flag=booleans())將繪制一個整數i和一個布爾值b並調用target(i, flag=b)

因此,您可以使用builds()策略來提供inner kwarg (pydantic 期望__init__()中的kwargs ),並使用類似的方法來使用integers()策略自定義startend

您似乎需要在場景中同時提供min_valuemax_value ,因為integers()策略可以在gele之外生成整數。 我猜這是因為integers()不知道它的值將用於提供startend字段,這對我來說似乎可以接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM