Wie schreibe ich einen Integrationstest in NUnit?

8

Wir sind zwei Studenten, die unsere Bachelorarbeit schreiben und wir haben eine Windows-Anwendung entwickelt, die einem Restaurant in verschiedenen Kommunikationsprozessen helfen kann. Grundsätzlich sollte es in der Lage sein, Informationen über die Bestellung von dem Moment an zu präsentieren, wenn ein Gast sie zugestellt hat.

Wir haben es versäumt, während der Entwicklung zu testen, haben uns aber dazu entschieden, jetzt Komponententests zu schreiben. Nichtsdestotrotz haben wir herausgefunden, dass der geeignetste Test, den wir jetzt in unser System schreiben können, Integrationstests sind, da alle Methoden in unseren Klassen an SQL gespeicherte Prozeduren über LINQ to SQL gebunden sind. Wir sind uns der Verwendung von Stubs bewusst, um eine Abhängigkeit von einer Datenbank zu fälschen, aber wenn unsere Datenbank bereits mit allen Funktionen implementiert ist, haben wir festgestellt, dass es uns mehr Wert bietet, mehrere Methoden als Integrationstest zu testen. p>

Wie im folgenden Code zu sehen ist, haben wir versucht, den Richtlinien für einen Komponententest zu folgen, aber ist dies der richtige Weg, um einen Integrationstest zu schreiben?

%Vor%     
Thomas Guldborg 14.05.2015, 07:48
quelle

2 Antworten

13

Ja, allgemein gesagt, so schreibt man einen Komponententest / Integrationstest. Sie beachten einige wichtige Richtlinien:

  • Distinct Act-Arrange-Assert Schritte
  • Der Testname beschreibt diese Schritte (vielleicht sollte am Ende etwas wie "ShouldSendOneOrder" stehen, "ShouldSendOneOrder" sollte am häufigsten verwendet werden, um Assert zu beschreiben).
  • One Assert pro Test.

Ich nehme an, dass Sie auch anderen Richtlinien folgen:

  • Tests sind unabhängig: Sie ändern den persistenten Zustand nicht, sodass sie andere Tests nicht beeinflussen.
  • Testen Sie realistische Anwendungsfälle: Arrangieren Sie keine Konstellationen, die die Geschäftslogik verletzen, machen Sie keine unmöglichen Handlungen. Oder: Imitieren Sie die reale Anwendung.

Ich sehe aber auch Dinge, die die Augenbrauen heben.

  • Es ist nicht klar, was du testest. Ich denke, einige "Acts" gehören zum Arrangierschritt.

  • Eine Methode wie producer.OrderOverview() lässt mich vermuten, dass Domänenobjekte eine Datenbankinteraktion ausführen. Wenn dies der Fall wäre, würde dies Persistenz Ignoranz verletzen. Ich denke, es sollte einen Dienst geben, der diese Methode präsentiert (aber siehe unten).

  • Es ist nicht klar, warum dataGridView.DataSource = producer.OrderOverview(); für den Test notwendig ist. Wenn dies der Fall ist, verschärft dies nur den schwerwiegendsten Punkt:

  • Geschäftslogik und Benutzeroberfläche sind verflochten !!

    • Methode wie guest.SendOrderOverview() und producer.OrderOverview() sind stinkend : Warum sollte ein Domain-Objekt wissen, wie man seinen Inhalt präsentiert ? Das sollte ein Presenter (MVP) oder ein Controller (MVC) oder ein View-Modell (MVVM) sein.
    • Eine Methode wie guest.SendOrder(dataGridView) ist böse . Es verknüpft die Domänenebene mit dem UI-Framework. Diese feste Abhängigkeit ist böse genug, aber natürlich benötigen Sie auch Werte aus der Grid-Ansicht innerhalb dieser Methode. Die Geschäftslogik benötigt also detaillierte Kenntnisse einiger UI-Komponenten. Dies verstößt gegen das Prinzip tell - do not ask . guest.SendOrder sollte über einfache Parameter verfügen, die angeben, wie die Aufgabe auszuführen ist, und die Domäne sollte keinen beliebigen Verweis auf jedes UI-Framework haben.

Sie sollten den letzten Punkt wirklich ansprechen. Machen Sie es zu Ihrem Ziel, diesen Test ohne Interaktion mit DGV durchzuführen.

    
Gert Arnold 14.05.2015, 10:49
quelle
1

Wenn Sie weiterhin sql in der Klasse binden, ist Ihr Test kein großes Problem.

Sie können diese Methode verwenden, wenn die Programmlogik sehr einfach ist, aber ich schlage vor, dass Sie das Repository-Muster studieren , wenn die Logik komplexer wird.

    
yubaolee 14.05.2015 08:28
quelle