Vor kurzem kam ich auf die Frage, ob es überhaupt sinnvoll ist, Entwicklungszeit zu investieren, um einen automatischen Komponententest für webbasierte Projekte zu generieren. Ich meine, es scheint zu irgendeinem Zeitpunkt nutzlos, weil diese Projekte irgendwann auf Interaktionen mit Benutzern / Clients ausgerichtet sind, so dass Sie nicht die gesamte mögliche Benutzeraktion antizipieren können, so dass Sie in der Lage sind, die Richtigkeit des angezeigten Inhalts zu überprüfen. Selbst ein Regressionstest ist kaum möglich.
Ich bin also sehr gespannt darauf, die Meinung anderer erfahrener Entwickler zu kennen.
Sie können das Ganze nicht voraussehen mögliche Reihe von Benutzeraktionen, so dass Sie sein in der Lage, die Richtigkeit von zu überprüfen Inhalt zeigte.
Sie können nicht alle möglichen Daten vorhersehen, die Ihr Code erhalten wird, oder alle möglichen Race Conditions, wenn es sich um Threads handelt, und trotzdem machen Sie immer noch den Unit-Test. Warum? Weil man es verdammt viel eingrenzen kann. Sie können die Art von pathologischen Dingen vorhersehen, die passieren werden. Sie müssen nur ein wenig darüber nachdenken und etwas Erfahrung sammeln.
Benutzerinteraktion ist nicht anders. Es gibt bestimmte Dinge, die Benutzer versuchen und tun werden, pathologisch oder nicht, und Sie können sie antizipieren. Benutzer geben gerade besonders fantasievolle Daten ein. Sie werden feststellen, dass Programmierer dazu neigen, die gleichen Bedingungen immer wieder zu verpassen. Ich halte eine Checkliste. Zum Beispiel: Unicode in alles pumpen; das Startdatum nach dem Enddatum eingeben; geben Sie Kauderwelschdaten ein; setze Tags in alles; die abschließende Zeilenschaltung verlassen; versuche, die gleichen Daten zweimal einzugeben; ein Formular einreichen, zurückgehen und es erneut einreichen; nimm eine Textdatei, nenne sie foo.jpg und versuche sie als Bild hochzuladen. Sie können sogar ein Programm schreiben, um Schalter und Tasten willkürlich zu drücken, ein schlechter Affe, der alle Arten von Spaßwanzen findet.
Es ist oft so einfach, jemanden zu sitzen, der mit der Software nicht vertraut ist und sie beobachtet. Bekämpfe den Drang, sie zu korrigieren, schau ihnen einfach nur zu. Es ist sehr lehrreich. Steve Krug bezeichnet dies als "Advanced Common Sense" und hat ein ausgezeichnetes Buch mit dem Titel "Do not Make Me Think", das preiswerte, einfache Benutzerinteraktionstests Ich empfehle es sehr. Es ist ein sehr kurzes und Augen öffnendes Lesen.
Schließlich kann der Kunde selbst, wenn seine Erwartungen richtig vorbereitet sind, eine fantastische Testsuite sein. Seien Sie sicher, dass sie verstehen, dass es sich um ein laufendes Projekt handelt, dass es Bugs hat, dass sie helfen, ihr Produkt besser zu machen, und dass es absolut nicht für Produktionsdaten verwendet werden sollte und lassen Sie sie an den Vorabversionen von Ihr Produkt. Sie werden alle möglichen Dinge tun, an die Sie nie gedacht haben! Sie sind die besten und realistischsten Tests, die Sie je hatten, KOSTENLOS! Geben Sie ihnen eine sehr einfache Möglichkeit, Fehler zu melden, vorzugsweise nur eine einzige Schaltfläche direkt in der Anwendung, die ihre Umgebung und ihren Verlauf automatisch übermittelt; Das Feedback-Feld auf Hiveminder ist ein ausgezeichnetes Beispiel. Beantworten Sie ihre Fehler schnell und höflich (auch wenn es nur "Danke für die Info" ist) und Sie werden feststellen, dass sie sich freuen werden, wenn Sie so auf ihre Bedürfnisse eingehen!
Ja, ist es. Ich habe gerade diese Woche mit einer Website, an der ich gerade arbeite, auf ein Problem gestoßen. Ich habe gerade die Datenzugriffsebene deaktiviert und Komponententests für meine Controller und Repositorys eingerichtet, aber nicht die UI-Interaktionen.
Ich bekam ein bisschen durch einen ziemlich offensichtlichen Fehler, der leicht zu finden wäre, wenn ich Integrationstests hätte. Nur durch Integrationstests und UI-Funktionstests gibt es Probleme mit der Art und Weise, wie verschiedene Ebenen der Anwendung miteinander interagieren.
Es hängt wirklich von der Struktur und Architektur Ihrer Webanwendung ab. Wenn es einen Anwendungslogik-Layer enthält, sollte dieser Layer leicht mit automatischen Tools wie Visual Studio getestet werden können. Auch die Verwendung eines Frameworks, das entwickelt wurde, um Komponententests wie ASP.NET MVC zu ermöglichen, hilft sehr.
Wenn Sie eine Menge Javascript schreiben, gibt es eine Menge JS-Test-Frameworks, die kürzlich um den Block herum gekommen sind, um Ihr Javascript zu testen.
Abgesehen davon ist das Testen der Webebene mit Canoo, HtmlUnit, Selenium usw. eher ein Funktions- oder Integrationstest als ein Komponententest. Diese können schwer zu pflegen sein, wenn Sie die Benutzeroberfläche sehr ändern, aber sie können wirklich nützlich sein. Das Aufzeichnen von Selenium-Tests ist einfach und etwas, das Sie wahrscheinlich anderen Personen (Testern) zur Verfügung stellen können, die Ihnen bei der Erstellung und Wartung helfen. Man muss nur wissen, dass mit der Wartung von Tests Kosten verbunden sind, die ausgeglichen werden müssen.
Es gibt andere Arten von Tests, die für das Web Tier besonders gut sind - Fuzz Testing, aber viele der guten Optionen sind kommerzielle Tools. Eines, das Open Source ist und in Rails gesteckt wird, heißt Tarantula. So etwas auf der Web-Ebene zu haben, ist schön, in einem kontinuierlichen Integrationsprozess gelaufen zu sein und erfordert nicht viel in Form von Wartung.
Komponententests sind im TDD-Prozess sinnvoll. Sie haben nicht viel Wert, wenn Sie keine Test-First-Entwicklung machen. Der Abnahmetest ist jedoch eine große Sache für die Qualität der Software. Ich würde sagen, dass Akzeptanztest ein heiliger Gral der Entwicklung ist. Akzeptanztests zeigen, ob die Anwendung die Anforderungen erfüllt. Woher weiß ich, wann ich mit der Entwicklung des Features aufhören darf - nur wenn alle meine Abnahmetests bestanden sind. Automatisierung der Akzeptanzprüfung eine große Sache, weil ich es nicht jedes Mal manuell machen muss, wenn ich Änderungen an der Anwendung mache. Nach Monaten der Entwicklung kann es Hunderte von Tests geben und es wird unmöglich (manchmal unmöglich), den gesamten Test manuell durchzuführen. Woher weiß ich dann, ob meine Anwendung noch funktioniert?
Die Automatisierung von Abnahmetests kann unter Verwendung von xUnit-Testframeworks implementiert werden, was hier Verwirrung stiftet. Wenn ich mit phpUnit oder httpUnit einen Abnahmetest mache, ist das ein Komponententest? Meine Antwort ist nein. Es spielt keine Rolle, welches Werkzeug ich zum Erstellen und Ausführen von Tests verwende. Der Abnahmetest ist der, der zeigt, ob die Funktionen den IAW-Anforderungen entsprechen. Unit-Test zeigt an, ob eine Klasse (oder Funktion) die Implementierungsidee des Entwicklers erfüllt. Komponententest hat keinen Wert für den Client (Benutzer). Der Akzeptanztest hat für den Kunden (und damit für den Entwickler, denken Sie an Kundenaffinität )
viel Wert.Daher empfehle ich dringend, automatisierte Akzeptanztests für die Webanwendung zu erstellen.
Die guten Rahmenbedingungen für den Abnahmetest sind:
Allerdings
Sie haben erwähnt, dass es auf der Website nur um Benutzerinteraktion geht und somit die Testautomatisierung nicht das gesamte Problem der Benutzerfreundlichkeit lösen wird. Beispiel: Das Testframework zeigt, dass alle Tests bestanden wurden. Der Benutzer kann jedoch das Formular oder den Link oder ein anderes Seitenelement aufgrund der versehentlichen style="display:none"
in div
nicht sehen. Die automatisierten Tests bestehen, weil das div
im Dokumenten- und Test-Framework vorhanden ist, um es zu "sehen". Aber der Benutzer kann nicht. Und der manuelle Test würde fehlschlagen.
Daher müssen alle Web-Anwendungen manuell getestet werden. Der automatisierte Test kann den Testaufwand drastisch reduzieren (80%), aber auch manuelle Tests sind für die Qualität der resultierenden Software von Bedeutung.
Wie für die Unit-Tests und TDD - es macht die Code-Qualität. Es ist vorteilhaft für die Entwickler und für die Zukunft des Projekts (d. H. Für Projekte länger als ein paar Monate). TDD erfordert jedoch Geschicklichkeit. Wenn Sie die Fähigkeit haben - verwenden Sie es. Wenn Sie nicht daran denken, die Fähigkeit zu erlangen, aber beachten Sie die Zeit, die es braucht, um zu gewinnen. Es dauert normalerweise etwa 3 - 6 Monate, um mit der Erstellung eines guten Unit-Tests und -Codes zu beginnen. Wenn Ihr Projekt mehr als ein Jahr dauert, empfehle ich, TDD zu investieren und Zeit in eine geeignete Entwicklungsumgebung zu investieren.
Ich habe eine Web-Test-Lösung (Docker + Gurke) erstellt; Es ist sehr einfach und einfach zu verstehen und zu verbessern. Es liegt im Webverzeichnis;
meine Lösung: Ссылка
Tags und Links testing automated-tests