2013-02-18 11 views
6

Konwertuję zestaw testów projektu Python z unittest na nos. Istniejąca struktura projektu (oparta na unittest) jest raczej niezgrabna, zawiera wiele wysoce spersonalizowanych kodów do wykrywania i uruchamiania testów, więc staram się migrować do nosa, aby wszystko było usprawnione.Dziedziczenie testów w języku Python: urządzenia testujące jednostki ładunkowe z podklas

Mam jednak do czynienia z problemami z kodem generującym zestawy testów.

Ramy projektu mają dwa sposoby przeprowadzania testów. Jedną z nich jest "prosta" metoda, która pokazuje wszystkie przykłady i tutoriale Nosa i działa. Jednak drugi sposób to poprzez zdefiniowanie klasy testowej, która zawiera całą logikę testową, a następnie tworzenie przypadków testowych w różnych podklas, które zawierają różne konfiguracje ustawień i dziedziczą testy z nadklasy:

class TestSomething(unittest.TestCase): 

    def test_x(self): 
     ... 

    def test_y(self): 
     ... 

class TestCase1(TestSomething): 

    def setUp(self): 
     ... 

class TestCase2(TestSomething): 

    def setUp(self): 
     ... 

suite = unittest.TestSuite() 

cases = [TestCase1,TestCase2] 
suite.addTests([unittest.makeSuite(case) for case in cases]) 

To co nie Nose z. Najpierw próbuje uruchomić metody testowe, co oczywiście nie działa, ponieważ nie istnieje żadna funkcja setUp() w klasie nadrzędnej, a wiele zmiennych używanych w test_x() i test_y() nie zostało jeszcze zdefiniowanych.

Nie znalazłem żadnych przykładów tego zrobionego gdziekolwiek, a dokumentacja Nosa (raczej rzadka i trudna w nawigacji) również nie wspomina o tym. Jak można to wykorzystać do pracy z nosem? Każda pomoc zostanie bardzo doceniona.

Odpowiedz

13

Przede wszystkim, jak zauważono w unutbu, nie należy podawać TestSomething nazwy rozpoczynającej się od Test, ponieważ nose automatycznie traktuje takie klasy jako przypadki testowe. Również nose uruchamia wszystkie TestCase podklasy on stwierdzi, co robi:

class Something(unittest.TestCase): 
    ... 

daje dokładnie te same wyniki masz. Myślę, że nie powinien dziedziczyć TestCase i używać tej klasy jako mix-in:

class Something(object): 
    def test_x(self): 
     # here the various assertEqual etc. do not resolve, but you can use them 
     # as if they were present, since in real test-cases they will be inherited 
     # from unittest.TestCase. 
     ... 
    ... 

class TestCase1(unittest.TestCase, Something): 
    def setUp(self): 
     ... 

Innym sposobem, aby to zrobić, to ustawić klasę na __test__ atrybutem False: Alternatywnie

class TestSomething(unittest.TestCase): 
    __test__ = False 
    def test_x(self): 
     ... 


class TestCase1(TestSomething): 
    __test__ = True #must put this 
    def setUp(self): 
     ... 

ty można użyć nose.istest i nose.nottest z okazji, która klasa jest testcase, a który nie jest:

@tools.nottest 
class TestSomething(unittest.TestCase): 
    def test_x(self): 
     ... 

@tools.istest 
class TestCase1(TestSomething): 
    sef setUp(self): 
     ... 
+0

Korzystanie z dekorator nosa s zrobił lewę; patrząc wstecz, wydaje się to bardzo oczywiste teraz, ale czasami najbardziej oczywiste rozwiązania są najbardziej nieuchwytne ... wielkie dzięki za wskazówki! – Boris

Powiązane problemy