Jaka jest różnica między setUp()
iw frameworku setUpClass()
Pythona unittest
?
Główna różnica (jak zauważyła w odpowiedzi Benjamin Hodgson) polega na tym, że setUpClass
wywoływana jest tylko raz i to jest przed wszystkimi testami, natomiast setUp
jest wywoływana bezpośrednio przed każdym testem. (Uwaga: to samo dotyczy równoważnych metod w innych strukturach testowych xUnit, nie tylko w języku Python unittest
).
Z unittest
dokumentacji :
setUpClass()
Metoda klasowa wywoływana przed uruchomieniem testów w klasie indywidualnej. setUpClass jest wywoływana z klasą jako jedynym argumentem i musi być udekorowana jako metoda class ():
@classmethod
def setUpClass(cls):
...
i:
setUp()
Metoda wywołana w celu przygotowania osprzętu testowego. Jest to wywoływane bezpośrednio przed wywołaniem metody testowej; inny niż AssertionError lub SkipTest, każdy wyjątek zgłoszony przez tę metodę będzie traktowany jako błąd, a nie niepowodzenie testu. Domyślna implementacja nic nie robi.
Dlaczego konfiguracja miałaby być obsługiwana jedną metodą zamiast drugiej?
Na tę część pytania nie ma jeszcze odpowiedzi. Zgodnie z moim komentarzem w odpowiedzi na odpowiedź Gearona, setUp
metoda jest przeznaczona dla elementów oprawy, które są wspólne dla wszystkich testów (aby uniknąć powielania tego kodu w każdym teście). Uważam, że jest to często przydatne, ponieważ usuwanie duplikatów (zwykle) poprawia czytelność i zmniejsza obciążenie związane z konserwacją.
Ta setUpClass
metoda jest przeznaczona dla kosztownych elementów, które wolałbyś wykonać tylko raz, takich jak otwarcie połączenia z bazą danych, otwarcie pliku tymczasowego w systemie plików, załadowanie biblioteki współdzielonej do testów itp. Wykonywanie takich czynności przed każdym testem spowolniłoby zestawu testów za dużo, więc robimy to raz przed wszystkimi testami. Jest to nieznaczne pogorszenie niezależności testów, ale w niektórych sytuacjach konieczna optymalizacja. Prawdopodobnie nie powinno się robić takich rzeczy w testach jednostkowych, ponieważ zwykle można mockować bazę danych / system plików / bibliotekę / cokolwiek bez użycia prawdziwej rzeczy. W związku z tym uważam, że setUpClass
jest to rzadko potrzebne. Jest to jednak przydatne, gdy konieczne jest przetestowanie powyższych przykładów (lub podobnych).