如果我有两个函数的实现应该做同样的事情,有没有办法针对相同的测试用例测试这两个函数?
我拥有它:
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进行参数化?
我知道我不应该尝试过于聪明地进行测试,所以也许我应该保留原样,重复代码等等。
答案 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
已被弃用。使用assertTrue
或assertEqual
,如上面的代码所示。