it-swarm.dev

Wie teste ich eine Website für Webformulare?

Wie teste ich eine Website für Webformulare? Es scheint mir, dass so viel davon vom Status und den Benutzereingaben abhängt, dass es nicht machbar wäre.

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

27
Tom Squires

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

Es gibt zwei Möglichkeiten, dies zu tun.

Der einfache Weg besteht darin, alle Ihre Ereignishandler in Bezug auf "Welche Informationen gibt mir das System? Welche Informationen muss ich auf der Seite ausfüllen?" Zu überdenken. und stellen Sie dann eine Serviceklasse bereit, die diese Konvertierung durchführt.

In diesem Fall sollte die Serviceschicht nur sehr wenig über die Art Ihrer Präsentationsschicht wissen. Sie müssen weiterhin die vom Dienst zurückgegebenen Daten nehmen und die richtigen Komponenten der WebForm in Ihren CodeBehind einfügen. Dies bleibt ungetestet (zumindest bei Komponententests können Sie weiterhin Integrationstests durchführen). Dies ist jedoch selten der Fall, wenn Code schief geht. Es ist viel wahrscheinlicher, dass die Logik fehlschlägt.

Eine kompliziertere, aber effektivere Methode ist die Verwendung des Model View Presenter-Musters . Als wir das versuchten, stellten wir fest, dass die Präsentatoren schnell sehr an das Framework gekoppelt waren. Je mehr wir MVP entwickelten, desto klarer wurde, dass MVP wirklich MVC sein wollte, es aber nicht sein konnte.

Das heißt, andere haben dies sehr erfolgreich gemacht - es gibt sogar ein webformsmvp-Framework , mit dem Sie das schwere Heben entfernen können -, sodass Ihr Kilometerstand variieren kann.

22
pdr

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

  • unit-Test einzelner Komponenten der Seite (alle Methoden, die die eigentliche Logik ausführen)
  • von der Seite verwendete Komponententestkomponenten (benutzerdefinierte Steuerelemente, zugrunde liegende Geschäftslogik usw.)
  • automatisierte Funktionstests (durch Fernsteuerung eines Browsers oder Senden von HTTP-Anforderungen über cURL)
  • automatisierte Penetrationstests (es gibt Tools, die versuchen, mögliche Injektionspunkte zu finden und harmlose, aber erkennbare Injektionsangriffe auf Ihrer Seite automatisch auszuführen)
  • lastprüfung
  • überprüfen des Layouts anhand einer Liste von Usability- und House-Style-Aufzählungspunkten (obwohl dies sehr schwer zu automatisieren ist; es ist normalerweise praktikabler, es nur ab und zu manuell durchzuführen)
16
tdammers

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

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

9
WarrenFaith

Aus Erfahrung sprechen: Nur wenn es richtig gemacht wird. Mit "richtig" meine ich minimalen Code-Behind und so etwas wie den oben erwähnten Model-View-Presenter, um das Webformular "dumm" zu machen. Dies erweist sich normalerweise als sehr schwierig bei Brownfield-Anwendungen, da sie nicht für diesen Zweck entwickelt wurden und es eine nahezu herkulische Anstrengung ist, Seiten umzugestalten/umzuschreiben, um sie zu verwenden.

6
Wayne Molina

watin

Ich finde Unit-Web-Tests äußerst nützlich, auch wenn sie nur eine allgemeine Vorstellung von einem Regressionsfehler oder für neue Projekte 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 neu, sodass 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 basiert derzeit auf IE, 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 Javascript-Interaktion.

1
Chris S

Sie können eine Website nicht wirklich einem Unit-Test unterziehen, nur weil Webanforderungen auf einem Draht (oder über einen TCP-Stack)) erfolgen. Daher passen die Tests nicht zur Definition von "Unit-Test". Dies wären wahrscheinlich End-to-End-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 des Testens sehr schwierig und unvorhersehbar, da es viele bewegliche Teile gibt!

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

0
Sklivvz