Frage

Im Hinblick auf die klassischen Testmuster von Vereinbaren-Act-Assert ich mich häufig das Hinzufügen finden ein Gegen Behauptung, Act vorausgeht. Auf diese Weise weiß ich, dass die Weitergabe Behauptung wirklich als Ergebnis der Aktion vorbei.

Ich denke, es als analog zu dem rot in rot-grün-Refactoring, wo nur, wenn ich die roten Balken im Laufe meiner Tests gesehen habe weiß ich, dass die grünen Balken bedeuten, ich habe Code geschrieben, der macht ein Unterschied. Wenn ich einen vorübergehenden Test schreibe, dann jeder Code wird es genügen; in ähnlicher Weise, mit Bezug auf Arrange-Assert-Act-Assert, wenn meine erste Behauptung nicht, ich weiß, dass jedes Gesetz würde die endgültige Assert bestanden hat -. so, dass es nicht wirklich war etwas über das Gesetz zu überprüfen

Haben Sie Ihre Tests folgen diesem Muster? Warum oder warum nicht?

Aktualisieren Klarstellung: die anfängliche Behauptung ist im Wesentlichen das Gegenteil der letzten Behauptung. Es ist keine Behauptung, Vereinbaren gearbeitet; es ist eine Behauptung, dass Gesetz noch nicht gearbeitet.

War es hilfreich?

Lösung 3

Hier ist ein Beispiel.

public void testEncompass() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7));
    range.encompass(7);
    assertTrue(range.includes(7));
}

Es könnte sein, dass ich Range.includes() schrieb wahr einfach zurück. Ich habe nicht, aber ich kann mir vorstellen, dass ich haben könnte. Oder ich hätte es falsch geschrieben in einer beliebigen Anzahl von anderen Möglichkeiten. Ich hoffe und erwarte, dass mit TDD Ich habe es eigentlich richtig - dass includes() funktioniert einfach - aber vielleicht habe ich nicht. So ist die erste Behauptung ist eine Plausibilitätsprüfung, um sicherzustellen, dass die zweite Behauptung wirklich sinnvoll ist.

von selbst lesen, assertTrue(range.includes(7)); sagt: „behaupten, dass der modifizierte Bereich 7 enthält“. Lesen Sie im Zusammenhang mit der ersten Behauptung, es sagt: „assert, dass rufenden encompass () bewirkt, dass es 7 enthalten Und da encompass das Gerät testen wir, glaube ich, dass die von einigen (kleinen ) Wert.

Ich bin meine eigene Antwort zu akzeptieren; viele der anderen verkannt meine Frage nach Prüfung der Einrichtung zu sein. Ich denke, das ist etwas anders.

Andere Tipps

Dies ist nicht das häufigste, was zu tun ist, aber immer noch weit verbreitet genug, um seinen eigenen Namen zu haben. Diese Technik wird als Schutz Assertion . Sie können eine ausführliche Beschreibung auf Seite 490 in dem ausgezeichneten Buch xUnit Testmuster von Gerard Meszaros (sehr zu empfehlen) finden.

Normalerweise ich nicht dieses Muster selbst verwenden, da ich finde es richtiger einen bestimmten Test zu schreiben, was Voraussetzung mir, um sicherzustellen, das Gefühl, die Notwendigkeit bestätigt. Solche nicht ein Test sollte immer, wenn die Voraussetzung nicht, und das bedeutet, dass ich es in allen anderen Tests eingebettet nicht brauchen. Daraus ergibt sich eine bessere Isolierung von Bedenken, da nur ein Testfall eine Sache überprüft.

Es kann viele Voraussetzungen, die für einen bestimmten Testfall erfüllt sein müssen, so können Sie mehr als eine Wache Assertion benötigen. Statt der in allen Tests, mit einem (und man nur) Test für jede Vorbedingung hält Ihren Testcode mehr mantainable wiederholen, da man auf diese Weise weniger Wiederholung haben.

Es könnte auch als Anordnung angegeben werden Angenommen -Gesetz-Assert.

Es ist ein technischer Griff hierfür in NUnit, wie im Beispiel hier: http://nunit.org/index.php?p=theory&r=2.5.7

Ein Arrange-Assert-Act-Assert Test kann immer in zwei Tests Refactoring:

1. Arrange-Assert

und

2. Arrange-Act-Assert

Der erste Test wird nur auf die behaupten, die in der Phase eingerichtet wurde anordnen, und der zweite Test wird nur für die behaupten, die in der Tat Phase passiert ist.

Dies hat den Vorteil, präzisere Rückmeldung geben, ob die es anordnen oder die Act-Phase, die ausgefallen ist, während in der ursprünglichen Arrange-Assert-Act-Assert diese verschmelzt werden und Sie würden tiefer graben und prüfen genau, was Behauptung scheiterte und warum es gescheitert um zu wissen, ob es wurde das Vereinbaren oder Gesetz, die fehlgeschlagen.

Es erfüllt auch die Absicht der Unit-Tests besser, wie Sie Ihren Test in kleinere unabhängige Einheiten zu trennen.

Schließlich beachten Sie, dass, wenn Sie ähnliche Vereinbaren Abschnitte in verschiedenen Test sehen, sollten Sie versuchen, diese in einen gemeinsamen Hilfsmethoden zu ziehen, so dass die Tests mehr DRY und mehr wartbar in der Zukunft.

Tossing in einer „Plausibilitätsprüfung“ Behauptung Zustand zu überprüfen, bevor Sie die Aktion ausführen Sie testen eine alte Technik ist. Ich schreibe sie in der Regel als Test Baugerüst um mich zu beweisen, dass der Test funktioniert, was ich erwarte, und entfernen Sie sie später unübersichtlich Tests mit Test Gerüst zu vermeiden. Manchmal hilft das Gerüst beim Verlassen des Test als Erzählung dienen.

Ich habe bereits über diese Technik gelesen - möglicherweise von Ihnen btw - aber ich verwende es nicht; vor allem, weil ich für meine Unit-Tests mit der Triple-A-Form verwendet werde.

Nun, ich bin immer neugierig, und einige Fragen: Wie schreiben Sie Ihren Test, verursachen Sie diese Behauptung zum Scheitern verurteilt, nach einem rot-grün-rot-grün-Refactoring-Zyklus, oder fügen Sie es später ?

Haben Sie nicht manchmal, vielleicht nachdem Sie den Code Refactoring? Was hat das gesagt? Vielleicht könnten Sie ein Beispiel teilen, wo es half. Vielen Dank.

Ich habe dies getan, vor, wenn ein Test-Untersuchung, die fehlgeschlagen.

Nach erheblichen Kopf kratzen, stellte ich fest, dass die Ursache die Methoden waren während genannt „Anordnen“ wurden nicht richtig funktioniert. Der Testfehler war irreführend. Ich habe eine Assert nach dem arrangieren. Dies machte den Test an einem Ort versagen die das eigentliche Problem hervorgehoben.

Ich glaube, es gibt auch einen Code Geruch hier, wenn das Vereinbaren Teil des Tests zu lang und kompliziert ist.

Generell mag ich „Anordnen, Act, Assert“ sehr viel und es als meinen persönlichen Standard verwenden. Das einzige, was es nicht mich zu erinnern, aber zu tun, ist, zu dis-arrangieren, was ich angeordnet habe, wenn die Behauptungen fertig sind. In den meisten Fällen verursacht dies nicht viel Ärger, da die meisten Dinge auto-magisch über Garbage Collection weggehen, etc. Wenn Sie Verbindungen zu externen Ressourcen aufgebaut haben, aber Sie wahrscheinlich diese Verbindungen schließen wollen, wenn Sie fertig sind mit Ihren Behauptungen oder Sie heraus viele haben einen Server oder teure Ressource irgendwo Halt an Verbindungen oder lebenswichtige Ressourcen, die es sollte jemand anderes verschenken kann. Dies ist besonders wichtig, wenn Sie einer jener Entwickler, die tut nicht TearDown oder TestFixtureTearDown verwenden nach einem oder mehreren Tests zu bereinigen. Natürlich „anordnen, Act, Assert“ ist für meine Fehler nicht verantwortlich zu schließen, was ich zu öffnen; Ich erwähne dies nur „Gotcha“, weil ich noch kein gutes „A-Wort“ Synonym für „entsorgen“ empfehlen gefunden! Irgendwelche Vorschläge?

Ich mache jetzt das. A-A-A-A von einer anderen Art

Arrange - setup
Act - what is being tested
Assemble - what is optionally needed to perform the assert
Assert - the actual assertions

Beispiel einer Aktualisierungsprüfung:

Arrange: 
    New object as NewObject
    Set properties of NewObject
    Save the NewObject
    Read the object as ReadObject

Act: 
    Change the ReadObject
    Save the ReadObject

Assemble: 
    Read the object as ReadUpdated

Assert: 
    Compare ReadUpdated with ReadObject properties

Der Grund dafür ist, so dass die ACT nicht das Lesen des ReadUpdated enthält, weil es nicht Teil der Handlung ist. Die Tat wird nur verändern und zu speichern. Also wirklich, ARRANGIERT ReadUpdated für Behauptung, ich fordere Behauptung ZUBAUEN bin. Dies soll verhindern, verwirrend der Abschnitt ARRANGIEREN

ASSERT sollte nur Behauptungen enthalten. Das lässt ZUBAUEN zwischen ACT und ASSERT, die die Assertion einrichtet.

Schließlich, wenn Sie in der Arrange versagen, sind die Tests nicht richtig, weil Sie andere Tests haben sollten zu verhindern / finden diese trivial Bugs. Da für das Szenario i dort präsentieren, sollte aber bereits andere Tests sein, die Test Lesen und Erstellen. Wenn Sie eine „Schutz Assertion“ erstellen, können Sie trocken und die Erstellung von Instandhaltungs brechen.

Haben Sie einen Blick auf Wikipedias Eintrag auf Design by Contract . Der Vereinbaren-Act-Assert dreifaltigkeit ist ein Versuch, einige der gleichen Konzepte zu kodieren und ist über das Programm Richtigkeit beweisen. Aus dem Artikel:

The notion of a contract extends down to the method/procedure level; the
contract for each method will normally contain the following pieces of
information:

    Acceptable and unacceptable input values or types, and their meanings
    Return values or types, and their meanings
    Error and exception condition values or types that can occur, and their meanings
    Side effects
    Preconditions
    Postconditions
    Invariants
    (more rarely) Performance guarantees, e.g. for time or space used

Es gibt einen Kompromiss zwischen dem Aufwand zur Einrichtung dieses ausgegeben und den Wert, den er hinzufügt. A-A-A ist ein nützlicher Hinweis für die Mindest Schritte erforderlich, aber sollte jemand nicht von der Schaffung zusätzliche Schritte entmutigen.

Abhängig von Ihrer Testumgebung / Sprache, aber in der Regel, wenn etwas in der Arrange Teil fehlschlägt, wird eine Ausnahme ausgelöst und der Test fehlschlägt er die Anzeige anstelle des Gesetzes Teil beginnen. Also nein, ich in der Regel nicht über einen zweiten Assert Teil verwenden.

Auch in dem Fall, dass Ihr Vereinbaren Teil recht komplex ist und nicht immer eine Ausnahme werfen, Sie vielleicht es in irgendeiner Methode betrachten könnten Einwickeln und einen eigenen Test für sie zu schreiben, so dass Sie sicher sein können, wird es nicht fail (ohne Auslösen einer Ausnahme).

Ich habe nicht dieses Muster verwenden, weil ich denke, etwas zu tun, wie:

Arrange
Assert-Not
Act
Assert

sinnlos sein kann, weil angeblich wissen Sie Vereinbaren Teil richtig funktioniert, was bedeutet, dass alles, was in dem Arrange-Teil ist als gut sein muß getestet oder einfach genug sein, um nicht-Tests benötigen.

Mit Ihrer Antwort des Beispiel:

public void testEncompass() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7)); // <-- Pointless and against DRY if there 
                                    // are unit tests for Range(int, int)
    range.encompass(7);
    assertTrue(range.includes(7));
}

Wenn Sie wirklich in dem Beispiel testen alles wollen, mehr Tests versuchen ... wie:

public void testIncludes7() throws Exception {
    Range range = new Range(0, 5);
    assertFalse(range.includes(7));
}

public void testIncludes5() throws Exception {
    Range range = new Range(0, 5);
    assertTrue(range.includes(5));
}

public void testIncludes0() throws Exception {
    Range range = new Range(0, 5);
    assertTrue(range.includes(0));
}

public void testEncompassInc7() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(7));
}

public void testEncompassInc5() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(5));
}

public void testEncompassInc0() throws Exception {
    Range range = new Range(0, 5);
    range.encompass(7);
    assertTrue(range.includes(0));
}

Weil sonst Sie so viele Möglichkeiten für Fehler fehlt ... zB nach encompass, der Bereich inlcudes nur 7, etc ... Es gibt auch Tests für die Länge des Bereichs (es, um sicherzustellen, nicht auch einen Zufallswert umfasste) und eine weitere Reihe von Tests vollständig für den Versuch 5 im Bereich zu umfassen ... was würden wir erwarten - eine Ausnahme in encompass oder der Bereich sein unverändert?

Wie auch immer, ist der Punkt, wenn es irgendwelche Annahmen auf frischer Tat, die Sie testen wollen, setzen sie in ihren eigenen Test, nicht wahr?

ich benutze:

1. Setup
2. Act
3. Assert 
4. Teardown

Da eine saubere Einrichtung ist sehr wichtig.

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