2016-01-23 18 views
6

Uwielbiam Faker, używam go w moim seeds.rb cały czas, aby zapełnić moje środowisko dev z prawdziwymi danymi wyglądającymi.Czy powinniśmy używać Fakera w Rails Factories?

Po prostu zacząłem używać Factory Girl, co również oszczędza mnóstwo czasu - ale kiedy śledzę w Internecie przykłady kodu, nie widzę wielu dowodów na to, że ludzie łączą te dwa.

P. Czy istnieje dobry powód, dla którego ludzie nie używają robotników w fabryce?

Mam wrażenie, że dzięki temu zwiększyłabym wytrzymałość moich testów, przesyłając przypadkowe, ale przewidywalne dane za każdym razem, co, miejmy nadzieję, zwiększyłoby szansę pojawienia się błędu.

Ale może to jest nieprawidłowe i nie ma żadnej korzyści z twardego kodowania fabryki lub nie widzę potencjalnej pułapki. Czy istnieje dobry powód, dlaczego te dwa klejnoty powinny lub nie powinny być łączone?

+0

Dlaczego chcesz generować dane dynamicznie za każdym razem, gdy tworzysz model testowy? Jest tuż nad głową –

+0

Zgadza się na to, że wpłynie to na wydajność testu - ale nie może być tego warta na złożonej aplikacji, szczególnie takiej z dużą ilością sprawdzania poprawności, aby sprawdzić, czy nie napisałem czegoś głupiego, co pozwala 'firstName: Michal 'ale nie' firstName: Huw', z pewnością odmiana Fakera doprowadziłaby do bardziej solidnych testów? – Huw

+0

To się nazywa testowanie krawędzi. Nadal nie potrzebujesz losowych danych. –

Odpowiedz

5

Niektórzy twierdzą przeciwko niemu, jako here.

NIE UŻYWAJ RANDOM wartości atrybutów

Jeden wspólny wzór jest użycie fałszywego biblioteka danych (jak Faker lub Fałszerstwo) do generowania wartości losowych na locie. Może to wydawać się atrakcyjne dla nazw, adresów e-mail lub numerów telefonów , ale nie służy to żadnemu celowi. Tworzenie unikalnych wartości jest dość prosta z sekwencji:

FactoryGirl.define do 
    sequence(:title) { |n| "Example title #{n}" } 

    factory :post do 
    title 
    end 
end 

FactoryGirl.create(:post).title # => 'Example title 1' 

Twoje randomizowane dane może w pewnym momencie wyzwalania nieoczekiwane wyniki w testach dokonywania fabryki frustrujące pracować.Każda wartość, która może mieć wpływ na wynik testową w jakiś sposób musiałaby być przesłonięta, znaczenie:

biegiem czasu, będziemy odkrywać nowe atrybuty, które powodują swój test nie czasami. Jest to frustrujący proces, ponieważ testy mogą się nie powieść tylko raz na dziesięć lub sto przebiegów - w zależności od tego, ile jest atrybutów i możliwych wartości, i która kombinacja uruchamia błąd. Będziesz musiał wymienić każdy taki losowy atrybut w każdym teście, aby go zastąpić, co jest głupie. Tworzysz zatem nie-losowe fabryki , tym samym zanegując jakąkolwiek korzyść z pierwotnej losowości. Można się spierać, jak robi to Henrik Nyh, że wartości losowe pomogą ci odkryć błędy. O ile to możliwe, oznacza to oczywiście, że masz większy problem: dziury w pakiecie testowym. W najgorszym przypadku błąd nadal pozostaje niewykryty; w najlepszym przypadku otrzymujesz tajemniczy komunikat o błędzie , który znika przy następnym uruchomieniu testu, przez co trudno jest debugować. To prawda, że ​​tajemniczy błąd jest lepszy niż brak błędu, ale losowe fabryki pozostają słabym zamiennikiem właściwych testów jednostkowych, przeglądu kodu i TDD, aby zapobiec tym problemom.

Losowe fabryki nie tylko nie są warte wysiłku, ale nawet dają fałszywe zaufanie do testów, które są gorsze niż bez żadnych testów.

Ale nic nie powstrzyma cię przed zrobieniem tego, jeśli chcesz, po prostu to zrób.

Aha, i jest jeszcze łatwiejszy sposób na wstawienie sekwencji w ostatnim FactoryGirl, ten cytat został napisany dla starszej wersji.

+0

Dziękuję Jrochkind, bardzo doceniam również ten link, ciekawe, że wymienia on link do tego [posta Henrika Nyh] (http://thepugautomatic.com/2012/07/randomize-your-factories/), głęboko mnie kuszą dzięki temu podejściu i wyżej wymienionemu wkładowi Aef. Ale myślę, że Arjan van der Gaag jest dobrym przykładem, że używanie fakerzy jest "złym substytutem dla właściwych testów jednostkowych, przeglądu kodu i TDD, aby zapobiec tym problemom". Dziękuję wszystkim za perspektywy. – Huw

+0

W pewnym momencie w rozwijających się projektach pojawi się tak wiele kombinatorycznej złożoności, że zawsze będziesz mieć luki w pokryciu testowym, nawet jeśli jest to 100% na papierze. I tak jak powiedziałem w mojej odpowiedzi, wysiłek, jaki zbudowałeś w fabrykach, zwykle nie wiąże się z dodatkowymi kosztami, ponieważ możesz to zrobić w każdym razie, jeśli chcesz mieć możliwość łatwego prezentowania funkcji klientom z przyzwoitymi, nie spersonalizowanymi danymi demo. – aef

1

Lubię używać Fakera i zwykle robię to podczas pracy z większymi bazami kodów. Widzę następujące zalety i wady stosowania faker z fabryką Dziewczyna:

Możliwe wady:

  • Nieco trudniej odtworzyć dokładnie ten sam scenariusz testowy (przynajmniej RSpec działa wokół to poprzez wyświetlanie generator liczb losowych nasion za każdym razem i pozwala odtworzyć dokładnie ten sam test z nim)
  • odpadów danych Generowanie nieco wydajności

Możliwe zalety:

  • Sprawia, że ​​wyświetlane dane są zwykle bardziej zrozumiałe dla człowieka. Podczas ręcznego tworzenia danych testowych ludzie mają tendencję do wszelkiego rodzaju skrótów, aby uniknąć nudy.
  • Budowanie fabryk przy pomocy Fakera do testów zapewnia jednocześnie możliwość generowania ładnych danych demonstracyjnych dla prezentacji.
  • Można przypadkowo odkryć krawędzi przypadków błędów podczas uruchamiania testów dużo
+0

Dzięki Aef, to miłe podsumowanie - czy możesz porozmawiać z punktem Michała powyżej? Czy uważasz, że to narusza podstawę testowania ze znanymi wartościami? Również, gdy mówisz, że daje dobre dane testowe dla wersji demonstracyjnych, domyślam się, że mówisz o plikach źródłowych? W jaki sposób wpływa to na wykorzystanie fabryk do testów? Czy używasz fabryk w pliku źródłowym? – Huw

+0

To, czego bardzo często doświadczam podczas pisania testów, to fakt, że często nie ma znaczenia, jaka jest rzeczywista wartość, ale więcej, że jest to ta sama wartość, która została podana gdzieś przez jakiś kod i jest zwracana albo dokładnie taka sama, albo zmieniona w określony sposób. Tutaj nie ma znaczenia, czy wartość jest stała czy losowa. Dane Fakera zapewniają dalsze wykorzystanie, ponieważ próbują być bliżej rzeczywistych danych, aby ludzie mogli lepiej je zrozumieć podczas testów debugowania. Kiedy zawartość wartości ma znaczenie dla testu, zwykle nie używasz Fakera do tego. – aef

+0

Zwykle definiuję fabryki jako (być może opcjonalne) części mojej głównej bazy kodu, zamiast pakować je razem z kodem testowym. Następnie mogę tworzyć dane demo wszędzie, czy to w pliku źródłowym, czy w konsoli na żywo, czy naprawdę w dowolnym innym kontekście, jaki życzę. – aef

1

To zależy od Ciebie.

Moim zdaniem to bardzo dobry pomysł, aby mieć losowe dane w testach i zawsze pomógł mi odkryć błędy i narożniki, o których nie myślałem.

Nigdy nie żałuję, że dane są losowe. Wszystkie punkty opisane przez @jrochkind byłoby poprawne (i powinieneś czytać drugą odpowiedź przed przeczytaniem tego jednego), ale prawdą jest również, że można (i należy) napisać, że w swojej spec_helper.rb

config.before(:all) { Faker::Config.random = Random.new(config.seed) } 

będzie to zrobić tak że masz powtarzalne testy z danymi powtarzalnymi. Jeśli tego nie zrobisz, masz wszystkie problemy opisane w drugiej odpowiedzi.

+0

Szczególnie podoba mi się ta odpowiedź, dostaje mnie na tyle losowo początkowo, aby upewnić się, że mogę przetestować moje początkowe oczekiwania, ale powtarzalność, kiedy jej potrzebuję, dzięki @coorasse :) – Huw

Powiązane problemy