予想される動作が似ているさまざまなオブジェクトが多数あるライブラリがあるため、それらに対して同様のテストを実行したいのですが、必ずしも同じテストを実行する必要はありません。
具体的には、いくつかの並べ替え関数と、並べ替え関数が実際に並べ替えられるかどうかを確認するためのテストがあるとします。一部の並べ替え関数は、一部の入力で機能することを目的としていますが、他の入力では機能しません。
以下のコードに近いものを書きたいと思います。ただし、noseは、テストが失敗した場所と入力内容を正確に教えてくれません。case2のsort2でcheck_sortが失敗した場合、それを確認することはできません。
def check_sort(sortalg, vals):
assert sortalg(vals) == sort(vals)
def test_sorts():
case1 = [1,3,2]
case2 = [2,31,1]
check_sort(sort1, case1)
for c in [case1, case2]:
check_sort(sort2, c)
check_sortにデコレータを追加するだけで、ネストされたテストであることをnoseに伝えることができるようにしたいと思います。何かのようなもの
@nested_test
def check_sort(sortalg, vals):
assert sortalg(vals) == sort(vals)
呼び出されると、自分自身をnoseに登録し、失敗した場合は入力を報告するという考え方です。
pytestはpytest.mark.parameterizedを提供しているように見えますが、それは私にはかなり厄介なようです。関数の上にあるすべての引数を1つの場所に配置する必要があるため、テストで繰り返し呼び出すことはできません。また、これが複数のレベルのネストをサポートしているとは思いません。
Noseはテストジェネレーターも提供します。これはより近いように見えますが、それでも私が望むほど明確ではありません。