如何重用相同的测试来测试不同的实现?

时间:2015-04-29 09:39:01

标签: python unit-testing

我的语言是marker-end,我试图了解如何使用同一组测试来测试同一算法的不同实现。

到目前为止,我正在查看内置的python 3,我的印象是我必须创建一个类层次结构:一个继承自unittest.TestCase并实现所有实际测试的类和几个来自其类的后代,每个后代都使用来自父级的测试来测试特定的实现。

然而,这只是我对它应该是什么样子的看法。您能告诉我如何实际使用相同的测试集来测试实现相同算法的不同函数吗?

3 个答案:

答案 0 :(得分:3)

我通过在继承自TestCase的类中编写测试,然后编写执行继承自{{}的多个测试类来完成此操作。 1}} 测试,但要么具有要实例化的类的工厂方法或类属性:

TestCase

答案 1 :(得分:1)

如果import具有相同名称的不同实现,则可以保持测试不变。要测试impl1,请执行

import impl1 as impl

在您的测试代码中。要测试impl2,请执行

import impl2 as impl

如果impl1impl2具有相同的界面,则其他所有内容都可以保持不变。

编辑:您可以将这些导入包装在if子句中,并使用命令行参数选择一个。

chooseImpl = ... # get commandline parameter
if chooseImp == "impl1":
    import impl1 as impl
elif chooseImp == "impl2":
    import impl2 as impl

使用这种方法,您无需更改测试。

答案 2 :(得分:1)

将参数化测试与测试函数一起用作参数。

例如,使用ddt模块进行参数化测试:

def sum1(list1):
    return sum(list1)

def sum2(list1):
    res = 0
    for x in list1:
        res += x
    return res

import unittest
from ddt import ddt, data

@ddt
class SumTest(unittest.TestCase):

    @data(sum1, sum2)
    def test_sum(self, param):
        self.assertEqual(param([1, 2, 3]), 6)


if __name__ == '__main__':
    unittest.main()

在此示例中,您有两个函数“sum1”和“sum2”实现相同的算法:列表元素的求和。在您的测试类中,您只有一个测试方法“test_sum”,它将具体的求和函数作为参数。两个求和函数被指定为参数化测试的值列表。

您可以使用pip:

安装“ddt”
pip install ddt