0

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

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

我想写一些接近下面代码的东西。但是,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 还提供了测试生成器,看起来更接近,但仍然没有我希望的那么清晰。

4

2 回答 2

2

使用提供的生成测试功能可能是使用nose 和py.test 执行此操作的预期方式。

也就是说,您可以在创建类后将函数(测试)动态添加到类中。这是Lib/test/test_decimal.py标准库中的代码使用的技术。

于 2013-02-08T03:49:56.613 回答
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)
于 2014-11-30T11:12:45.717 回答