10 secondi sono un tempo molto lungo per l'esecuzione di un singolo test. La mia sensazione viscerale è che il tuo obiettivo specifico stia eseguendo test di unità e di integrazione contemporaneamente. Questa è una cosa tipica in cui cadono i progetti e ad un certo punto, dovrai superare questo debito tecnico se vuoi produrre di più, più velocemente. Ci sono una serie di strategie che possono aiutarti a farlo ... e ne consiglierò alcune che ho usato in passato.
1. Separare l'unità dai test di integrazione
La prima cosa che vorrei fare è separare l'unità dai test di integrazione. Puoi farlo in uno dei seguenti modi:
- Spostandoli (in cartelle separate nella directory spec) e modificando i target di rake
- Taggarli (rspec ti consente di taggare i tuoi test)
La filosofia è che vuoi che le tue build regolari siano veloci, altrimenti le persone non saranno troppo felici di eseguirle spesso. Quindi torna in quel territorio. Fai in modo che i tuoi test regolari vengano eseguiti rapidamente e utilizza un server di integrazione continua per eseguire la build più completa.
Un test di integrazione è un test che coinvolge dipendenze esterne (ad esempio Database, WebService, Queue e alcuni potrebbero sostenere FileSystem). Uno unit test verifica solo l'elemento di codice specifico che si desidera controllare. Dovrebbe funzionare velocemente (9000 in 45 secondi è possibile), cioè la maggior parte dovrebbe funzionare in memoria.
2. Convertire i test di integrazione in test unitari
Se la maggior parte dei tuoi unit test è inferiore alla tua suite di test di integrazione, hai un problema. Ciò significa che le incongruenze inizieranno ad apparire più facilmente. Quindi, da qui, inizia a creare più unit test per sostituire i test di integrazione. Le cose che puoi fare per aiutare in questo processo sono:
- Usa un quadro beffardo invece della vera risorsa. Rspec ha un framework beffardo integrato.
- Esegui rcov sulla tua suite di unit test. Usalo per valutare quanto è approfondita la tua suite di unit test.
Dopo aver eseguito uno o più unit test appropriati per sostituire un test di integrazione, rimuovere il test di integrazione. I test duplicati peggiorano solo la manutenzione.
3. Non utilizzare dispositivi
Gli infissi sono malvagi. Usa invece una fabbrica (macchinista o factorybot). Questi sistemi possono creare grafici di dati più adattabili e, cosa più importante, possono creare oggetti in memoria che è possibile utilizzare, piuttosto che caricare elementi da un'origine dati esterna.
4. Aggiungere controlli per arrestare i test unitari che diventano test di integrazione
Ora che hai in atto test più veloci, è tempo di inserire controlli per FERMARE che ciò si verifichi di nuovo.
Esistono librerie in cui il record attivo della patch di scimmia genera un errore quando si tenta di accedere al database (UnitRecord).
Puoi anche provare l'associazione e il TDD che possono aiutare a costringere il tuo team a scrivere test più veloci perché:
- Qualcuno sta controllando, quindi nessuno diventa pigro
- Un TDD corretto richiede un feedback veloce. I test lenti rendono l'intera cosa dolorosa.
5. Utilizzare altre librerie per superare il problema
Qualcuno ha menzionato spork (accelera i tempi di caricamento per la suite di test sotto rails3), hydra / parallel_tests - per eseguire unit test in parallelo (su più core).
Questo dovrebbe probabilmente essere usato ULTIMO. Il tuo vero problema risiede nel passaggio 1, 2, 3. Risolvilo e sarai in una posizione migliore per sfruttare l'infrastruttura aggiuntiva.