物語:
現在、次のルールを持つ整数のリストのリストを期待するテスト対象の関数があります。
- サブリストの数 ( と呼びましょう
N
) は 1 から 50 までです - サブリスト内の値の数は、すべてのサブリストで同じ (長方形の形式) であり、>= 0 および <= 5 である必要があります
- サブリスト内の値は、サブリストの総数以上にすることはできません。つまり、サブリスト内の各値は整数 >= 0 および <
N
有効な入力の例:
[[0]]
[[2, 1], [2, 0], [3, 1], [1, 0]]
[[1], [0]]
無効な入力の例:
[[2]] # 2 is more than N=1 (total number of sublists)
[[0, 1], [2, 0]] # 2 is equal to N=2 (total number of sublists)
私はプロパティベースのテストでそれにアプローチし、hypothesis
ライブラリでさまざまな有効な入力を生成しようとしていて、頭をラップしようとしてlists()
いintegers()
ますが、機能させることはできません:
- 条件 #1 は
lists()
andmin_size
およびmax_size
引数を使用して簡単にアプローチできます - 条件 #2 は以下でカバーされています
Chaining strategies together
- 条件#3は私が苦労しているものです-
rectangle_lists
上記の例を使用すると、内部の「親」リストの長さへの参照がありませんintegers()
質問:
サブリスト内の整数値をサブリストの総数よりも少なくするにはどうすればよいですか?
私の試みのいくつか:
from hypothesis import given
from hypothesis.strategies import lists, integers
@given(lists(lists(integers(min_value=0, max_value=5), min_size=1, max_size=5), min_size=1, max_size=50))
def test(l):
# ...
これは要件を満たすにはほど遠いものでした。リストは厳密には長方形ではなく、生成された整数値は生成されたリストのサイズを超える可能性があります。
from hypothesis import given
from hypothesis.strategies import lists, integers
@given(integers(min_value=0, max_value=5).flatmap(lambda n: lists(lists(integers(min_value=1, max_value=5), min_size=n, max_size=n), min_size=1, max_size=50)))
def test(l):
# ...
ここで、要件 #1 と #2 は満たされていましたが、整数値はリストのサイズよりも大きくなる可能性があります。要件 #3 は満たされていません。