2009-06-15 8 views
3

Unit-Tests Bei der Gestaltung, von dem, was ich Ihnen zu diesen Prinzipien bleiben sollte gelesen haben versuchen:Ist es fair zu sagen, dass eine hohe Codeabdeckung und hohe Leistung für einen gut gestalteten Komponententest nicht benötigt werden?

  • Isolieren Sie Ihre Tests voneinander
  • -Test nur
  • sicher ein einzelnes Verhalten zu einer Zeit, Make der Test ist wiederholbar

auf der anderen Seite, diese Eigenschaften scheinen nicht immer mit einem guten Test zu korrelieren:

  • Hohe Codeabdeckung
  • Hochleistungs

Ist das ein fairer Ansatz?

Antwort

1

Leistung ist bei Komponententests in der Regel kein Thema. Hohe Codeabdeckung ist. Sie schreiben einzelne Tests, um eine einzelne Funktion eng zu testen. Sie schreiben genügend (enge) Komponententests, um die meisten Ihrer Funktionen abzudecken.

+0

Wenn Leistung * für Sie ein Problem darstellt, sollten Sie sich über die Teile des Prozesses lustig machen, die derzeit nicht getestet werden (z. B. Datenbankzugriff oder Remote-Serveraufrufe). Dies hat den zusätzlichen Vorteil, dass der Testumfang reduziert wird Verbesserung der Leistung. –

1

Ich würde sagen, dass einzelne Unit-Tests mehr als wahrscheinlich nicht ein großes Stück Code abdecken werden, da dies den Zweck vereitelt, also ja, ich würde Ihrem ersten Punkt zustimmen.

Jetzt, wie für High Performance, ist dies keine "Notwendigkeit" Ich denke jedoch, wenn Sie ein System mit Hunderten von Tests entwickeln, möchten Sie sie so effizient wie möglich tun, so dass Sie Ihre Tests schnell ausführen können .

0

Auf die Frage rereading:

Zum ersten Punkt, eine Suite von Unit-Tests hohe Code-Abdeckung haben sollte, aber nicht unbedingt auf die Performance konzentrieren. Ein einzelner Komponententest sollte relativ klein sein in Bezug darauf, wie viel Code abgedeckt ist. Eine Zelle bedeckt nicht deinen Körper, aber eine Gruppe von ihnen bildet Haut, die den größten Teil des menschlichen Körpers bedeckt, wäre eine biologische Metapher, wenn du eine willst.

0

Ja, ich denke, es ist fair, das zu sagen. Sie können immer eine hohe Codeabdeckung erreichen, indem Sie viele verschiedene Tests erstellen.

1

Hohe Codeabdeckung ist eher ein Hinweis darauf, wie weit Sie Ihre Codebasis getestet haben, dh ob Sie alle in Ihrem System möglichen Codepfade getestet haben usw. Sie geben keinen Hinweis auf die Qualität einzelner Tests, aber ist eine Metrik, um die Qualität Ihrer Komponententests als Ganzes zu messen.

Für hohe Leistung müssen Sie Ihre Tests kategorisieren und die Tests trennen, die Ihre Datenbank oder andere Dienste mit hoher Latenz berühren. Halten Sie Ihre Leistungstests in einer separaten Kategorie. Stellen Sie außerdem sicher, dass Sie nach Integration (oder End-to-End-Tests) Ausschau halten, z. B. nach einem Test, bei dem ein Webbrowser geöffnet, die Antwort gepostet und anschließend überprüft wird. Wenn Sie dies tun, brauchen Sie sich keine Gedanken über die Leistung Ihrer Tests zu machen.

0

Beide Leistungen & Abdeckung sind die Ziele der gesamten Testsuite. Jeder einzelne Test sollte nicht versuchen, so viel Abdeckung wie möglich zu "ergattern", noch sollte er sich mit der Leistung befassen.

Wir möchten, dass die ganze Testsuite in einer vernünftigen Zeit läuft und die meisten Code-Funktionen abdecken sollte, aber nicht um den Preis von "ba" Unit-Tests.

0

Hohe Codeabdeckung: Für einen einzelnen Komponententest muss er nicht 100% der zu testenden Methode oder Methoden abdecken. Schließlich muss die Gesamtheit der Komponententests so viele Methoden oder Methoden abdecken, wie Sie es für wichtig halten. Könnte 1% sein, könnte 100% sein und es ist wahrscheinlich für verschiedene Codeabschnitte unterschiedlich.

Ich versuche im Allgemeinen für 70% -80% Abdeckung, und dann mehr Aufmerksamkeit auf den Trend der Deckung als auf den tatsächlichen Wert.

Hohe Leistung: Wichtiger als die Geschwindigkeit eines einzelnen Unit-Test ist die Zeit, die alle Tests in der Suite laufen. Wenn es zu lange dauert, können Entwickler entscheiden, sie nicht so oft auszuführen. Aber Sie können es sich oft nicht leisten, viel Zeit für die Optimierung zu investieren, besonders wenn es um Komponententests geht. Sie brauchen die gesamte Suite, um schnell genug zu laufen.

Es ist nicht ungewöhnlich für ein System, in dem ich bin, Hunderte von Komponententests zu haben, und immer noch in 2 Minuten laufen. Ein wirklich langsamer Test oder eine Reihe von etwas langsamen Tests kann den Build-Test-Refactor-Zyklus wirklich verlangsamen.

1

Abdeckung ist keine (sinnvolle) Eigenschaft einzelner Tests. Wie Sie sagen, sollte ein Test nur ein einziges Verhalten abdecken. Die Performance ist, obwohl sie (insgesamt) nur in ihrer Gesamtheit signifikant ist, sehr wichtig, und hier ist der Grund.

Wir führen Tests aus vielen Gründen durch. Je weniger Barrieren es gibt, sie zu schreiben und auszuführen, desto mehr Tests werden wir durchführen - und desto besser wird unsere Codeabdeckung sein. Wenn wir keine Tests durchführen, weil es zu viel Mühe macht - führen wir keine Tests durch; wir entdecken unsere Käfer nicht; unsere Produktivität leidet. Sie sollten also automatisiert sein (keine Probleme). Wenn wir keine Tests durchführen, weil es Zeit braucht, um zu programmieren - oder weil die Zeit, die sie brauchen, uns von dem Problem ablenkt, konzentriert sich unsere Konzentration: Wir führen keine Tests durch; wir entdecken unsere Käfer nicht; unsere Produktivität leidet. Sie sollten also schnell genug sein, damit sie nicht ablenken. Wenn unsere Tests das Dateisystem oder die Datenbank stark treffen, werden sie langsamer und wir werden sie weniger ausführen. Also vermeide das; abstrahiere die langsamen Bits weg. Testen Sie früh und oft. Testlose Wenn sie langsam sind, werden Sie nicht. Also halte sie schnell.

1

Jeder Komponententest sollte sich auf das Testen eines einzelnen Verhaltens konzentrieren, daher sollte die Codeabdeckung eines Komponententests idealerweise sehr klein sein. Dann, wenn Sie Hunderte und Tausende solcher sehr fokussierten Tests haben, sollte ihre Gesamtabdeckung hoch sein.

Leistung ist nicht und ist wichtig.

Die Leistung ist nicht wichtig in dem Sinne, dass keine Mikrooptimierungen durchgeführt werden sollten. Sie sollten sich zunächst auf die Lesbarkeit der Tests konzentrieren. Zum Beispiel enthält das Buch Clean Code ein Beispiel für Tests, die den Zustand eines Temperaturalarms verifiziert haben. Ursprünglich hatte jeder Test einige fünf Bestätigungen, die Booleans wie assertTrue(hw.heaterState()) überprüfen, aber die Behauptungen wurden dann zu einem String-Vergleich assertEquals("HBchL", hw.getState()) refaktoriert, wobei Großbuchstaben aktiviert und Kleinbuchstaben deaktiviert bedeutet. Der letztere Code hat eine geringere Leistung, weil er einige zusätzliche Zeichenfolgen erzeugt und vergleicht, aber seine Lesbarkeit ist viel besser, daher ist es besser Testcode.

Die Leistung ist in dem Sinne wichtig, dass alle Komponententests schnell, hunderte oder tausende von Tests pro Sekunde ausgeführt werden sollten (ich bevorzuge im Durchschnitt weniger als 1 ms pro Test). Sie sollten in der Lage sein, alle Ihre Komponententests in wenigen Sekunden auszuführen. Wenn die Tests so lange dauern, dass Sie zögern, sie auszuführen, nachdem Sie eine kleine Änderung vorgenommen haben, und stattdessen führen Sie sie nur aus, wenn Sie mehr Kaffee trinken, dann brauchen sie zu lange Zeit.Wenn die Testsuite langsam ist, sollten Sie Abhängigkeiten zu anderen Komponenten aufbrechen und nachahmen, damit das zu testende System so klein wie möglich ist. Insbesondere sollten die Komponententests keine Datenbank verwenden, da sie dadurch hoffnungslos langsam werden.

Zusätzlich zu Komponententests sind auch Integrations-/Akzeptanztests erforderlich, die das System als Ganzes testen. Sie haben eine andere Rolle in der Entwicklung als Komponententests, so dass es akzeptabel ist, dass die Akzeptanztestsuite langsam ist (kein Wortspiel beabsichtigt). Sie sollten mindestens einmal am Tag vom Continuous Integration Server ausgeführt werden.