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

2024-04-20 07:16:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我的语言是python 3,我试图理解如何使用同一组测试来测试同一算法的不同实现。在

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

不过,这只是我对它应该是什么样子的想法。你能告诉我如何实际使用同一组测试来测试实现相同算法的不同函数吗?在


Tags: 函数算法语言层次结构unittest子类testcase内置
3条回答

我的方法是在一个不继承TestCase的类中编写测试,然后编写多个测试类,这些测试类分别是继承自TestCase这些测试,但它们要么有一个工厂方法,要么有类的class属性来实例化:

class TestAnyImplementation:
    def testThis(self):
        obj = getImpl()  # call to factory method
        self.assertTrue(obj.isEmpty())

class TestFooImplementation(TestAnyImplementation,TestCase):
    def getImpl(self):
        return Foo()

class TestBarImplementation(TestAnyImplementation,TestCase):
    def getImpl(self):
        return Bar()

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

例如,使用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”:

^{pr2}$

如果您import使用相同名称的不同实现,则可以保持测试不变。要测试impl1,请执行以下操作:

import impl1 as impl

在你的测试代码中。要测试impl2,请执行以下操作:

^{pr2}$

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

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

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

使用这种方法,您不必更改测试。在

相关问题 更多 >