Warum ist das Testen von MVC Views verpönt?

23

Ich bereite gerade die Grundlagen für eine ASP.Net MVC-Anwendung vor und überlege, welche Art von Komponententests ich schreiben sollte. Ich habe an mehreren Stellen gesehen, dass die Leute im Wesentlichen sagten: "Machen Sie sich nicht die Mühe, Ihre Ansichten zu testen, es gibt keine Logik und es ist trivial und wird durch einen Integrationstest abgedeckt."

Ich verstehe nicht, wie dies zur anerkannten Weisheit geworden ist. Integrationstests dienen einem ganz anderen Zweck als Unit-Tests. Wenn ich etwas kaputt mache, möchte ich nicht eine halbe Stunde später wissen, wann meine Integrationstests kaputt gehen, ich möchte es sofort wissen.

Beispielszenario: Nehmen wir an, wir haben es mit einer Standard-CRUD-App mit einer Kundenentität zu tun. Der Kunde hat einen Namen und eine Adresse. Bei jeder Teststufe möchte ich sicherstellen, dass die Kundenabruflogik sowohl den Namen als auch die Adresse ordnungsgemäß abruft.

Um das Repository auf Unit-Tests zu testen, schreibe ich einen Integrationstest, um die Datenbank zu erreichen. Um die Geschäftsregeln auf Unit-Tests zu testen, verspotte ich das Repository, füttere die Geschäftsregeln mit den entsprechenden Daten und stelle sicher, dass meine erwarteten Ergebnisse zurückgegeben werden.

Was ich tun möchte: Um die Benutzeroberfläche einem Komponententest zu unterziehen, verspotte ich die Geschäftsregeln, richte meine erwartete Kundeninstanz ein, rendere die Ansicht und stelle sicher, dass die Ansicht die entsprechenden Werte für die von mir angegebene Instanz enthält.

Was ich nicht machen kann: Um das Repository zu testen, schreibe ich einen Integrationstest, richte ein entsprechendes Login ein, erstelle die erforderlichen Daten in der Datenbank, öffne einen Browser, navigiere zum Kunden und vergewissere mich, dass die resultierende Seite das entsprechende enthält Werte für die angegebene Instanz.

Mir ist klar, dass es Überschneidungen zwischen den beiden oben diskutierten Szenarien gibt, aber der Hauptunterschied ist die Zeit und der Aufwand, die erforderlich sind, um die Tests einzurichten und auszuführen.

Wenn ich (oder ein anderer Entwickler) das Adressfeld aus der Ansicht entferne, möchte ich nicht warten, bis der Integrationstest dies feststellt. Ich möchte in einem Unit-Test entdeckt und markiert werden, der mehrmals täglich durchgeführt wird.

Ich habe das Gefühl, dass ich ein Schlüsselkonzept einfach nicht verstehe. Kann jemand erklären, warum es eine schlechte Sache ist, ein sofortiges Test-Feedback zur Gültigkeit einer MVC-Ansicht zu erhalten? (oder wenn nicht schlecht, dann nicht der erwartete Weg, um besagtes Feedback zu bekommen)

Peter Bernier
quelle
1
"To unit-test the repository, I write an integration test"Warte was? Dies ist kein Komponententest des Repository. Sie automatisieren den Test dafür, aber der getestete Code enthält weiterhin die DAL und die Datenbank. Um das Repository einem Komponententest zu unterziehen, isolieren Sie es wie für Ihre Geschäftsregeln.
StuperUser
Unit-Test Die erwartungsgemäß gerenderte Ansicht ist nur ein Unit-Test, mit dem Ihre Templating-Engine funktioniert. Das ist, als würde ein Unit-Test Ihres kompilierten C bestimmte Teile des Maschinencodes enthalten, Ihr Unit-Test des Compilers nicht Ihren Code.
Raynos
2
@ Raynos Respektvoll, ich werde nicht zustimmen müssen. Wenn ich (oder ein anderer Entwickler) fälschlicherweise eine Verbindung zur Benutzeroberfläche herstellt, um ein Datenattribut im Feld "Benutzeroberfläche" für ein anderes zu rendern (z. B. "Vorname" im Feld "Nachname"), hat dies nichts mit der Templating-Engine zu tun handelt es sich um ein DAL- oder BR-Problem .. es ist eindeutig ein Problem, das nur
Peter Bernier
1
@ PeterBernier Sie haben einen guten Punkt, aber ich finde es schwierig, die Grenze zwischen "Testen, ob der Compiler funktioniert" und "Testen, ob mein Code funktioniert" zu definieren. Ganz zu schweigen davon, dass die Tests für die Benutzeroberfläche eng an die Benutzeroberfläche gekoppelt sind. Bei Änderungen an der Benutzeroberfläche schlagen die Tests fehl. Sie können keine Art von Umgestaltung der Benutzeroberfläche durchführen, ohne dass ein Test fehlschlägt.
Raynos

Antworten:

9

Einfaches Testen der Benutzeroberfläche ist in ASP.NET MVC einfach genug. Im Wesentlichen müssen Sie nur bestätigen, dass der zurückgegebene HTML-Code die Elemente enthält, die Sie benötigen. Dadurch wird zwar sichergestellt, dass die HTML-Seite wie erwartet strukturiert ist, die Benutzeroberfläche wird jedoch nicht vollständig getestet.

Für einen ordnungsgemäßen Web-UI-Test ist ein Tool wie Selenium erforderlich, das Browser auf Ihrem Computer verwendet und sicherstellt, dass JavaScript und HTML in allen Browsern ordnungsgemäß funktionieren. Selenium verfügt über ein Client / Server-Modell, sodass Sie eine Reihe von virtuellen Maschinen mit Unix-, Mac- und Windows-Clients sowie die in diesen Umgebungen üblichen Browser verwenden können.

Nun setzt eine gut gestaltete MVC-Anwendung (Pattern, nicht Framework) die wichtige Logik in die Modelle und Controller ein. Kurz gesagt, die Funktionalität der Anwendung wird getestet, wenn Sie diese beiden Aspekte testen. Ansichten haben in der Regel nur eine Anzeigelogik und lassen sich leicht visuell überprüfen. Aufgrund der dünnen Verarbeitung in der Ansicht und des Großteils der gut getesteten Anwendung glauben viele Leute nicht, dass der Aufwand beim Testen der Ansichtsebene den durch sie erzielten Nutzen überwiegt.

Trotzdem hat MVC einige nette Möglichkeiten, um das von der Anfrage zurückgegebene DOM zu überprüfen. Dies reduziert die Schmerzen beim Testen der Ansichtsebene erheblich.

Berin Loritsch
quelle
1
"Im Wesentlichen müssen Sie nur bestätigen, dass der zurückgegebene HTML-Code die Elemente enthält, die Sie benötigen." Das ist genau das, was ich versuche und es stellt sich heraus, dass es nicht trivial ist. Können Sie auf einen Link verweisen, über den eine bestimmte Controller-Aktion ausgeführt werden kann, anstatt nur ein Steuerelement zu rendern? (Ich habe ein paar Überarbeitungen durchgearbeitet, aber RenderPartial erreicht nicht das, was ich tun möchte, ohne nennenswerten Overhead.)
Peter Bernier
Sie sollten mvccontrib.codeplex.com (MVC Contrib) auschecken . Dies bietet Hilfe, die nicht in die Hauptsprache integriert ist und in dem Buch "Test-Drive ASP.NET MVC" (pragmatische Programmierer) empfohlen wurde. Ich denke immer noch, dass Selen besser zu View-Tests passt.
Berin Loritsch
TestHelper (MVC Contrib): mvccontrib.codeplex.com/…
Berin Loritsch
Selen (in meinem Fall Selen RC) werde ich für meine Integrationstests verwenden. Ich möchte, dass ein Fehler vor diesem Zeitpunkt auftritt.
Peter Bernier
2
@ Peter: Ihr Kommentar zu Ihren Bemühungen als "nicht trivial" ist genau der Grund, warum Unit-Testing-Ansichten verpönt werden. Folglich besteht eine typische Strategie darin, die Ansichten so dünn wie möglich zu gestalten (dh sie enthalten keine Geschäftslogik), damit die meisten Unit-Tests an einem anderen Ort stattfinden können (im Allgemeinen im ViewModel). Die Ansichten selbst können durch visuelle Inspektion oder mit einem UI-Testwerkzeug wie Selen überprüft werden.
Robert Harvey
7

Ich würde nicht sagen, dass es verpönt ist. Diese Stimmung ist vielmehr das Ergebnis der Tatsache, dass das Testen von MVC-Ansichten (zumindest der aspx-Variante) in der Einheit ziemlich schwierig ist, da aspx-Ansichten zu stark von WebForms abhängig sind, die selbst nicht getestet werden können. Das Argument lautet also, dass sich die Mühe nicht lohnt , da die Ansichten in der Regel nicht so kompliziert sind.

Natürlich können Ansichten ziemlich kompliziert werden, so dass Sie die Wahl haben.

Marcind
quelle
3
Soweit mir bekannt ist, sind ASP.NET MVC-Ansichten nicht an Webforms gebunden. Gehört es nicht zu den großen Aufgaben von ASP.NET MVC, nicht Webforms zu sein?
Adam Lear
Mein Standpunkt ist, dass es mehr menschlichen Aufwand erfordert, die Integrationstests zu schreiben, um die Benutzeroberfläche abzudecken, als echte 'Komponententests', um die Ansichten abzudecken. Aus diesem Grund versuche ich, einige der Widerstände zu verstehen, die es zu geben scheint, Unit-Tests für die Ansichten zu schreiben.
Peter Bernier
@Anna Aspx-Ansichten basieren auf WebForms. Sie leiten sich von der System.Web.UI.WebControls.PageKlasse ab, verwenden <asp:ContentPlaceholder>Steuerelemente usw. Die Art und Weise, wie MVC sie ausführt, vermeidet einen Großteil der Page Execution Pipeline, die normalerweise mit WebForms verbunden ist.
Marcind
Wenn Sie eine andere Ansichts-Engine (z. B. Rasiermesser) verwenden, sollten Sie in der Lage sein, sich weiter von der Webforms-Engine zu entfernen.
The Muffin Man
6

Ich bin mir nicht sicher, ob es verpönt ist. Die Testbarkeit ist einer der Hauptvorteile der Verwendung von ASP.NET MVC. Weitere Informationen hierzu finden Sie in Steve Sandersons Blog .

Er schrieb auch das zweifellos beste ASP.MVC-Buch (IMO). Er unterrichtet nicht nur MVC, sondern geht darüber hinaus, um Best Practices zu vermitteln, einschließlich Testverfahren.

Ich denke, ich muss ein wenig über Unit-Test-Ansichten klären - Sie können Unit-Tests auf der Grundlage des vom Controller zurückgegebenen Ergebnisses (ActionResult usw.) erstellen. Sie müssen noch andere Tests für die tatsächliche Interaktion zwischen Benutzeroberfläche und Benutzeroberfläche durchführen.

Mark Freedman
quelle
"Sie müssen noch andere Tests für die tatsächliche Interaktion zwischen Benutzeroberfläche und Benutzeroberfläche durchführen." Genau das ist meine Frage. Warum werden die UI-Tests plötzlich Teil anderer Tests (dh Integrationstests)? Ich hatte eine Menge von Steve Sandersons Inhalten gesehen, und genau das hat mich dazu gebracht, diesen Weg zu beschreiten, indem ich versucht habe, seine Arbeit mit seinem 'MvcFakes'-Projekt zu wiederholen und Probleme damit zu bekommen, dass sein Code für ältere MVC-Releases geschrieben wurde. .
Peter Bernier
1

Sie erfahren, wie Sie die von einer Controller-Aktion zurückgegebene Ansicht testen, wie Sie die von einer Controller-Aktion zurückgegebenen Ansichtsdaten testen und wie Sie testen, ob eine Controller-Aktion Sie zu einer zweiten Controller-Aktion umleitet, indem Sie die folgende URL aufrufen: Beschreiben Sie in diesem kurzen Artikel das Testen von Ansichtsdaten in MVC .

Jaypee
quelle