本文へスキップ
274 views
B!0X

Pythonのproperty based testingライブラリhypothesisの使い方

pythonのproperty-based-testingライブラリhypothesisの使い方

基本

strategies

  • pbtに必要な値の生成を担う
  • 他のフレームワークでいうgenみたいなもの

strategies

dictionaryやクラスなどの複雑な値のstrategiesを作りたい

  • buildsメソッドを使う
  • buildにはcallableなtargetオブジェクトと、そのcallに必要な値のstrategiesを渡す
def make_dict(a, b):
    return {"a": a, "b": b}

class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b

@given(builds(make_dict, text(), floats()))
def test_dict(d):
    # {"a": str, "b": float} 型の値がdに渡って来てそれを用いてテストできる
    ...

@given(builds(A, text(), floats()))
def test_class(a):
    # A(str, float)がaに渡ってくる
    ...
  • targetのにtype hintを与えてやると引数になるstrategiesを渡さなくても自動で推測して値を生成してくれる
def make_dict(a: str, b: float):
    return {"a": a, "b": b}

class A:
    def __init__(self, a: str, b: float):
        self.a = a
        self.b = b

@given(builds(make_dict))
def test_dict(d):
    # {"a": str, "b": float} 型の値がdに渡って来てそれを用いてテストできる
    ...

@given(builds(A))
def test_class(a):
    # A(str, float)がaに渡ってくる
    ...

pytestとの併用

fixtureを使用しつつstrategiesをgiveする

  • pytestではfixtureと同じ名前の引数を定義しておけばそれが勝手に引数に渡ってくる
import pytest

@pytest.fixture
def some_int():
    yield 1

def test_int(some_int):
    print(some_int) # テストを実行すると`1`が出力
  • hypothesisのgivenと一緒に使用するときはgivenでどの引数に値を渡すかを指定するfixtureと併用できる
import pytest
from hypothesis import given
from hypothesis.strategies import text

@pytest.fixture
def some_int():
    yield 1

@given(some_str=text())
def test_int(some_int, some_str):
    print(some_int) # テストを実行すると`1`が出力
    print(some_str) # ランダムなstringが出力される

関連事例

  • データ分析支援

    事例:過去実績を提案に活用する分析の仕組み

    広告代理店との取り組みです。同社は過去実績の示唆を次の提案へ反映し、結果をどのように予測したか、その背景まで提案先のクライアントへ説明できるようになりました。KDOT は案ごとの見込みと判断材料を比較できる仕組みを業務アプリとして実装しました。さらに業務アプリの中核となる処理ロジックと機械学習モデルについて、特許手続きを担う弁理士が技術の新規性や工夫を検討するための資料を作成しました。その後この発明には特許が付与されました。

  • データ基盤構築 / 技術顧問(技術企業向け)

    事例:効果検証の分析処理基盤

    効果検証を提供する分析会社との取り組みです。同社は分析者の人数に比例してしか売上と利益を伸ばせない事業の形を、効果検証をプロダクトとして提供することで変革しようとしていました。手法とモデルは同社のまま、社内では開発できなかった、データと機械学習の重い推定を製品として動かす仕組みの開発を、開発支援会社の KDOT に任せました。推定を案件ごとの手作業ではなくシステムで実行できるようになったことで、同社は人数に比例しない形で売上と利益を伸ばすことを目指せるようになりました。

開発の相談先をお探しですか。

この記事に関わることについてご相談がある方はお問い合わせください。

KDOT についてお問い合わせ