🐞

Hypothesisで自分で作ったクラスでストラテジーを作る

2022/07/03に公開

たとえばトランプのカードを表す Card クラスが次のように定義されていたとする。

from enum import Enum

class Suit(Enum):
    CLUB = 1
    DIAMOND = 2
    HEART = 3
    SPADE = 4

class Card(Enum):
    def __init__(self, suit: Suit, num: int):
        self.suit = suit
        self.num = int

    def __str__(self):
        return f"Card({self.suit}, {self.num})"

@composite でストラテジーを作る

新しいストラテジーを作れば @given に渡すときにスッキリするので、 @composite で作ってみる。

@composite
def card(draw):
    s = draw(sampled_from(Suit))
    n = draw(sampled_from(range(1, 14)))
    return Card(s, n)

@given(card())
def test_card(c):
    # cardを使ってテスト

ここで hypothesis.strategy.sampled_from はEnumでも使えることに注意。

sampled_from supports ordered collections, as well as Enum objects. Flag objects may also generate any combination of their members.

builds を使う

上くらいの例だと、わざわざ @composite で新規にストラテジーを作らずとも、 builds を使って直接 @given にわたすことが出来る。

from hypothesis.strategies import builds, sampled_from

@given(builds(Card, sampled_from(Suit), sampled_from(range(1, 14))))
def test_card(c):
    # cardを使ってテスト

Discussion