Frage

Ich suche nach Anregungen, den Prozess der Automatisierung von Funktionstests einer Website zu verbessern. Hier ist, was ich in der Vergangenheit versucht haben.

Ich habe ein Testprojekt haben mit WATIN . Sie effektiv schreiben, was wie „Unit-Tests“ aussehen und verwenden WATIN einen Browser zu automatisieren etc rund um Ihre Website zu klicken.

Natürlich müssen Sie eine Website zu laufen. Also machte ich den Test tatsächlich den Code von meinem Web-Projekt in einem lokalen Verzeichnis kopieren und begann zu diesem Verzeichnis eines Web-Server verweist, bevor Sie die Tests durchführen.

Auf diese Weise jemand Neues einfach neueste von unserer Quelle Kontrolle geraten könnte und unser Build-Skript ausführen, und sehen Sie alle Tests laufen. Sie könnten auch einfach laufen alle Tests aus der IDE.

Das Problem, das ich in lief war, dass ich viel Zeit Aufrechterhaltung der Code verbrachte die Testumgebung mehr als die Tests einzurichten. Ganz zu schweigen davon, dass es eine lange Zeit wegen all dieser Kopiervorgang zu laufen hat. Auch ich brauchte verschiedene Szenarien, einschließlich der Installation zu testen, also ich die Datenbank auf verschiedene Anfangszustände können benötigt einzustellen.

Ich war neugierig auf das, was Sie Funktionstests zu automatisieren, um einige dieser Probleme zu lösen, und es immer noch einfach gemacht habe zu halten.

mehr Informationen Da die Menschen, um weitere Informationen gebeten, hier ist es. Ich bin mit ASP.NET mit Visual Studio und Cassini (die integrierten Web-Server). Meine Unit-Tests laufen in MbUnit (aber das ist nicht so wichtig. Könnte NUnit oder XUnit.NET sein). Normalerweise habe ich eine separate Einheit Test-Framework alle meine WATIN Tests laufen. In der Phase Assembly, beginne ich den Web-Server und kopieren Sie alle meinen Web-Anwendungscode vor Ort.

Ich bin in Lösungen für jede Plattform interessiert, aber ich kann mehr Beschreibungen auf benötigen, was jedes Ding bedeutet. :)

War es hilfreich?

Lösung

Phil,

Automation kann nur schwer zu halten, aber je mehr Sie verwenden, um Ihre Automatisierung für die Bereitstellung, je mehr Sie es für Testaufbau nutzen können (und umgekehrt).

Ehrlich gesagt, ist es einfacher, Automatisierungscode zu entwickeln, ist es Factoring und in spezifische, kleine Einheiten von Funktionalität Refactoring, wenn ein Build-Tool, das nicht
nur Fahr statisch kompilierten, Pre-faktorisierter Funktionseinheiten, wie es der Fall mit NAnt und MSBuild ist. Dies ist einer der Gründe dafür, dass viele Menschen, die relativ frühe Nutzer von toole wie NAnt waren, haben zu Rake weg bewegt. Die Freiheit zu behandeln Code als jeder anderer Code aufzubauen - bis cotinually seinen Inhalt und Form zu entwickeln - größer mit Rake. Sie müssen nicht mit der gleichen Stase in den Automatisierungs Artefakte so einfach und schnell mit Rake am Ende, und es ist viel einfacher zu Skript in Rake als NAnt oder MSBuild.

So wird ein Teil des Kampfes von Natur aus in den Werkzeugen verbunden. Um Ihre Automatisierung sinnvoll und gepflegt zu halten, sollten Sie vorsichtig sein, Hindernisse sein, dass statische Build-Tools wie NAnt und MSBuild verhängen.

Ich würde vorschlagen, dass Sie nicht paar Testumgebung Boot-Umreifung von Montagelast. Das ist eine von innen nach außen Kopplung, die nur kurze Bequemlichkeit dient. Es ist nichts falsch (und wahrscheinlich alles richtig) mit auf die Kommandozeile zu gehen und die Build-Task ausführt, die die Umgebung einrichtet, bevor Tests laufen entweder von den IDE oder von der Kommandozeile oder aus einer interaktiven Konsole, wie der C # REPL aus das Mono-Projekt oder aus IRB.

Die Testdaten-Setup ist einfach nur ein Schmerz in den Hintern manchmal. Es muss getan werden.

Sie werden eine Bibliothek müssen, dass Sie Datenbank-Status zu erstellen und bereinigen aufrufen können. Sie können diese Anrufe direkt von Ihrem Testcode machen, aber ich neige persönlich zu tun, dies zu vermeiden, weil es mehr als eine gute Verwendung von Testdaten oder Probendaten-Steuercode ist.

Ich fahre alle Beispieldaten Steuerung von HTTP. Ich schreibe Controller mit Aktionen speziell für die Probendaten zu steuern und Ausgabe GETs gegen diese Aktionen durch Selen. Ich benutze diese Daten zu erstellen und bereinigen. Ich kann diese Aktionen zusammenstellen GETs gemeinsame Szenarien von Setup-Daten zu erstellen, und ich kann bestimmte Werte für Daten als Anforderungsparameter übergeben (oder Formular-Parameter, wenn es sein muss).

Ich halte diesen Controller in einem Gebiet, das ich in der Regel „test_support“ nennen.

Meine Automatisierung der Website für die Bereitstellung des test_support Bereich oder seine Routen und Mapping nicht bereitstellen. Im Rahmen meiner Stationierung Überprüfung Automatisierung, stelle ich sicher, dass der test_support Code nicht in der Produktion App ist.

ich auch den test_support Code verwenden, die Kontrolle über die gesamte Umgebung zu automatisieren - Dienstleistungen mit Fälschungen zu ersetzen, Subsysteme Ausschalten Ausfälle und Ausfallsicherungen zu simulieren, Aktivierung oder Deaktivierung von Authentifizierung und Zugriffskontrolle für die Funktionsprüfung, die nicht mit diesen Facetten betreffen, usw.

Es gibt eine große Sekundärwert Ihres Web-App-Beispieldaten oder Testdaten aus dem Netz zu steuern: Wenn die App Demonstrieren oder wenn explorative Testen zu tun, können Sie die Datenszenarien erstellen müssen Sie nur durch die Ausgabe einig gegen bekanntes bekommt (oder erratbar) URLs im test_support Bereich. Wirklich eine disziplinierten Anstrengungen, um hier zu erholsamen Routen und Ressourcenorientierung halten wird wirklich auszahlen.

Es gibt viel mehr zu dieser funktionalen Automatisierung (einschließlich Test, Implementierung, Demonstrieren, etc.), so dass die besser gestaltete diese Ressourcen sind, desto besser ist die Zeit, die Sie über den langen Flur, und desto mehr Möglichkeiten haben Sie die Aufrechterhaltung‘ ll finden sie in unforseen aber vorteilhaft Möglichkeiten zu nutzen.

Zum Beispiel das Schreiben Domain Modellcode über das semantische Modell Ihrer Webseiten helfen viel verständlicher Testcode zu erstellen und die Sprödigkeit zu verringern. Wenn Sie diese gut tun, können Sie die gleichen Modelle mit einer Vielzahl von verschiedenen Treiber verwenden, so dass Siekann sie in Stresstests und Belastungstests sowie Funktionstest nutzen sowie sie von der Kommandozeile als Sondierungs Tools. By the way, ist diese Art der Sache einfacher zu machen, wenn Sie nicht mit Fahrertypen gebunden sind, wie Sie sind, wenn Sie eine statische Sprache verwenden. Es gibt einen Grund, warum viele führenden Test Denker und Macher in Ruby arbeiten, und warum ist Watir in Ruby geschrieben. Reuse, Zusammensetzung und Ausdruckskraft ist viel einfacher, in Ruby als Code C # Tests zu erreichen. Aber das ist eine andere Geschichte.

Lassen Sie sich irgendwann aufholen und mehr über das andere 90% dieses Zeug reden:)

Andere Tipps

Wir haben Plasma an einem Projekt. Er emuliert einen Webserver in Prozess - zeigen Sie es nur an der Wurzel Ihrer Web-Anwendung-Projekt.

Es war überraschend stabil - kein Kopieren von Dateien oder einen aus Prozess-Server Starten

.

Hier ist, wie ein Test mit Plasma für uns sieht ...

    [Test]
    public void Can_log_in() {
        AspNetResponse response = WebApp.ProcessRequest("/Login.aspx");
        AspNetForm form = response.GetForm();

        form["UserName"] = User.UserName;

        form["Password"] = User.Password;

        AspNetResponse loggedIn = WebApp.ProcessRequest(Button.Click(form, "LoginUser"));


        Assert.IsTrue(loggedIn.IsRedirect());

        AspNetResponse homePage = WebApp.ProcessRequest(loggedIn.GetRedirectUrl());

        Assert.AreEqual(homePage.Status, 200);
    }

All "AspNetResponse" und "aspnetForm" Klassen sind mit Plasma enthalten.

Wir sind derzeit mit einem automatisierten Build-Prozess für unsere asp.net MVC-Anwendung.

Wir verwenden die folgenden Tools:

  • Teamcity
  • SVN
  • nUnit
  • Selen

Wir verwenden ein msbuild Skript, das auf einem Build-Agent läuft, die jede Menge Maschinen sein kann. Das msbuild Skript wird die neueste Version von Code aus dem SVN und baut es.

Bei Erfolg es setzt dann den Artefakte zu einem bestimmten Maschine / Ordnern und erstellt die virtuelle Website in IIS.

Wir haben dann MSBuild contrib Aufgaben verwenden SQL-Skripte ausführen, um die Datenbank und Laden von Daten zu installieren, könnten Sie auch eine Wiederherstellung tun.

Bei Erfolg treten wir die nUnit Tests ab. Der Testaufbau sorgt dafür, dass Selen ist und läuft und treibt dann die Selen-Tests viel in der gleichen Art und Weise, dass Watin tut. Selen hat einen guten Recorder für Tests, die auf c # exportiert werden können.

Das Gute an Selen ist, dass Sie fahren auf IE beschränkt FF, Chorme und IE anstatt das war der Fall mit Watin das letzte Mal, dass ich es sah. Sie können auch Selen verwenden Lasttests mit dem Selenium Grid zu tun, deshalb können Sie die gleichen Tests wiederverwendet werden.

Bei Erfolg msbuild dann markiert die Build in SVN. Teamcity hat einen Job, der über Nacht läuft, dass den neuesten Tag zu einer Staging-Umgebung bereit für den Business-Anwender bereitstellen wird den Projektstatus am nächsten Morgen zu überprüfen.

In einem früheren Leben, das wir Nant & msbuild Skripte hatten voll die Umgebung zu verwalten (Java installieren, Selen usw.) aber das macht eine Menge Zeit in Anspruch nehmen, um ein vorge erf wir jeden Build-Agent übernehmen hat diese installiert. Im Laufe der Zeit werden wir diese Aufgaben.

Warum brauchen Sie den Code kopieren? Graben Cassini und lassen Sie Visual Studio ein virtuelles Verzeichnis für Sie erstellen. Sicher, die Devs muss vor dem Ausführen von Web-Tests zu bauen erinnern, wenn der Web-App geändert hat. Wir haben festgestellt, dass dies keine große Sache ist, vor allem, wenn Sie Web-Tests in CI ausgeführt werden.

Daten ist eine große Herausforderung. Soweit ich sehen kann, müssen Sie zwischen unvollkommenen Alternativen wählen. Hier ist, wie wir damit umgehen. Zuerst soll ich erklären, dass wir mit einem großen Komplex Erbe WebForms App arbeiten. Ich sollte auch erwähnen, dass die Domain-Code für die Erstellung von Testdaten aus dem Testprojekt nicht gut geeignet ist.

Das hat uns ein paar Möglichkeiten. Wir könnten: (a) Laufdaten-Setup-Skripte unter dem Build, oder (b) erstellen, alle Daten über Web-Tests, um die eigentliche Web-Site. Das Problem mit der Option (a) ist, dass Tests mit Skripten in einer Minute Ebene gekoppelt werden. Es macht meinen Kopf Pochen über die Synchronisation Web-Test-Code mit T-SQL zu denken. Also gingen wir mit (b).

Ein Vorteil von (b) besteht darin, dass Ihr Setup bestätigt auch das Anwendungsverhalten. Das Problem ist ... Zeit .

Idealerweise sollten Tests unabhängig sein, ohne zeitliche Kopplung (in beliebiger Reihenfolge ausgeführt werden) und keinen Kontext teilen (z.B. gemeinsame Testdaten). Der gemeinsame Weg zu handhaben ist die Einrichtung und abzureißen Daten mit jedem Test. Nach einiger sorgfältigen Überlegung haben wir beschlossen, diese Regel zu brechen.

Wir verwenden Gallio (MbUnit 3), die einige nette Features bietet, die unsere Strategie unterstützen. Erstens, es können Sie die Ausführungsreihenfolge bei der Befestigung und Testebene angeben. Wir haben vier "Setup" Leuchten, die -4 geordnet, -3, -2, -1. Diese laufen in der angegebenen Reihenfolge und vor allem „non-Setup“ Vorrichtungen, die standardmäßig haben einen Auftrag von 0

Unser Web-Test-Projekt ist abhängig von dem Build-Skript für nur eine Sache: ein einzigen bekannten Benutzername / Passwort. Dies ist eine Kopplung kann ich leben. Da die Setup-Tests ausführen bauen sie ein „Datenkontext“ Objekt nach oben, die Kennungen von Daten (Unternehmen, Anwender, Lieferanten, Kunden, usw.) enthält, die später verwendet wird (aber nie geändert) in ganz anderen alle Vorrichtungen. (Von Identifikatoren, ich nicht unbedingt Tasten bedeuten. In den meisten Fällen unsere Web-UI aussetzt nicht eindeutige Schlüssel. Wir müssen die App mit Namen oder andere Proxies für echte Kennungen navigieren. Mehr dazu weiter unten).

Gallio können Sie auch festlegen, dass ein Test oder eine Befestigung an einem anderen Test oder Befestigung abhängt. Wenn ein Präzedenzfall ausfällt, wird die abhängigen übersprungen. Dadurch verringert sich das Übel der zeitlichen Kopplung durch „Cascading Versagen“ zu verhindern, die viel Verwirrung ernten kann.

Datenbaseline-Test Erstellen einmal, statt vor jedem Test, beschleunigt die Dinge viel nach oben. Allerdings könnte nehmen die Setup-Tests noch 10 Minuten zu laufen. Wenn ich auf neue Tests arbeiten möchte ich sie häufig laufen und erneut ausführen. Geben Sie ein anderes cooles Feature Gallio: Ambience. Das Ambiente ist ein Wrapper um DB4, die eine sehr einfache Art und Weise bietet Objekte bestehen bleiben. Wir verwenden es, den Datenkontext automatisch zu anhalten. So Setup-Tests müssen nur einmal zwischen Erneuerungen der Datenbank ausgeführt werden. Danach können Sie einige oder alle anderen Befestigungen wiederholt ausgeführt werden.

Was ist also mit Testdaten Reinigung? Brauchen wir nicht von einem bekannten Zustand beginnen? Dies ist eine Regel, die wir gefunden haben, es sinnvoll zu brechen. Eine Strategie, die für uns arbeitet, ist lange Zufallswerte für Dinge wie Firmennamen zu verwenden, die Benutzername, etc. Wir haben festgestellt, dass es nicht sehr schwierig ist, einen Testlauf in einem logischen „Datenraum“ so zu halten, dass es nicht Beule in andere Daten. Sicherlich fürchte ich den Tag, dass ich stundenlang nach unten Jagd nach einem Phantom versagt Test nur feststellen, dass es einige Datenkollision ist. Es ist ein Trade-off, dass für uns arbeitet zur Zeit.

Wir verwenden Watin. Ich mag es sehr. Ein weiterer Schlüssel zum Erfolg ist etwas, Scott Bellware zu anspielte. Wie wir Tests erstellen wir bauen ein abstraktes Modell unserer UI auf. Anstatt also folgendermaßen aus:

browser.TextField("ctl0_tab2_newNote").TypeText("foo");

Sie wisehe dies würde in unseren Tests:

User.NotesTab.NewNote.TypeText("foo");

Dieser Ansatz bietet drei Vorteile. Erstens haben wir nie eine magische String wiederholen. Dies reduziert die Sprödigkeit. Zweitens sind Tests viel einfacher zu lesen und zu verstehen. Last, verstecken wir den größten Teil der dem Watin Rahmen hinter unseren eigenen Abstraktionen. Im zweiten Beispiel ist nur eine Watin Typetext-Methode. Dadurch wird es einfacher machen, wie die Rahmen Änderungen zu ändern.

Hope, das hilft.

Es war schwierig, aber nicht unmöglich, eine Integrationstestphase in den Build-Prozess unter Verwendung von Maven zu bauen. Was geschah, war im Wesentlichen so aus:

  • Ignoriere alle JUnit-Tests in einem bestimmten Verzeichnis, es sei denn die Integrationstestphase ausgelöst wird.
  • Fügen Sie ein Maven-Profil, um die Integrationstests auszuführen.
  • Für die Vorintegration Testphase -

  • Start Jetty Ausführen der Anwendung eine Testdatenbank zu treffen.

  • Starten Sie den Selen-Server
  • Ausführen Selen Integrationstests in Integrationstestphase
  • Stop Selen-Server
  • Stop Selen

Die Schwierigkeit in diesem Schritt war wirklich Anlegestelle Einrichtung - wir es nicht gerade von einem Krieg zu starten bekommen könnten, so müssen wir tatsächlich Anlegestelle haben auspacken der Krieg, dann den Server laufen - aber es funktioniert gut, und automatisiert ist -. alles, was Sie tun müssen, ist MVN -PintegrationTest geben (das war unser Integrationstest Profilnamen) und aus ging es

meinen Sie das automatische Starten Prüfung nach dem Bauprozess abgeschlossen? Sie könnten automatisierte Skripte schreiben, um die Build-Dateien in ein Arbeits IIS zu kopieren, während die Build erfolgreich erfüllt. Und dann beginnt die automatisierten BVT-by-Call MSTest.exe oder andere Methoden.

Sie können einen Versuch mit autoitx oder irgendeine Funktion Sprache wie Python, Ruby bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top