在python中参数化测试的最简单方法?

时间:2013-02-08 03:30:54

标签: python testing nose pytest

我有一个包含许多具有相似预期行为的不同对象的库,因此我想对它们运行类似的测试,但不一定对它们进行相同的测试。

具体来说,我有一些排序功能,以及检查排序功能是否实际排序的测试。有些排序函数适用于某些输入,但不适用于其他输入。

我想写一些接近下面代码的内容。但是,鼻子不会很好地告诉我测试失败的确切位置和输入。如果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,这似乎更接近,但仍然不如我希望的那样清晰。

2 个答案:

答案 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)