我有一个包含许多具有相似预期行为的不同对象的库,因此我想对它们运行类似的测试,但不一定对它们进行相同的测试。
具体来说,我有一些排序功能,以及检查排序功能是否实际排序的测试。有些排序函数适用于某些输入,但不适用于其他输入。
我想写一些接近下面代码的内容。但是,鼻子不会很好地告诉我测试失败的确切位置和输入。如果case_s上的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还提供了test generators,这似乎更接近,但仍然不如我希望的那样清晰。
答案 0 :(得分:2)
使用提供的generative test功能可能是使用nose和py.test进行的。
也就是说,您可以在创建类之后动态地将函数(测试)添加到类中。这是标准库中Lib/test/test_decimal.py
代码使用的技术。
答案 1 :(得分:2)
您可以使用nose-ittr,它是支持参数化测试的鼻子扩展。
示例:
@ittr(case1=[1,3,2],case2=[2,31,1])
def test_sorts():
check_sort(sort1, self.case1)
check_sort(sort2, self.case2)