2013-05-03 13 views
6

Muszę ustawić kolejność wykonania dla moich testów, ponieważ potrzebuję pewnych danych zweryfikowanych przed innymi. Czy można ustawić zamówienie?Zlecenie wykonania na python unittest

class OneTestCase(unittest.TestCase): 
    def setUp(self): 
     # something to do 
    def test_login (self): 
     # first test 
     pass 
    def test_other (self): 
     # any order after test_login 
    def test_othermore (self): 
     # any order after test_login 
if __name__ == '__main__': 
    unittest.main() 

dzięki

+3

test jednostkowy oznacza, że ​​testy są jednostkowe. nie powinny polegać na sobie nawzajem. – njzk2

+0

Masz rację, ale czy może być najlepszym sposobem na zrobienie testu, gdy potrzebuję tego rodzaju zachowania, czy może być lepiej, gdy wywołuję logowanie za każdym razem, aby wykonać test? To jest dla serwera, który musi rozpocząć logowanie zanim zrobi cokolwiek innego, a inne metody odczytują informacje oparte na logowaniu – Carlos

+3

Jeśli faktycznie wchodzisz w interakcję z prawdziwym serwerem za pomocą kabla, nie robisz * testów jednostkowych *. – delnan

Odpowiedz

1

Lepiej nie rób tego.

Testy powinny być niezależne.

Aby zrobić to, co chcesz, najlepiej byłoby umieścić kod w funkcjach wywoływanych przez test.

tak:

def assert_can_log_in(self): 
    ... 

def test_1(self): 
    self.assert_can_log_in() 
    ... 

def test_2(self): 
    self.assert_can_log_in() 
    ... 

Albo nawet podzielić klasę testową i umieścić twierdzeń do funkcji konfiguracji.

class LoggedInTests(unittest.TestCase): 
    def setUp(self): 
     # test for login or not - your decision 

    def test_1(self): 
     ... 

Kiedy dzielę klasę, często piszę więcej i lepiej testów, ponieważ testy są podzielone i widzę lepiej przez wszystkie przypadki, które powinny być testowane.

+0

również login musi być przetestowany, to może być w porządku? – Carlos

+0

Przepraszam, nie rozumiem. – User

+3

Czytam długie dyskusje na temat prawidłowego pisania testów. Faktem jest, że niektóre testy zależą od pewnego określonego stanu, który np. można utworzyć za pomocą poprzedniego testu, który testuje utworzenie tego stanu (np. jest zalogowany). Stworzenie tego stanu może być czasochłonną procedurą, więc ponowne jej wykorzystanie i testy łańcuchowe mogą być tego warte, aby krótki czas trwania testów był krótki. Inaczej skończyłoby się przetestowanie procedury logowania 100 razy, tak aby pokryć testy, które wykonujesz w stanie zalogowanym. Bycie zbyt filozoficznym w kwestii separacji testowej nie ma sensu. – Michael

18

Można to zrobić tak:

class OneTestCase(unittest.TestCase): 
    @classmethod 
    def setUpClass(cls): 
     # something to do 
     pass 

    def test_01_login (self): 
     # first test 
     pass 
    def test_02_other (self): 
     # any order after test_login 
    def test_03_othermore (self): 
     # any order after test_login 

if __name__ == '__main__': 
    unittest.main(failfast=True, exit=False) 

Testy są sortowane alfabetycznie, więc wystarczy dodać numery, aby uzyskać pożądaną kolejność. Prawdopodobnie chcesz też ustawić testosternera na failfast = True, więc natychmiast zawiedzie, gdy tylko pierwszy test się nie powiedzie.

+3

Gdzie są posortowane? Czy można na tym polegać? – User

+2

unittest sortuje je niezawodnie według alfabetu. – Michael

+0

@User Zobacz dokumentację Pythona: "Zauważ, że kolejność, w której będą uruchamiane różne przypadki testowe, jest określana przez sortowanie nazw funkcji testowych w odniesieniu do wbudowanej kolejności łańcuchów." – mloskot

Powiązane problemy