Pytanie Dlaczego factory_boy ma przewagę nad używaniem ORM bezpośrednio w testach?


Nie widzę powodu, dla którego preferowano factory_boy nad tworzeniem instancji ORM / modelu bezpośrednio w testach Django. A witryna factory_boy nie wyjaśnia w niczym korzyści z jej używania.

Ma sens jako alternatywa dla urządzeń, które są trudne do zarządzania, są powolne itd. Itd.

Ale może po prostu nie tworzyć instancji modelu w razie potrzeby do testów?

Jeśli użytkownik_przedsiębiorstwa całkowicie zastąpił zapis do bazy danych, to dobrze, myślę, że tak bardzo przydatne w tym przypadku, ale chłopiec fabryka utworzone instancje modelu Django nadal interakcji z bazą danych.

Kolejną potencjalną korzyścią jest wsparcie dla sekwencji, ale nie jest trudno tworzyć sekwencje / próbki danych bez potrzeby fabrycznego chłopca.

W sumie, nie widzę praktycznie żadnych korzyści z używania chłopca fabrycznego, zamiast tworzenia obiektów / instancji modelu bezpośrednio.

Mam nadzieję, że brakuje mi czegoś oczywistego!


11
2018-04-28 19:41


pochodzenie




Odpowiedzi:


Tak, możesz przygotować swoje dane testowe bezpośrednio za pomocą ORM Django. Ale są zalety korzystania z fabryk i factory_boy konkretnie, oto niektóre z tego, które pamiętam i używam:

  • Twoje fabryki modeli są zdefiniowane w ładny, czysty i czytelny sposób:

    class CasesFactory(factory.Factory):
        FACTORY_FOR = models.Case
    
        number = factory.Sequence(lambda n: '1021-{0}'.format(n))
        create_date = datetime.datetime.now()
    
  • Kolejną korzyścią tego podejścia opartego na klasach jest możliwość tworzenia Subfabryki 

  • możesz także łatwo zdefiniować fabryki dla różnych rodzajów relacji: ForeignKey, odwrotnie ForeignKey, ManyToMany (dokumentacja)

  • schludny DjangoModelFactory klasa
  • Sequences (jak już wspomniałeś) pomaga uczynić dane bardziej "dynamicznymi". Wyobraź sobie, jak sobie z tym radzisz.
  • mute_signals dekorator - czasami podczas testowania nie chcesz, aby sygnał był wysyłany

Gruntownie, factory_boy jest tam, aby uniknąć pisania funkcji "pomocnika" do generowania danych testowych. Zamiast tego wprowadza przyjemny i łatwy w użyciu interfejs.

Zadaj sobie pytanie: dlaczego odświeżyć koło, czy istnieje narzędzie specjalnie do tego zadania?

Zobacz także:


9
2018-04-28 19:56



Kolejny naprawdę podstawowy element warty dodania: możesz określić wartości domyślne, które będą używane w testach, nie mając ich jako wartości domyślnych w samym modelu. Jest to świetne, jeśli masz naprawdę ważne atrybuty, które powinny zostać pomylone, jeśli nie są jawnie podane w rzeczywistej aplikacji (więc nie możesz mieć domyślnego modelu), ale naprawdę nie dbasz o nie w niektórych testach przypadki. - Adam Brenecki