Domanda

Al momento sto guardando una suite di test pesanti Rails. Non è niente che posso entrare nello specifico riguardo, ma il tempo di funzionamento per l'intera suite (unità / funzionale / una certa integrazione) può essere eseguito verso l'alto di 5 minuti.

Siamo completamente affidamento su infissi e siamo non siamo beffardo e spegnendo quanto dovremmo essere.

I nostri prossimi sprint stanno per essere completamente concentrato sulla suite di test, sia la copertura miglioramento, scrivere i test migliori e, soprattutto, scrivere test più efficienti.

Quindi, a parte più beffardo e spegnendo nei nostri test, stiamo pensando di sostituire i nostri dispositivi con più probabilità Factory Girl. Vedo un sacco di gente felice facendo situazioni simili ma non sono stati in grado di trovare una buona risorsa su eventuali svantaggi di trasferirsi in una fabbrica. Ho visto alcuni parametri di riferimento più lenti quando si utilizzano parametri di riferimento di varie risorse, ma non riesce a trovare una definitiva questo il motivo per cui le fabbriche sono buone e questo è il motivo per cui non si potrebbe desiderare di usarli.

Qualcuno mi può educare sul perché o perché non dovrebbe usare le fabbriche?

Grazie!

È stato utile?

Soluzione

Ci potrebbero essere alcuni problemi con la creazione di tutte le dipendenze tra le entità per una buona suite di test. In ogni caso, è ancora molto più facile che mantenendo un sacco di apparecchi.

Calendario:

  • difficile da mantenere relazioni (soprattutto molti-a-molti);
  • runtime suite di test di solito è più lento a causa di più DB colpisce;
  • test sono molto sensibili ai cambiamenti di schema.

Fabbriche:

  • si stub tutto quello che non si prova a prova di unità in corso;
  • a preparare le entità che si sta verificando con le fabbriche. Questo è dove le fabbriche mostrano il loro vero vantaggio - è facile da configurare nuovi casi di test, in quanto non è necessario per mantenere una tonnellata di YAML-files per questo;
  • ci si concentra sui test. Se i test richiedono mutato scenario, non spostare la vostra mentalità. Finché stub sono ragionevoli e le fabbriche sono facilmente personalizzabili, si dovrebbe andare bene.

Quindi, fabbriche sembrano un buon modo per andare. Gli unici inconvenienti possibili che vedo, sono i seguenti:

  • tempo dedicato alla migrazione da infissi;
  • mantenendo una serie di scenari sano può richiedere un certo sforzo.

Altri suggerimenti

La risposta di Oleg è grande, ma mi permetta di offrire il punto di vista di qualcuno che sta usando sia.

Infissi sono sorta di stato il capro espiatorio della comunità Rails per un po '. Tutti capiscono gli inconvenienti di infissi, ma nessuno è davvero paladino loro punti di forza. Nella mia esperienza, le fabbriche di per sé può diventare facilmente altrettanto difficile da mantenere come infissi (in realtà dipende lo schema, ma sto divagando). La vera forza di fabbriche è in sostituzione selettiva del dolore fixture-based. Parliamo di un paio di dettagli.

Il primo problema è la prestazione. Se è possibile testare la maggior parte della vostra applicazione senza colpire il database poi si vedrà una significativa velocità, ma per la maggior parte delle applicazioni non credo che sia saggio per testare senza colpire il database del tutto. Ad un certo punto si desidera testare l'intero stack. Ogni volta che si deridere o stub si stanno facendo una supposizione su un'interfaccia che può contenere bug sottili. Così, partendo dal presupposto che è necessario colpire il database su alcuni significativi percentuale di test, infissi transazionali ( sono con apparecchi transazionali giusto?) Potrebbe essere molto molto più veloce di un'istanza di un intero ambiente per ogni prova.

direi, con la dimensione della vostra suite di test che si ha realmente bisogno di guardare verso Continuous Integration per scalare il vostro sviluppo al livello successivo. Non importa quanto a velocizzare in su, è ancora molto tempo per gli sviluppatori di aspettare. Forse guardare autotest anche per aiutare a livello individuale. Ma in ultima analisi CI sta andando per consentire di mantenere la disciplina di test senza sacrificare l'agilità di sviluppo.

Il luogo in cui infissi davvero brillare è in fase di test funzionali / integrazione. Il mio modo di vedere le cose è che i dispositivi dovrebbero creare uno stato di base per la salute per l'applicazione da testare. La maggior parte dei test di unità in realtà non hanno bisogno di questo. È possibile ottenere una buona copertura dell'unità utilizzando fabbriche. Tuttavia quando si tratta di test funzionali, ogni pagina può essere colpire decine di modelli. Non voglio impostare tutta quella roba in ciascuna prova. Come ho costruire scenari sempre più complessi, sto diventando sempre più vicino a ricreare uno stato globale dei dati che è esattamente che cosa infissi sono stati progettati per fare in primo luogo.

Una discutibile convinzione ritengo è che tutto il resto sia uguale, preferisco un test funzionale a 20 test di unità (utilizzando Rails gergo). Perché? Poiché il test funzionale dimostra che il risultato finale che viene inviato all'utente sia corretto. I test di unità sono grandi per ottenere in sfumature di funzionalità, ma alla fine della giornata, si potrebbe ancora avere un bug lungo un'interfaccia che rompe l'intero sito. I test funzionali sono ciò che mi danno la fiducia che colpisce distribuire senza realmente caricare la pagina nel browser. So che avrei potuto stub tutto e testare entrambe le interfacce e ottenere la stessa copertura, ma se riesco a testare l'intero stack in un semplice test a scapito di un po 'di CPU, mi piacerebbe molto meglio farlo.

Quindi quali sono i miei migliori pratiche per infissi?

  • Imposta una manciata per ogni modello di coprire le più ampie categorie di dati
  • Quando si aggiunge una nuova importante funzione che attraversa molti modelli e controllori, aggiungere alcuni nuovi infissi per rappresentare i maggiori stati
  • Evitare la modifica di vecchi infissi, tranne per l'aggiunta / rimozione di campi
  • Utilizzare fabbriche per più piccolo / variazioni più localizzati
  • Utilizzare fabbriche per l'impaginazione test o altra creazione di massa che è necessaria solo per alcuni test

Inoltre, mi permetta di consiglio Jay Fields' blog per davvero un buon consiglio test pragmatico. La cosa che mi piace di più di blog di Jay è che ha sempre Acknowledges che il test è molto specifica per il progetto, e ciò che funziona per un progetto non funziona necessariamente per un altro. E 'a corto di dogmi e lunga sul pragmatismo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top