Einheit die Geschwindigkeit der Testausführung (wie viele tests pro Sekunde?)
Welche Art der Hinrichtung beurteilen Sie, tun Sie wollen mit Ihrer unit-tests (# test pro Sekunde)? Wie lange ist zu lange für einen einzelnen unit-test?
Wäre ich daran interessiert zu wissen, wenn die Menschen haben keine spezifischen Schwellenwerte für die Bestimmung, ob Ihre tests sind zu langsam, oder ist es nur, wenn die Reibung einer lang andauernden test-suite bekommt das bessere von Euch?
Schließlich, wenn Sie entscheiden, die tests brauchen, um schneller zu laufen, was Techniken, die Sie verwenden, um die Geschwindigkeit Ihres tests?
Hinweis: integration-tests sind natürlich eine andere Sache wieder. Wir sind streng sprechen unit-tests ausgeführt werden müssen-so oft wie möglich.
Antwort roundup: vielen Dank für die tollen Antworten bisher. Die meisten Beratung scheint zu sein, Mach dir keine sorgen über die Geschwindigkeit-konzentrieren Sie sich auf Qualität und nur selektiv ausgeführt werden können, wenn Sie zu langsam. Antworten mit konkreten zahlen enthalten, mit dem Ziel für <10ms bis zu 0,5 und 1 Sekunde pro test, oder einfach, um die gesamte suite von Häufig führen Sie tests unter 10 Sekunden.
Nicht sicher, ob es richtig ist, markieren Sie einen als "akzeptierte Antwort", wenn Sie alle hilfreich 🙂
- 1 Sekunde pro test bedeutet, dass Ihr test-suite wird schnell den Punkt erreichen, wo Sie aufhören, es läuft die ganze Zeit, weil es zu langsam arbeitet. Wenn Sie, können Sie laufen 100 tests/sec führen Sie die suite viel häufiger, als wenn es dauert 100-mal länger.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle unit-tests laufen sollte in unter einer Sekunde (das ist alle unit-tests kombiniert ausgeführt werden soll in 1 Sekunde). Nun, ich bin sicher, das hat praktische Grenzen, aber ich habe ein Projekt mit einer 1000 tests, führen diese schnell auf einem laptop. Du wirst wirklich wollen, dass diese Geschwindigkeit, so dass Ihre Entwickler nicht fürchten refactoring einige core-Teil des Modells (D. H., laß mich gehen, Holen sich einen Kaffee, während ich diese tests ausführen...10 Minuten später kommt er zurück).
Diese Anforderung zwingt auch Sie bei der Gestaltung Ihrer Anwendung. Es bedeutet, dass Ihre domain-Modell ist rein und enthält null-Referenzen zu jeder Art von Dauer (Datei-I/O, Datenbank, etc). Unit-tests sind alle über Tests, die diese Unternehmen relatonships.
Nun, das bedeutet nicht, Sie ignorieren das testen Ihrer Datenbank oder Persistenz. Aber diese Probleme sind jetzt isoliert hinter repositories, kann separat getestet mit Integrationstests, die sich in einem separaten Projekt. Führen Sie Ihre unit-tests ständig beim schreiben-domain-code und führen Sie dann die integration-tests einmal am check-in.
Wenn wir reden streng unit-tests, würde ich Ziel, mehr der Vollständigkeit halber als die Geschwindigkeit. Wenn die Zeit beginnt zu verursachen Reibung, trennen Sie den test in den verschiedenen Projekt - /Klassen etc., und nur führen Sie die tests in Bezug auf was Sie gerade arbeiten. Lassen Sie den Integration server führen Sie alle tests auf "checkin".
Ziel ist es 100te von tests pro Sekunde. Die Art und Weise, die Sie dort bekommen, ist durch die folgenden Michael Feder ' s Regeln von unit-tests.
Einem wichtigen Punkt, kam in eine Vergangenheit CITCON Diskussion ist, dass, wenn Ihre tests sind nicht schnell, es ist sehr wahrscheinlich, dass Sie nicht immer die Vorteile der Ausführung von unit-Tests.
Ich konzentrieren uns mehr auf die Lesbarkeit von meinen tests als die Geschwindigkeit. Jedoch, ich versuche immer noch, um Sie einigermaßen schnell. Ich denke, wenn Sie laufen in der Größenordnung von Millisekunden, Sie sind in Ordnung. Wenn Sie führen Sie eine zweite oder mehr pro test... dann sind Sie vielleicht etwas zu tun, die optimiert werden sollten.
Langsame tests nur zu einem problem geworden, wie das system reift und bewirkt, dass der build zu nehmen, Stunden, an welcher Stelle Sie sind mehr wahrscheinlich in einer Ausgabe von einer Menge von langsamen tests eher als ein oder 2 tests aus, die Sie optimieren können, problemlos... so sollte man wohl achten, sofort, wenn Sie sehen, viele tests mit Hunderten von Millisekunden jeden (oder noch schlimmer, Sekunden), anstatt zu warten, bis es bekommt, um die Hunderte von tests unter, dass der lange Punkt (an dem Punkt ist es wirklich schwer, das problem zu lösen).
Selbst so, es wird nur reduziert die Zeit zwischen, wenn Ihre automatisierten build-Probleme, Fehler..., das ist ok, wenn es eine Stunde später (oder sogar ein paar Stunden später), denke ich. Das problem ist, Sie vor dem check-in, aber dies kann vermieden werden durch Auswahl einer kleinen Teilmenge der tests ausführen, die im Zusammenhang mit was Sie arbeiten. So stellen Sie sicher, beheben die bauen, wenn Sie check-in-code, der Pausen-tests, die Sie nicht ausführen!
Sind wir derzeit bei 270 tests in rund 3.etwas Sekunden. Es sind wohl um die 8 tests, die Sie durchführen, Datei IO.
Diese laufen automatisch nach einem erfolgreichen Aufbau unserer Bibliotheken auf alle Ingenieure Maschine. Wir haben mehr umfangreiche (und zeitaufwendig) smoke-Tests, die getan wird durch die build-Maschine jede Nacht, oder kann manuell gestartet werden, die auf ein Ingenieure Maschinen.
Wie Sie sehen können, die wir noch nicht erreicht, das problem von tests, die zu zeitaufwendig ist. 10 Sekunden für mich ist der Punkt, wo es beginnt zu aufdringlich, wenn wir beginnen zu nähern, dass es dann etwas sein, was wir sehen. Wir werden wahrscheinlich verschieben der unteren Ebene Bibliotheken, die robuster sind, da Sie sich selten ändern und haben einige Abhängigkeiten, in die nightly builds, oder eine Konfiguration, wo Sie sind, nur ausgeführt, indem die Maschine bauen.
Wenn Sie finden, dass es mehr als ein paar Sekunden laufen Hunderte von tests müssen Sie möglicherweise zu prüfen, was Sie zu klassifizieren, als eine Einheit zu testen und ob es besser wäre, behandelt wie ein Rauch-test.
Ihre Laufleistung wird natürlich sehr variabel, je nach Ihrer Entwicklung.
Daten Punkt-Python Regression Tests
Hier sind die zahlen auf meinem laptop für das ausführen von "make test" für Python 2.5.2:
Beurteile ich meine unit-tests werden auf einer pro-basis von Stichproben, nicht durch die Anzahl der tests pro Sekunde. Das rate ich Ziel ist 500 MS oder weniger. Wenn es oben ist, werde ich schauen in den test, um herauszufinden, warum es so lange gedauert hat.
Wenn ich denke, ein test ist zu langsam, es in der Regel bedeutet, dass es zu viel zu tun. Deshalb, so die Umgestaltung der test durch die Aufteilung in mehrere tests in der Regel funktioniert der trick. Das andere mal, dass ich bemerkt habe meine tests laufen langsam ist, wenn der test zeigt, dass ein Engpass in meinem code, dann ein refactoring der code ist in Ordnung.
Es wurde ein guter Artikel auf dieser von der Kraft Der Zwei Spiele, die Autoren von UnitTest++.
Ich würde sagen, es kommt auf die compile-Geschwindigkeit. Man in der Regel führt die tests bei jedem kompilieren. Das Ziel der unit-Tests ist nicht zu verlangsamen, aber eine Nachricht zu überbringen "nichts gebrochen, gehen Sie auf" (oder "etwas brach, STOPPEN").
Ich nicht die Mühe, über die Geschwindigkeit der Testausführung, bis dieses etwas, das beginnt, ärgerlich.
Die Gefahr ist beendet, die Prüfungen, weil Sie zu langsam sind.
Erste, was zu tun ist, um zu verwalten, um herauszufinden, warum Sie sind zu langsam, und , ob der Fehler in der unit-tests oder in den code unter test ?
Ich würde versuchen zu brechen in der test-suite in mehrere logische Teile, läuft nur der Teil der angeblich betroffen von dem code, den ich verändert bei jedem kompilieren. Ich würde laufen, die anderen Suiten weniger Häufig, vielleicht einmal am Tag, oder wenn Sie Zweifel hätte ich etwas gebrochen, und mindestens vor der Integration.
Einige frameworks ermöglichen die automatische Ausführung bestimmter unit-tests, basierend auf Heuristiken, wie zuletzt-geändert-Datum. Für Ruby und Rails, AutoTest ermöglicht die schnellere und ansprechende Durchführung der tests-wenn ich sparen Schienen-Modell
app/models/foo.rb
die entsprechenden unit-tests intest/unit/foo_test.rb
laufen zu bekommen.Ich weiß nicht, ob etwas ähnliches existiert auch für andere Plattformen, aber es würde Sinn machen.
Einer der wichtigsten Regeln über unit-tests ist, dass Sie ausführen sollten, schnell.
Entwickler sollte in der Lage sein, um ausführen die gesamte suite von unit-tests in Sekunden, und definitiv nicht in Minuten und Minuten. Entwickler sollten in der Lage sein, schnell zu laufen, Sie nach dem ändern der code trotzdem. Wenn es zu lange dauert, Sie nicht die Mühe mit Ihnen, und Sie verlieren einen der wichtigsten Vorteile des tests.
Sollte das Ziel für jeden test zu laufen, in einer Größenordnung von Millisekunden alles über 1 Sekunde ist wahrscheinlich testen zu viel.
Wir haben derzeit rund 800 tests, ausgeführt in unter 30 Sekunden von 27 tests pro Sekunde. Dies beinhaltet die Zeit zum starten der mobile emulator benötigt, um Sie auszuführen. Die meisten von Ihnen, jeder von 0-5ms (wenn ich mich richtig erinnere).
Wir haben ein oder zwei, die dauert etwa 3 Sekunden, das sind wahrscheinlich die Kandidaten für die Prüfung, aber das wichtigste ist, die gesamte test-suite nicht so lange dauern, dass es bringt Entwickler es läuft, und nicht wesentlich verlangsamen unsere continuous integration build.
Wir haben auch eine konfigurierbare timeout-limit auf 5 Sekunden eingestellt-alles dauert länger, wird scheitern.