2014-09-21 4 views
1

Если у меня есть две реализации функции, которая должна делать то же самое, есть ли способ проверить обе функции в отношении тех же тестовых случаев?, выполняющий тот же тест против множества реализаций

Поскольку у меня есть это:

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

Вот один способ атрибута usnig класса и наследования.

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. В противном случае вместо 4 (2x2) будут выполняться тесты 6 (3x2).

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, как показано в приведенных выше кодах.

Смежные вопросы