Fabryki Factory Boy w testach Django
Factory Boy to narzędzie zastępującego Django fixtures, czy ręczne tworzenie danych w testach. Ułatwia tworzenie danych potrzebnych do testów, jak i łatwe utrzymanie ich wraz z rozwojem projektu i struktury modeli.
Factory Boya znajdziemy na githubie. Dostępna jest też dokumentacja, czy prezentacja na PyWaw.
Fabryki Factory Boy w testach
Instalacja jest standardowa:Po czym możemy zabrać się za tworzenie fabryk. Można w katalogu aplikacji stworzyć plik factories.py i importować fabryki w pliku z testami (tests.py).
Na potrzeby tego artykułu wykorzystam aplikację użytą w artykule o widokach opartych o klasy. Mamy tam model "Category":
Fabryka dla tego modelu wyglądałaby tak:Ważny element to FACTORY_FOR - wskazuje model, którego dotyczy. Kolejna część fabryki to wartości jakie zostaną przypisane do poszczególnych atrybutów modelu. Powyżej tytuł każdej tworzonej kategorii ustawiony zostanie na "abc".
Teraz wykorzystajmy fabrykę do prostego testu. Kategorie są wyświetlane na stronie głównej, więc jeżeli stworzymy jedną to jej tytuł powinien znaleźć się w treści strony głównej. Oto tests.py:
Metoda create tworzy i zwraca obiekt (kategorii). Dalej self.client wykonuje żądanie głównej strony a w assercie sprawdzane jest czy tytuł stworzonej kategorii występuje w zwróconej treści (testy można odpalić za pomocą polecenia python manage.py test NAZWA_APLIKACJI).
Fabryki potrafią więcej. Zazwyczaj dane takie jak nazwa kategorii byłaby unikalna. Dla każdej tworzonej kategorii trzeba by dostarczyć unikalną nazwę/tytuł. Factory Boy ma na to rozwiązanie - sekwencje:
Pierwsza stworzona kategoria dostanie nazwę "Category 0", druga "Category 1" itd. My piszemy sobie testy, a fabryka odwala czarną robotę unikalności nazwy.
W bardziej życiowych modelach będą jakieś relacje, np model "wpisu":
Fabryki Factory Boy obsługują podfabryki, które można tutaj użyć: W tym przykładzie fabryka "wpisu" ma zapewnione wszystkie potrzebne dane - choć nie zawsze takie fabryki będziemy mieć. Dane mogą być także przekazywane w metodzie create. Prosty test dla tej fabryki: Żeby móc logować użytkowników tworzonych przez fabryki potrzebna jest taka oto fabryka użytkownika: Każdy tworzony użytkownik dostanie hasło "abc", co pozwoli ich logować: O samych testach w Django można poczytać w dokumentacji, czy też zobaczyć prezentację na dstegelman-conf-notes.readthedocs.org.