Wie teste ich eine Web Forms-Site?

26

Wie teste ich eine Web Forms-Site? Es scheint mir, dass so viel davon vom Zustand und den Benutzereingaben abhängt, dass es nicht machbar wäre.

Wenn es nicht machbar ist, gibt es eine gültige automatisierte Alternative?

Tom Squires
quelle
2
Wenn Sie automatisierte Benutzeroberflächentests durchführen möchten, benötigen Sie Selen. Wenn Sie jedoch automatisierte Komponententests durchführen möchten , benötigen Sie kein Selen. Sie brauchen nur die richtigen Muster. Siehe meine Antwort.
Matthew Rodatus

Antworten:

22

Ja, du kannst. Sie müssen nur darauf achten, Ihre Bedenken gut zu trennen. Kurz gesagt, Sie müssen Ihre gesamte Logik aus dem Code-Behind entfernen und in andere Klassen einordnen.

Hierfür gibt es zwei Möglichkeiten.

Der einfache Weg besteht darin, alle Event-Handler in Bezug auf "Welche Informationen gibt mir das System? Welche Informationen muss ich auf der Seite einfügen?" Zu überdenken. und dann eine Serviceklasse bereitstellen, die diese Konvertierung vornimmt.

In diesem Fall sollte die Serviceschicht nur sehr wenig über die Art Ihrer Präsentationsschicht wissen. Sie müssen weiterhin die vom Service zurückgegebenen Daten verwenden und die richtigen Komponenten des WebForms in Ihren Code-Behind einfügen. Dies bleibt ungetestet (zumindest bei Komponententests können Sie weiterhin Integrationstests durchführen). Aber das ist selten der Fall, bei dem Code schief geht. Es ist wahrscheinlicher, dass die Logik versagt.

Eine kompliziertere, aber effektivere Methode ist die Verwendung des Model View Presenter-Musters . Als wir das versuchten, stellten wir fest, dass sich die Presenter sehr schnell an das Framework gewöhnt hatten und je weiter wir MVP entwickelten, desto klarer wurde, dass MVP wirklich MVC sein wollte, aber nicht sein konnte.

Das haben andere jedoch sehr erfolgreich getan - es gibt sogar ein Webformsmvp-Framework , mit dem Sie das schwere Heben beseitigen können -, sodass Ihre Laufleistung variieren kann.

pdr
quelle
1
@jmoreno: Schöner Fang! Ich habe vergessen, dass WebForms und MVP in den letzten 5 Jahren überhaupt existieren.
pdr
16

Ganz offensichtlich ist eine gesamte Webformularseite keine Einheit und kann daher nicht einheitentestet werden. Es gibt jedoch einige Dinge, die Sie für automatisierte Tests tun können:

  • Komponententest einzelner Komponenten der Seite (alle Methoden, die die eigentliche Logik ausführen)
  • von der Seite verwendete Komponententests (benutzerdefinierte Steuerelemente, zugrunde liegende Geschäftslogik usw.)
  • automatisierter Funktionstest (durch Fernsteuerung eines Browsers oder Senden von HTTP-Anfragen über so etwas wie cURL)
  • automatisierter Penetrationstest (es gibt Tools, die versuchen, mögliche Injektionspunkte zu finden und automatisch harmlose und dennoch erkennbare Injektionsangriffe auf Ihrer Seite auszuführen)
  • Belastungstests
  • Überprüfen des Layouts anhand einer Liste von Usability- und hausinternen Aufzählungspunkten (obwohl dies sehr schwer zu automatisieren ist; es ist in der Regel sinnvoller, dies von Zeit zu Zeit manuell zu tun)
tdammers
quelle
-1 Sorry, aber Lasttests, Penetrationstests und Layoutprüfungen haben nichts mit Unit-Tests zu tun
Tom Squires
2
@TomSquires: Natürlich nicht, und wenn Sie meine Antwort sorgfältig lesen, werden Sie feststellen, dass ich nie gesagt habe, dass dies der Fall ist. Die Frage scheint jedoch die Konzepte von Komponententests und automatisierten Tests im Allgemeinen zu verwirren, weshalb ich verschiedene aussagekräftige automatisierte Tests aufgelistet habe, die Sie in einem Webformular ablegen können.
Tdammers
Ich stimme zu, das Testen einer Webseite ist eher eine Form des Integrationstests als ein Komponententest nach strengen Definitionen, obwohl es immer noch gut ist, alles zu automatisieren, was man kann
jk.
6
@TomSquires: völlig ungerechtfertigte Gegenstimme. Ihre eigene Frage beginnt mit dem Testen einer gesamten Site, was nichts mit Unit-Tests zu tun hat. Tdammers identifizierten verschiedene Möglichkeiten, um das Ganze und die Teile zu testen, und identifizierten, wo Einheitentests hineinpassen. +1
azheglov
3
Meinetwegen. Ich nehme es zurück
Tom Squires
9

Es tut mir leid, dass ich den "Einheit" -Teil der Frage verpasst habe ...

SeleniumHQ ist dein Freund für Tests vom Frontend. Es ist kein Unit-Test, eher wie ein Black-Box-Test. Sie müssen sich noch gültige Testfälle überlegen ...

WarrenFaith
quelle
1
+1 Ihre Antwort kam, als ich auf "Antwort posten" drückte, um genau dasselbe zu sagen.
Yannis
2
Da op auch nach Unit-Tests fragt, wollen wir nur hinzufügen, dass es sich bei der eigentlichen Frage um Funktionstests handelt , die beim Testen von Benutzereingabeelementen geeigneter (sinnvoll, machbar) sind.
Yannis
+1, weil ich immer noch meine, es zu benutzen, aber nie dazu gekommen bin. Hat es jemand benutzt, ist es gut und die Implementierung wert?
NimChimpsky
6
Selen ist ein fantastisches Werkzeug, hat aber nichts mit Unit-Tests zu tun.
pdr
Es
stimmt
6

Aus Erfahrung sprechen: Nur wenn es richtig gemacht wird. Mit "richtig" meine ich ein Minimum an Code-Behind und so etwas wie den oben erwähnten Model-View-Presenter, um das Web-Formular "dumm" zu machen. Bei Brownfield-Anwendungen erweist sich dies in der Regel als sehr schwierig, da sie nicht in diesem Sinne entwickelt wurden und es eine nahezu herkulische Anstrengung ist, Seiten umzugestalten / umzuschreiben, um sie zu verwenden.

Wayne Molina
quelle
1

Watin

Ich finde, Unit-Web-Tests sind äußerst nützlich, auch wenn sie nur eine allgemeine Vorstellung von einem Regressionsfehler oder neuen Projekten vermitteln sollen.

In Bezug auf den Status erstellen Sie Ihre Komponententests wie bei Tests ohne Benutzeroberfläche. Sie löschen die Datenbank zu Beginn des Tests und erstellen die Datenbank so neu, dass sie nur den Startstatus enthält. Jeder Komponententest kapselt dann eine einzelne Seite oder normalerweise eine bestimmte Aufgabe auf einer Seite.

http://watin.org/ ist ein weiteres Webtest-Tool, jedoch für C # /. NET. Sie schreiben die Tests als Unit-Tests:

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

Es ist derzeit IE-basiert, bietet jedoch experimentelle Unterstützung für Firefox und Chrome. Sie können so ziemlich alles automatisieren, was Sie in manuellen Tests tun würden, einschließlich der Interaktion mit Javascript.

Chris S
quelle
Bestätigen Sie, dass es 2016 ist. Der heutige Besuch auf der WatiN-Website zeigt mir, dass WatiN möglicherweise tot ist. Die Dokumente sind spärlich und nicht aktuell, und Videos werden nicht abgespielt. Ich beschwere mich nicht - ich bin sehr dankbar für freiwillige Open-Source-Tools - dieser Kommentar soll anderen neu hinzukommenden Personen wie mir helfen. Die Antwort ist in Ordnung und weist nur darauf hin, dass für den Einstieg möglicherweise selbstgesteuertes, praktisches Lernen erforderlich ist.
qxotk
1
Weitere Hilfe für alle, die über die WatiN-Methode nachdenken, Bestätigung, dass es stagniert + wo man heute suchen kann: stackoverflow.com/questions/118531/…
qxotk
0

Sie können eine Website nicht einzeln testen, nur weil Webanforderungen über eine Leitung (oder über einen TCP-Stack) erfolgen. Somit passen die Tests nicht zur Definition des "Einheitentests", es wären wahrscheinlich Ende-zu-Ende-Tests.

Für diese Art von Tests können Sie eine Suite wie Selenium verwenden, die einen Webbrowser hinter den Kulissen ausführt. Ein Wort der Warnung: Normalerweise ist diese Art der Prüfung sehr schwierig und unvorhersehbar, da es viele bewegliche Teile gibt!

Interessanter ist jedoch, dass es mich ein bisschen beunruhigt, warum Sie Webformulare überhaupt testen müssen . Stecken Sie nicht zu viel Logik in den Code dahinter und haben zufällig eine anämische Geschäftslogik?

Sklivvz
quelle
-1

Jasmin

In den letzten 5 Jahren hat sich Jasmine als Schlüsselinstrument für Front-End-Unit-Tests herauskristallisiert. Es wird häufig in automatische Build-Tests mit Node und npm integriert

Per https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework) :

Jasmine ist ein Open-Source-Testframework für JavaScript. [2] Ziel ist es, auf jeder JavaScript-fähigen Plattform ausgeführt zu werden, weder in die Anwendung noch in die IDE einzugreifen, und eine einfach zu lesende Syntax zu haben. Es wird stark von anderen Unit-Testing-Frameworks wie ScrewUnit, JSSpec, JSpec und RSpec beeinflusst. [3]

Trotz aller Erwähnungen von Javascript kann es auch zum Unit-Testen eines einfachen Webformulars verwendet werden.

Michael Durrant
quelle
Während Javascript in Webformularen verwendet wird, ist es nicht die primäre Methode, um die Benutzeroberfläche zu aktualisieren
Tom Squires
Wahr. Die Alternative ist jedoch ...? Das ist der Grund, warum Jasmine sehr gut funktioniert, auch wenn sie nicht für diesen Zweck vorgesehen ist. Außerdem ist die Syntax fast identisch mit RSpec, das Ruby-Programmierer lieben.
Michael Durrant
-2

ASP.NET

Bei der Entwicklung einer ASP.NET-Site konnten wir Komponententests für Folgendes ausführen:

  • Die Domain
  • BL Controller / Presenter
  • der Code hinter Web Forms-Seiten

Es ist möglich, all dies abhängig von Ihrer Architektur zu TDD. Das einzige, was Sie nicht testen können, ist das Layout der Markup-Datei.

KeithS
quelle
3
Diese Antwort sagt "Ja, es ist möglich" zu der Frage "Wie". Nicht gerade hilfreich.
RubberDuck