针对多个实现运行相同的测试

时间:2014-09-21 13:05:57

标签: python unit-testing

如果我有两个函数的实现应该做同样的事情,有没有办法针对相同的测试用例测试这两个函数?

我拥有它:

def foo1(args):
    // do some stuff
    return result1

def foo2(args):
    // do some other stuff
    return result2

import unittest

class TestFoo(unittest.TestCase):

    def test_1(self):
        arg = // something
        result = // expected result
        self.failUnless(foo1(arg) == result)

    def test_2(self):
        arg = // something
        result = // expected result
        self.failUnless(foo2(arg) == result)

但test_2与test_1相同,但正在测试的功能除外。如果我对测试用例进行了更改,我必须更改它们,如果我添加更多测试,我必须复制它们。

我可以这样做:

class TestFoo(unittest.TestCase):
    def test_(self):
        fns = [foo1, foo2]
        arg = // something
        result = // expected result
        for fn in fns:
            self.failUnless(fn(arg) == result)

此代码重复较少,但现在如果任一实现都未通过测试,则unittest不会报告哪一个。

是否可以通过要测试的函数对TestCase进行参数化?

我知道我不应该尝试过于聪明地进行测试,所以也许我应该保留原样,重复代码等等。

1 个答案:

答案 0 :(得分:2)

这是一种使用类属性和继承的方法。

def foo1(a, b):
    return b + a

def foo2(a, b):
    return a + b

import unittest

class TestFooBase:
    def test_1(self):
        self.assertEqual(self.impl(0, 0), 0)
    def test_2(self):
        self.assertEqual(self.impl(1, 2), 3)

class TestFoo1(unittest.TestCase, TestFooBase):
    impl = staticmethod(foo1)

    # OR
    # def impl(self, *args, **kwargs):
    #    return foo1(*args,**kwargs)


class TestFoo2(unittest.TestCase, TestFooBase):
    impl = staticmethod(foo2)

注意 TestFooBase不应该是unittest.TestCase的子类。否则将运行6(3x2)次测试而不是4次(2x2)。

如果您TestFooBase继承TestFoo1(或反之亦然),则

TestFoo2并非绝对必要。

class TestFoo1(unittest.TestCase):
    impl = staticmethod(foo1)
    def test_1(self):
        self.assertEqual(self.impl(0, 0), 0)
    def test_2(self):
        self.assertEqual(self.impl(1, 2), 3)

class TestFoo2(TestFoo1):
    impl = staticmethod(foo2)

BTW,failUnless已被弃用。使用assertTrueassertEqual,如上面的代码所示。