🐞
Hypothesisで自分で作ったクラスでストラテジーを作る
たとえばトランプのカードを表す 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 asEnum
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