2016-01-23 17 views
6

Mi piace Faker, lo uso sempre nel mio seeds.rb per popolare il mio ambiente di sviluppo con dati dall'aspetto realistico.Dovremmo usare Faker in Rails Factories?

Ho anche appena iniziato a utilizzare Factory Girl che consente anche di risparmiare un sacco di tempo, ma quando mi aggiro per il web per gli esempi di codice non vedo molte prove di persone che combinano i due.

D. C'è una buona ragione per cui le persone non usano il falso in una fabbrica?

La mia sensazione è che così facendo aumenterei la robustezza dei miei test seminando dati casuali - ma prevedibili ogni volta, il che, si spera, aumenterebbe le possibilità che un bug spuntasse.

Ma forse non è corretto e non vi è alcun vantaggio rispetto alla codifica di una fabbrica o non vedo una potenziale trappola. C'è una buona ragione per cui queste due gemme dovrebbero o non dovrebbero essere combinate?

+0

Perché si desidera generare dati dinamicamente ogni volta che si crea un modello di prova? È appena sopra la testa –

+0

Giusto così concordato, le prestazioni del test sarebbero state influenzate - ma non ne valeva la pena su un'app complessa, soprattutto con un sacco di convalida, per verificare che non ho scritto qualcosa di stupido che permetta 'firstName: Michal 'ma non' firstName: Huw', sicuramente la varietà di Faker porterebbe a test più robusti? – Huw

+0

Si chiama test dei casi limite. Ancora nessuna necessità di dati casuali –

risposta

5

Alcune persone sostengono contro di essa, come here.

NON utilizzare l'attributo casuale a valori

Uno schema comune è quello di utilizzare una libreria di dati falsi (come Faker o Forgery) per generare valori casuali sul al volo. Questo può sembrare allettante per nomi, indirizzi e-mail o numeri di telefono , ma non ha uno scopo reale. Creazione di unico valori è abbastanza semplice con le sequenze:

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

    factory :post do 
    title 
    end 
end 

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

I suoi dati randomizzati potrebbero a un certo punto di trigger risultati imprevisti in alcuni test, rendendo le vostre fabbriche frustrante con cui lavorare.Qualsiasi valore che potrebbero influenzare il vostro risultato di prova in qualche modo dovrebbe essere ignorato, significato:

Nel corso del tempo, si scopre nuovi attributi che causano il test per non riuscire a volte. Si tratta di un processo frustrante, poiché i test potrebbero non riuscire una sola volta su ogni dieci o centinaia di esecuzioni, a seconda di quanti attributi e valori possibili di e la combinazione attiva il bug. Dovrai elencare ogni attributo casuale di questo tipo in ogni test per sovrascriverlo, il che è sciocco. Quindi, crei fabbriche non casuali , annullando in tal modo qualsiasi beneficio della casualità originale. Si potrebbe argomentare, come fa Henrik Nyh, che i valori casuali aiutano a scoprire i bug . Sebbene possibile, ciò significa ovviamente che hai un problema più grande: : buchi nella tua suite di test. Nella peggiore delle ipotesi, l'errore non viene rilevato; nel migliore dei casi si ottiene un criptico messaggio di errore che scompare alla successiva esecuzione del test, rendendo così difficile il debug di . È vero, un errore criptico è meglio di nessun errore, ma le fabbriche randomizzate rimangono un sostituto inadeguato per i test unitari appropriati, la revisione del codice e TDD per prevenire questi problemi.

Le fabbriche randomizzate non solo non meritano lo sforzo, ma danno anche prova di falsa sicurezza nei test, che è peggio di senza alcun test.

Ma non c'è niente che ti impedisca di farlo se vuoi, fallo e basta.

Oh, e c'è un modo ancora più semplice per allineare una sequenza in FactoryGirl recente, quella citazione è stata scritta per una versione precedente.

+0

Grazie a Jrochkind, apprezzo molto anche il link, interessante che elenca un link a quel [post di Henrik Nyh] (http://thepugautomatic.com/2012/07/randomize-your-factories/), mi trovo profondamente tentato con questo approccio e il contributo di Aef sopra. Ma penso che Arjan van der Gaag sia un buon caso che usare il faker sia "un povero sostituto per i test unitari, la revisione del codice e il TDD per prevenire questi problemi". Grazie a tutti per le prospettive. – Huw

+0

Ad un certo punto ci sarà così tanta complessità combinatoria nei progetti in crescita, che avrete sempre lacune nella copertura del test, anche se è al 100% sulla carta. E come ho detto nella mia risposta, lo sforzo che avete costruito nelle fabbriche di solito non ha costi aggiuntivi, perché potreste farlo comunque se volete essere in grado di presentare facilmente le caratteristiche ai clienti con alcuni dati demo decenti e non personalizzati. – aef

1

Mi piace usare Faker e di solito lo faccio quando lavoro con basi di codice più grandi. Vedo i seguenti vantaggi e svantaggi quando si utilizza Faker con Factory Girl:

possibili svantaggi:

  • Un po 'più difficile da riprodurre esattamente lo stesso scenario di test (almeno RSpec funziona in tutto questo è necessario richiamare il generatore di numeri casuali di semi di ogni tempo e permette di riprodurre lo stesso test esatto con esso)
  • rifiuti generazione di dati di un po 'di prestazioni

possibili vantaggi:

  • Rende i dati visualizzati di solito più umanamente comprensibili. Quando si creano i dati dei test manualmente, le persone tendono a tutti i tipi di scorciatoie per evitare la noia.
  • Costruire fabbriche con Faker per i test allo stesso tempo fornisce i mezzi per generare buoni dati dimostrativi per le presentazioni.
  • Si potrebbe in modo casuale scoperta di casi di bug bordo durante l'esecuzione dei test molto
+0

Grazie Aef, è un bel riassunto- puoi parlare con il punto di Michal sopra? Pensi che questo violi una base di test con valori noti? Inoltre, quando dici che fornisce dati di prova per le demo, immagino che stai parlando dei file seme lì? Come funziona questo fattore nell'usare le fabbriche per i test? Stai usando le fabbriche nel tuo file seme? – Huw

+0

Quello che mi capita molto spesso quando scrivo test è che spesso non importa quale sia il valore reale, ma più che è lo stesso valore che è stato dato da qualche parte attraverso un certo codice e viene restituito esattamente uguale o modificato in un modo specifico. Qui, non importa se il valore è fisso o casuale. I dati di Faker forniscono ulteriore utilizzo perché cerca di essere più vicino ai dati reali in modo che gli utenti possano comprenderli meglio durante il debug dei test. Quando il contenuto del valore è importante per il test, in genere non lo usi Faker. – aef

+0

Io di solito definisco le fabbriche come parte (forse facoltativa) del mio codice principale, invece di averlo in bundle con il codice di prova. Quindi posso creare dati demo ovunque, sia in un file seme, o in una console live, o davvero in qualsiasi altro contesto che desidero. – aef

1

Spetta a voi.

Secondo me è una buona idea avere dati casuali nei test e mi ha sempre aiutato a scoprire bug e casi d'angolo a cui non pensavo.

Non mi pento mai di avere dati casuali. Tutti i punti descritti da @jrochkind sarebbe corretto (e si dovrebbe leggere l'altra risposta prima di leggere questo), ma è anche vero che si può (e dovrebbe) scrivere che nella vostra spec_helper.rb

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

questo farà in modo che hai anche test ripetibili con dati ripetibili. Se non lo fai, hai tutti i problemi descritti nell'altra risposta.

+0

Mi piace particolarmente questa risposta, mi dà abbastanza casualità inizialmente per assicurarmi di poter testare le mie aspettative iniziali, ma ripetibilità quando ne ho bisogno, grazie @coorasse :) – Huw

Problemi correlati