Wyjaśnij metody Pythona „setUp” i „tearDown” używane w przypadkach testowych

96

Czy ktoś może wyjaśnić użycie Pythona setUpi tearDownmetod podczas pisania przypadków testowych, poza tym, że setUpjest on wywoływany bezpośrednio przed wywołaniem metody testowej i tearDownjest wywoływany natychmiast po wywołaniu?

NOWICJUSZ
źródło

Odpowiedzi:

87

Ogólnie rzecz biorąc, dodajesz wszystkie wymagane kroki do setUp i wszystkie kroki czyszczenia do tearDown.

Możesz przeczytać więcej z przykładami tutaj .

Po zdefiniowaniu metody setUp () program uruchamiający testy uruchomi tę metodę przed każdym testem. Podobnie, jeśli zdefiniowano metodę tearDown (), moduł uruchamiający testy wywoła tę metodę po każdym teście.

Na przykład masz test, który wymaga istnienia elementów lub określonego stanu - więc umieszczasz te działania (tworzenie instancji obiektów, inicjowanie bazy danych, przygotowywanie reguł i tak dalej) do setUp.

Jak również wiesz, każdy test powinien zatrzymać się w miejscu, w którym został uruchomiony - oznacza to, że musimy przywrócić stan aplikacji do stanu początkowego - np. Zamknąć pliki, połączenia, usunąć nowo utworzone pozycje, wywołać zwrot transakcji itd. - wszystko to kroki mają zostać uwzględnione w tearDown.

Pomysł jest taki, że sam test powinien zawierać tylko akcje, które należy wykonać na obiekcie testowym, aby uzyskać wynik, podczas gdy setUp i tearDown to metody, które pomogą Ci pozostawić kod testowy czysty i elastyczny.

Możesz utworzyć setUp i tearDown dla kilku testów i zdefiniować je w klasie nadrzędnej - dzięki czemu łatwo byłoby wspierać takie testy i aktualizować typowe przygotowania i porządki.

Jeśli szukasz prostego przykładu, użyj poniższego linku z przykładem

Artsiom Rudzenka
źródło
57

Możesz ich użyć do wyodrębnienia kodu wspólnego dla wszystkich testów w zestawie testów.

Jeśli masz dużo powtórzonego kodu w swoich testach, możesz je skrócić, przenosząc ten kod do setUp / tearDown.

Możesz użyć tego do tworzenia danych testowych (np. Konfigurowania podróbek / mocków) lub usuwania funkcji za pomocą podróbek.

Jeśli przeprowadzasz testy integracyjne, możesz użyć funkcji sprawdzania warunków wstępnych środowiska w programie setUp i pominąć test, jeśli coś nie jest poprawnie skonfigurowane.

Na przykład:

class TurretTest(unittest.TestCase):

    def setUp(self):
        self.turret_factory = TurretFactory()
        self.turret = self.turret_factory.CreateTurret()

    def test_turret_is_on_by_default(self):
        self.assertEquals(True, self.turret.is_on())

    def test_turret_turns_can_be_turned_off(self):
        self.turret.turn_off()
        self.assertEquals(False, self.turret.is_on())
Matt Curtis
źródło
17
+1, ponieważ 9 linii kodu to wszystko, czego potrzebowałem, aby rozszyfrować się w 100%. Elegancki, zwięzły przykład. Szczerze mówiąc, te 9 wierszy to jedyna rzecz, którą przeczytałem na stronie, poza pytaniem, które również było moim pytaniem. Czy powiedziałeś coś po angielsku przed próbką kodu? To nie było potrzebne! Kod powiedział wszystko! Dzięki Matt.
Nathan C. Tresch
3
Nie jestem pewien, w jaki sposób pokazano tutaj „pomiń test, jeśli coś nie jest prawidłowo skonfigurowane”. A może to tylko na bok?
user5359531
6

Załóżmy, że masz pakiet z 10 testami. 8 testów ma ten sam kod konfiguracji / dezaktywacji. Pozostałe 2 nie.

konfiguracja i porzucenie zapewniają przyjemny sposób na refaktoryzację tych 8 testów. Co teraz robisz z pozostałymi 2 testami? Przenieślibyś je do innego przypadku / zestawu testowego. Tak więc użycie konfiguracji i porzucenia pomaga również w naturalny sposób podzielić testy na przypadki / zestawy

John La Rooy
źródło
1
Czasami przenoszenie testów do innego przypadku jest niepożądane. W takim przypadku możesz napisać dekorator z kodem konfiguracji / zakończenia i ozdobić tylko pożądane funkcje testowe.
Matthijs
2
W żadnym wypadku nie jest to odpowiedź na pytanie.
gented