我有一个库,其中包含一堆具有相似预期行为的不同对象,因此我想对它们运行类似的测试,但不一定对它们进行相同的测试。
具体来说,假设我有一些排序功能,以及检查排序功能是否实际排序的测试。某些排序功能旨在处理某些输入,但不适用于其他输入。
我想写一些接近下面代码的东西。但是,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 添加一个装饰器来告诉鼻子它是一个嵌套测试。就像是
@nested_test
def check_sort(sortalg, vals):
assert sortalg(vals) == sort(vals)
这个想法是,当它被调用时,它会向nose注册自己,如果失败将报告它的输入。
看起来 pytest 提供了pytest.mark.parameterized,但这对我来说似乎很尴尬。我必须将所有参数放在函数上方的一个位置,所以我不能在测试中重复调用它。我也不认为这支持嵌套超过一层。
Nose 还提供了测试生成器,看起来更接近,但仍然没有我希望的那么清晰。