繁体   English   中英

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

[英]simplest way of parameterizing tests in python?

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

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

我想写一些类似于下面的代码。 但是,鼻子不能很好地告诉我测试在哪里失败以及输入了什么内容。 如果对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)

这个想法是,当它被调用时,它会用鼻子注册自己,如果失败则将报告其输入。

看起来pytest提供pytest.mark.parameterized ,但对我来说似乎很尴尬。 我必须将所有参数放在函数上方,因此不能在测试中重复调用它。 我也不认为这支持嵌套多个级别。

鼻子还提供了测试生成器 ,它看起来更接近,但仍然不如我希望的那样清晰。

使用提供的生成测试功能可能是通过鼻子和py.test进行测试的预期方式。

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

您可以使用鼻子-鼻子 ,它的鼻子延伸来支持参数化测试。

例:

@ittr(case1=[1,3,2],case2=[2,31,1])
def test_sorts(): 

check_sort(sort1, self.case1)
check_sort(sort2, self.case2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM