10 Sekunden sind eine sehr lange Zeit, um einen einzelnen Test auszuführen. Mein Bauchgefühl ist, dass Ihr Spezifikationsziel gleichzeitig Unit- und Integrationstests ausführt. Dies ist eine typische Sache, in die Projekte fallen, und irgendwann müssen Sie diese technische Verschuldung überwinden, wenn Sie mehr und schneller produzieren möchten. Es gibt eine Reihe von Strategien, die Ihnen dabei helfen können ... und ich werde einige empfehlen, die ich in der Vergangenheit verwendet habe.
1. Trennen Sie die Einheit von den Integrationstests
Das erste, was ich tun würde, ist, die Einheit von den Integrationstests zu trennen. Sie können dies entweder tun durch:
- Verschieben (in separate Ordner unter dem Spezifikationsverzeichnis) - und Ändern der Rake-Ziele
- Markieren Sie sie (mit rspec können Sie Ihre Tests markieren)
Die Philosophie besagt, dass Sie möchten, dass Ihre regulären Builds schnell sind - sonst sind die Leute nicht allzu glücklich, sie oft auszuführen. Also zurück in dieses Gebiet. Lassen Sie Ihre regelmäßigen Tests schnell laufen und verwenden Sie einen kontinuierlichen Integrationsserver, um den vollständigeren Build auszuführen.
Ein Integrationstest ist ein Test, der externe Abhängigkeiten beinhaltet (z. B. Datenbank, WebService, Warteschlange und einige würden FileSystem argumentieren). Ein Komponententest testet nur das spezifische Codeelement, das Sie überprüfen möchten. Es sollte schnell laufen (9000 in 45 Sekunden sind möglich), dh das meiste sollte im Speicher laufen.
2. Konvertieren Sie Integrationstests in Komponententests
Wenn der Großteil Ihrer Komponententests kleiner als Ihre Integrationstestsuite ist, liegt ein Problem vor. Dies bedeutet, dass Inkonsistenzen leichter auftreten. Erstellen Sie ab hier weitere Komponententests, um Integrationstests zu ersetzen. Sie können Folgendes tun, um diesen Prozess zu unterstützen:
- Verwenden Sie anstelle der eigentlichen Ressource ein Spott-Framework. Rspec verfügt über ein eingebautes Verspottungs-Framework.
- Führen Sie rcov in Ihrer Unit-Test-Suite aus. Verwenden Sie diese Option, um festzustellen, wie gründlich Ihre Unit-Test-Suite ist.
Wenn Sie einen oder mehrere geeignete Komponententests zum Ersetzen eines Integrationstests haben, entfernen Sie den Integrationstest. Doppelte Tests verschlimmern die Wartung nur.
3. Verwenden Sie keine Geräte
Spielpaarungen sind böse. Verwenden Sie stattdessen eine Fabrik (Maschinist oder Factorybot). Diese Systeme können anpassungsfähigere Datengraphen erstellen und, was noch wichtiger ist, speicherinterne Objekte erstellen, die Sie verwenden können, anstatt Dinge aus einer externen Datenquelle zu laden.
4. Fügen Sie Überprüfungen hinzu, um zu verhindern, dass Komponententests zu Integrationstests werden
Jetzt, da Sie schnellere Tests durchgeführt haben, ist es Zeit, Überprüfungen durchzuführen, um zu verhindern, dass diese erneut auftreten.
Es gibt Bibliotheken, die Affen aktiv patchen, um einen Fehler auszulösen, wenn versucht wird, auf die Datenbank zuzugreifen (UnitRecord).
Sie können auch Pairing und TDD ausprobieren, um Ihr Team zu zwingen, schnellere Tests zu schreiben, weil:
- Jemand überprüft - damit niemand faul wird
- Eine ordnungsgemäße TDD erfordert eine schnelle Rückmeldung. Langsame Tests machen das Ganze nur schmerzhaft.
5. Verwenden Sie andere Bibliotheken, um das Problem zu lösen
Jemand erwähnte Spork (beschleunigt die Ladezeiten für die Testsuite unter Rails3), hydra / parallel_tests - um Unit-Tests parallel (über mehrere Kerne hinweg) durchzuführen.
Dies sollte wahrscheinlich LETZT verwendet werden. Ihr eigentliches Problem ist in Schritt 1, 2, 3 zu lösen. Lösen Sie das Problem, und Sie sind besser in der Lage, zusätzliche Infrastrukturen auszurollen.