2013-06-23 20 views
10

Chciałbym powtórzyć listę elementów i uruchomić asercję na każdym z nich. Jednym z przykładów może być sprawdzenie, czy każda liczba na liście jest nieparzysta.Tworzenie instancji Python unittest.TestCase z argumentami

TestCase:

class TestOdd(unittest.TestCase): 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(NUMBER %2==1, "Number should be odd") 

test suite:

if __name__ == '__main__': 
    suite = unittest.TestSuite() 
    suite.addTest(TestOdd()) 
    # I would like to have: 
    # suite.addTest(TestOdd(1)) 
    # suite.addTest(TestOdd(2)) 
    # suite.addTest(TestOdd(3)) 
    # ... 
    unittest.main() 

Jak mogę instancji TestOdd obiekt z argumentem - na przykład numer do badania?

Aktualizacja: Według wpisu na blogu z 2011 r. (Opublikowanego jako odpowiedź), nie ma wbudowanego mechanizmu do sparametryzowanych testów. Z radością przyjmuję wszelkie czystsze rozwiązania.

+0

zobacz także: [Dostęp argparse argumenty z klasa] (http: //codereview.stackexchange. com/q/88655/15346) w CR – kenorb

Odpowiedz

4

Można to osiągnąć za pomocą atrybutów klas.

class TestOdd1(unittest.TestCase): 
    NUMBER=1 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(self.NUMBER % 2 == 1, "Number should be odd") 

class TestOdd2(TestOdd1): 
    NUMBER=2 

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

test jednostkowy odkryje je automatycznie, więc nie ma potrzeby, aby utworzyć pakiet.

Jeśli chcesz uniknąć stosując TestCase dla klasy bazowej, można użyć wielokrotne dziedziczenie:

from unittest import TestCase, main 

class TestOdd: 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(self.NUMBER % 2 == 1, "Number should be odd") 

class TestOdd1(TestOdd, TestCase): 
    NUMBER=1 
class TestOdd2(TestOdd, TestCase): 
    NUMBER=2 

if __name__ == '__main__': 
    main() 
9

Według "Python unit testing: parametrized test cases", opublikowanym w blogu Eli Bendersky za:

standardem Python unittest biblioteki jest wielki i używam go cały czas. Jedną z rzeczy, których brakuje, jest prosty sposób na przeprowadzanie sparametryzowanych przypadków testowych. Innymi słowy, nie można z łatwością przekazać argumentów w postaci unittest.TestCase z zewnątrz.

Rozwiązanie Eli dziedziczy unittest.TestCase w ParametrizedTestCase. Nie mam pewności co do kwestii związanych z prawami autorskimi, dlatego nie będę kopiować i wklejać tutaj kodu.

Jeśli istnieje lepsze rozwiązanie, chętnie je zaakceptuję.

Powiązane problemy