Frage

Mock Frameworks, z.B. EasyMock, machen es einfacher Dummy Abhängigkeiten Plugin. Having said that, sie zu gewährleisten, verwenden, wie die verschiedenen Methoden auf bestimmte Komponenten genannt werden (und in welcher Reihenfolge) mir schlecht zu sein scheint. Es macht das Verhalten zu Testklasse, die es schwieriger zu Produktionscode zu halten macht. Und ich sehe nicht den Nutzen wirklich; mental fühle ich mich wie ich bin zu einem schweren Ball angekettet worden.

Ich mag viel lieber nur Test gegen Schnittstelle, Testdaten als Input geben und das Ergebnis zu behaupten. Noch besser wäre es, einige Test-Tool zu verwenden, die Testdaten für die Überprüfung bestimmte Eigenschaft automatisch erzeugt. z.B. ein Element zu einer Liste hinzufügen und entfernen es sofort ergibt die gleiche Liste.

In unserem Arbeitsplatz verwenden wir Hudson, die Testabdeckung gibt. Leider macht es einfach blind besessen zu bekommen, dass alles getestet wird. Ich fühle mich stark, dass man nicht alles testen soll, wenn man will, auch im Wartungsmodus, produktiv sein. Ein gutes Beispiel wäre Controller in Web-Frameworks sein. Wie allgemein sollten sie sehr wenig Logik enthalten, mit Mock Rahmen testen, die Controller nennen solche und solche Verfahren insbesondere um in meiner ehrlichen Meinung unsinnig sind.

Lieber SOers, was sind Ihre Meinungen dazu?

War es hilfreich?

Lösung

Es hängt davon ab, wie Sie die Domain (s) Ihres Programms modellieren.

Wenn Sie die Domänen in Bezug auf den Daten in Datenstrukturen und Methoden gespeichert modellieren, die Daten aus einer Datenstruktur und speichern abgeleiteten Daten in einer anderen Datenstruktur lesen (Prozeduren oder Funktionen je nachdem, wie Verfahrens- oder Funktions Ihr Design ist), dann Mock-Objekte nicht geeignet sind. Sogenannte „state-based“ Testen ist das, was Sie wollen. Das Ergebnis Sie interessieren ist, dass ein Verfahren, um die richtigen Daten in den richtigen Variablen bringt und was es ruft also Detail nur eine Implementierung geschehen.

Wenn Sie die Domänen in Bezug auf die Message-Passing-Modell Kommunikationsprotokolle, mit denen Objekte zusammenarbeiten, dann werden die Protokolle sind das, was Ihnen wichtig sind und welche Daten die Objekte speichern, ihr Verhalten in den Protokollen zu koordinieren, in denen sie Rollen spielen, ist nur die Umsetzung Detail. In diesem Fall sind Mockobjekte das richtige Werkzeug für den Job und zustandsbasierten Test Beziehungen der Tests zu eng an unwichtigen Details der Implementierung.

Und in den meisten objektorientierten Programmen gibt es eine Mischung von Stilen. Einige Code rein funktional geschrieben werden, unveränderlich Datenstrukturen zu transformieren. Anderer Code wird das Verhalten von Objekten sein, die Koordination, die ihren verborgenen, inneren Zustand im Laufe der Zeit ändern.

Wie bei hohen Testabdeckung, es macht Dir wirklich nicht so viel sagen. Low Testabdeckung zeigt Ihnen, wo Sie unzureichende Tests haben, aber hohe Testabdeckung nicht zeigen Ihnen, dass der Code ist ausreichend getestet. Die Tests können zum Beispiel durch Codepfade laufen und so die Abdeckung Statistiken erhöhen, aber eigentlich keine Aussagen darüber treffen, was diese Codepfade haben. Auch, was wirklich zählt, ist, wie die verschiedenen Teile des Programms in Kombination verhalten, die Einheit Testabdeckung wird Ihnen nicht sagen. Wenn Sie überprüfen möchten, dass Ihre Tests wirklich Verhalten testen Ihres Systems ausreichend könnten Sie eine Mutation Testing-Tool verwenden. Es ist ein langsamer Prozess, so ist es etwas, das Sie in einem Nightly Build laufen würden, anstatt auf jedem Check-in.

Andere Tipps

Ich lese 2 Fragen:

Was ist Ihre Meinung ist, dass bestimmte Methoden auf Komponenten Prüfung wird in einer bestimmten Reihenfolge genannt?

Ich habe Foul dies in der Vergangenheit gefallen. Wir verwenden viel mehr „Anstoßen“ und viel weniger „spöttisch“ in diesen Tagen. Wir versuchen, Unit-Tests zu schreiben, die nur eine Sache testen. Wenn wir dies tun ist es normalerweise möglich, einen sehr einfachen Test zu schreiben, die aus Stummeln Wechselwirkungen mit den meisten anderen Komponenten. Und wir behaupten sehr selten zu sehen. Dies hilft, die Tests weniger spröde zu machen.

Tests, die Prüfung nur eine Sache, ist leichter zu verstehen und zu warten.

Auch, wenn Sie sich selbst zu finden, die viele Erwartungen für Wechselwirkungen mit vielen Komponenten schreiben es auch ein Problem in dem Code könnte man sowieso zu testen ist. Wenn es schwierig ist, zu halten, testet der Code Sie testen können oft Refactoring werden.

Sollte man mit Testabdeckung besessen sein?

Wenn das Gerät Schreiben von Tests für eine bestimmte Klasse bin ich ziemlich besessen von Testabdeckung. Es macht es wirklich einfach, wichtige Bits von Verhalten zu erkennen, dass ich nicht getestet haben. Ich kann auch ein Urteil Anruf über die Bits Ich brauche nicht zu decken.

Insgesamt Einheit Testabdeckung Statistiken? Nicht besonders daran interessiert, solange sie hoch sind.

100% Einheit Testabdeckung für ein ganzes System? Nicht interessiert an allen.

Ich bin damit einverstanden - ich bin für stark gegenüber staatlicher Überprüfung stützt mich eher als Verhalten Prüfung (eine freie Interpretation von klassische TDD während noch Test verdoppelt).

Das Buch The Art of Unit Testing in diesen Bereichen viele gute Ratschläge hat.

100% Testabdeckung, GUI-Tests, Test Getter / Setter oder andere nicht-Logik-Code, scheinen usw. unwahrscheinlich guten ROI zu liefern. TDD liefert hohe Testabdeckung auf jeden Fall. Testen Sie, was könnte brechen.

hatte ich eine ähnliche Frage gefragt, wie viel Unit Testing a gute Sache , die helfen könnten, eine Vorstellung von der Vielfalt der Testebene Menschen fühlen sich zu geben, sind angemessen.

  1. Was ist die Wahrscheinlichkeit, dass bei der Wartung Ihres Codes einige Nachwuchskraft den Teil des Codes wird durchbrechen, die „Controller Anrufe solche und solche Verfahren insbesondere um“?

  2. läuft
  3. Was sind die Kosten für Ihre Organisation, wenn so etwas geschieht - in Produktionsausfall, Debugging / Fixierung / Re-Test / Re-Release, rechtliches / finanzielles Risiko, Reputationsrisiko, etc ...

Nun multiplizieren # 1 und # 2 und prüfen Sie, ob Ihre Abneigung eine angemessene Menge an Testabdeckung zu erreichen, ist das Risiko wert.

Manchmal wird es nicht sein (aus diesem Grunde bei der Prüfung ein Konzept von einem Punkt des abnehmenden Ertrags ist).

z. wenn Sie einen Web-App verwalten, die Produktion nicht kritisch ist und hat 100 Benutzer, die eine Abhilfe, wenn die App unterbrochen ist (und / oder kann eine einfache und schnelle Rollback), dann verbringen 3 Monate tun vollständige Testabdeckung dieser App ist wahrscheinlich nicht -sensical.

Wenn Sie auf einer App arbeiten, wo ein kleinere Bug-Multi-Millionen-Dollar oder schlimmere Folgen haben kann (man denke Space-Shuttle-Software oder Leitsystem für ein Cruise Missile), dann ist die gründliche Prüfung mit vollständiger Abdeckung viel mehr sensical wird .

Auch ich bin nicht sicher, ob ich zu viel in die Frage zu lesen, aber sie scheinen was impliziert, dass mit ironischen aktiviert Unit-Tests irgendwie application / Integration Funktionstest excluds. Wenn das der Fall ist, sind Sie Recht auf eine solche Vorstellung zu widersprechen - die beiden Testansätze koexistieren müssen

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top