Home > Java JEE, Software Entwicklung, Testing > canoo webtest – Web-Anwendungen automatisch testen

canoo webtest – Web-Anwendungen automatisch testen

In der Softwareentwicklung haben sich in den letzten Jahren diverse Praktiken des automatisierten Testens etabliert. Die bekannteste Methode dürfte der Unit Test sein. Dabei wird jede Komponente einer Anwendung in einer wohldefinierten Umgebung einzeln abgetestet. In Java lässt sich diese Art Tests sehr einfach mit JUnit und Ant bewerkstelligen. Sollen aber sogenannte Usecases einer Web-Anwendung überprüft werden, stößt man schnell an die Grenzen des machbaren. Schließlich werden Dienste vorausgesetzt, die nur der JEE-Container ( Tomcat, JBoss) zur Verfügung stellt. Diese Dienste sind beim Testen einer Einheit ausserhalb des Containers nicht zwangsläufig vorhanden. Oft wird aus diesen Gründen das Testen mit echten Personen durchgeführt. Doch steigt mit der Anzahl der Usecases der Testaufwand exponentiell, was dazu führt, dass nicht alle Tests auf jede neue Version angewendet werden. In diesem Artikel werde ich zeigen, wie eine Web-Anwendung mit Hilfe von Canoo Webtest automatisch abgetestet werden kann.

Canoo Webtest bietet dem Benutzer die Möglichkeit, eine Web-Anwendung automatisch zu testen. Basierend auf der Ant Technologie können Tests in einem menschenlesbaren XML-Dialekt deklariert werden. Ein simples Beispiel könnte so aussehen:

<steps>
  <invoke
    description="Loginseite aufrufen"
    url="/login" />
  <verifyTitle
    description="Seitentitel sollte folgender sein: "
    text="Anmeldung" />
  <setInputField
    description="Setze Benutzernamen"
    name="username"
    value="max.mustermann" />
  <setInputField
    description="Setze Passwort"
    name="password"
    value="mypassword" />
  <clickButton
    description="Klick den login Knopf"
    name="login" />
  <verifyTitle
    description="Seitentitel sollte folgender sein:"
    text="Willkommen"  />
</steps>

Doch als erstes muss Canoo Webtest heruntergeladen und installiert werden. Keine Angst, das geht schnell und unkompliziert. Für den produktiven Einsatz empfehle ich die neueste, stabile Version. Von den Snapshots muss ich leider abraten, da beim erzeugen eines Projektes wichtige Dateien fehlten. Nach dem herunterladen der build.zip Datei kann das Archiv in ein beliebiges Verzeichnis entpackt werden. In diesem Verzeichnis muss sich danach ein bin Verzeichnis befinden, welches die Ausführungsskripte für Windows und Unix beinhaltet.

Dieses Verzeichnis muss dem Ausführungspfad bekannt gemacht werden, sodass Canoo Webtest einwandfrei verwendet werden kann.

  • Unter Windows geht das wie folgt:
    • In den Systemeinstellungen (Windows-Taste + Pause) wählt man den Reiter “Erweitert”.
    • Dort drückt man den Knopf “Umgebungsvariablen” und fügt eine neue Variable WEBTEST_HOME mit der entsprechenden Pfadangabe hinzu: “C:\Programme\Webtest” hinzu.
    • Anschließend bearbeitet man die Variable “Path” und fügt am Ende folgendes an: “;%WEBTEST_HOME%\bin”.
  • Unter Linux/Unix:
    • setenv WEBTEST_HOME /usr/local/webtest
      setenv PATH $PATH:$WEBTEST_HOME/bin in der ~/.login (tcsh)
    • export WEBTEST_HOME=/usr/local/webtest
      export PATH=$PATH:$WEBTEST_HOME/bin in der ~/.bashrc oder ~/.bash_login (bash)

Canoo Webtest generiert auf Wunsch ein Beispielprojekt, mit dem man sofort loslegen kann. Auf der Kommandozeile führt man folgenden Befehl aus:

webtest.sh -f pfad/zur/webtest/installation/webtest.xml wt.createProject

Während der Ausführung wird man nach einem Projektnamen gefragt. Ein gleichnamiges Verzeichnis wird nach der Eingabe im aktuellen Verzeichnis angelegt. Das neu angelegte Projekt enthält ein paar Beispieltests und Vorlagen. Um die Tests auszuprobieren ruft man lediglich webtest.sh im Verzeichnis des neu erstellten Projektes auf. Nach Abschluß aller Tests wird im Verzeichnis results ein HTML Report erzeugt, der automatisch angezeigt wird.

Um eigene Tests zu verwenden, löscht man im Verzeichnis tests am besten alle Dateien bis auf allTests.xml und eine weitere beliebige Datei. In der Datei allTests.xml werden alle vorhandenen Testdateien aufgerufen. Sie stellt das Verzeichnis aller auszuführenden Tests dar.

<?xml version="1.0"?>
<project name="allTests" default="test">
  <target name="test" description="führt alle tests aus">
    <ant antfile="loginTest.xml"/>
  </target>
</project>

Der anderen Datei gibt man einen sprechenden Namen, in diesem Fall loginTest.xml. In dieser Datei wird ein Testfall deklariert, welcher so aussehen könnte:

<?xml version="1.0"?>
<!DOCTYPE project SYSTEM "../dtd/Project.dtd">
<project name="loginTest" default="test">
  <target name="test">
    <webtest name="loginTest">
      &config;
      <steps>
        <invoke
          description="Loginseite aufrufen"
          url="/login" />
        <verifyTitle
          description="Seitentitel sollte folgender sein: "
          text="Anmeldung" />
        <setInputField
          description="Setze Benutzernamen"
          name="username"
          value="max.mustermann" />
        <setInputField
          description="Setze Passwort"
          name="password"
          value="mypassword" />
        <clickButton
          description="Klick den login Knopf"
          name="login" />
        <verifyTitle
          description="Seitentitel sollte folgender sein:"
          text="Willkommen"  />
      </steps>
    </webtest>
  </target>
</project>

Sicher ist aufgefallen, dass in dieser Datei kein Server deklariert ist, der getestet werden soll. Jedoch steht als erstes Element im <webtest> Element folgender Text: &config;
Dieser verweist auf die Datei includes/config.xml, welche alle Einstellungen enthält. Hier können nun der Name, Port und Protokoll des zu testenden Server eingetragen werden:

<!--
Wie alle Dateien dieses Ordners, ist dieser Inhalt als DTD Entität verfügbar (in diesem Fall &config;)
-->;
<config
  host="www.meinserver.de"
  port="8080"
  protocol="http"
  basepath=""
  summary="true"
  saveresponse="true"
  resultfile="${wt.resultfile}"
  resultpath="${wt.resultpath}"
  haltonfailure="false"
  haltonerror="false" />

Um eine möglichst vollständige Testabdeckung zu erreichen, fügt man in separaten Dateien für alle erdenklichen Anwendungsfälle Tests hinzu und trägt Sie in die Datei allTests.xml ein. Eine Dokumentation der zur Verfügung stehenden Schritte (Steps) findet man in der Anleitung für die Canoo Webtest Core Steps. Über mehr oder weniger generische Anwendungsfälle und deren sinnvolle Abtestung kann gerne in den Kommentaren berichtet werden.

  1. 10. Juli 2008, 09:10 | #1

    Es geht beim Canoo Webtest um eine Möglichkeit, alle Funktionen einer Webanwendung automatisiert zu testen. Im Laufe der Entwicklung zerbrechen neue Features unter Umständen alten Code. Obwohl die Unit tests weiterhin fehlerfrei durchlaufen kann es aber dennoch vorkommen, dass z.B. der Login nicht mehr funktioniert. Um dies frühzeitig auf einer Pre-live Version zu erkennen und nicht jede einzelne Funktion der Anwendung wiederholt manuell testen zu müssen kann man das mit canoo webtest automatisieren. Somit bleibt den hoffentlich vorhandenen menschlichen Testern häufige Wiederholungen erspart. Sie müssen lediglich die neuen Funktionen abtesten. Dabei schreiben sie idealerweise neue Tests für canoo, um die gleichen Tests nicht mehrfach ausführen zu müssen. Für einen Performancetest ist canoo webtest nur bedingt geeignet. Dafür gibt es z.B. ab (Apache Benchmark).

  2. 10. Juli 2008, 09:00 | #2

    Hallo,

    ich habe mir Canoo Webtest mal installiert und auch schon erfolgreich getestet.

    Aber irgendwie ist mir noch nicht so ganz klar, was ich im Endeffekt jetzt daraus ersehe…
    Ich lege eine XML an mit einem Klickpfad quer über meine Website. OK.
    Dann bekomme ich meine Auswertung schön grafisch dargestellt mit Balkendiagrammen, die mir bei einem erfolgreichen Test eigentlich nur eines zeigen: Die “Duration”! Die Dauer, wie lange es gedauert hat, diese Seite aufzurufen…und dann?

    Kann ich mich ransetzen und schauen, ob ich die Seiten mit der längsten Abrufdauer noch optimieren kann oder wo evtl. Flaschenhälse auf der Seite entstehen.

    Wars das? Oder habe ich hier irgendwas grundlegend nicht verstanden?

  3. 10. Juli 2008, 10:49 | #3

    Aha…verstehe.

    Danke. Endlich mal ne Info :-)

    Es ist schon schwer, Tutorials, Anleitungen oder Berichte über Canoo in Deutsch zu finden.

    Was eigentlich schade ist, denn um mich durch die komplette englische Seite zu wühlen, fehlt mir leider die Zeit.

    Deines ist echt das beste!

  4. Bianca
    12. Juli 2008, 15:19 | #4

    Ich bin auch gerade dabei, einige Webtests mit Canoo zu schreiben, jedoch birgt einer immer ein Problem und ich weiß nicht, wie ich das lösen könnte. Und zwar soll ein Link getestet werden, um zu eBay zu gelangen.
    Mein Code:

    Und dann bekomm ich immer die Fehlermeldung:
    JavaScript error loading page http://www.ebay.de: ReferenceError: “vbCheckActiveXControl” is not defined. (http://include.ebaystatic.com/v4js/de_DE/e571i/GlobalNavVjoOpt23_Ebay_e571i6855445_1_de_DE.js#271)

    Wie kann ich diese Fehlermeldung umgehen? Sodass der Link getestet wird und aber auch funktioniert.

    Gruß und danke schon mal,
    Bianca

  5. Bianca
    12. Juli 2008, 15:20 | #5

    Gut, noch mal die ganze Fehlermeldung:
    JavaScript error loading page http://www.ebay.de: ReferenceError: “vbCheckActiveXControl” is not defined. (http://include.ebaystatic.com/v4js/de_DE/e571i/GlobalNavVjoOpt
    23_Ebay_e571i6855445_1_de_DE.js#271)

    Und nochmal der Code:

  6. Bianca
    12. Juli 2008, 15:22 | #6

    Der Code wird leider nicht angenommen. Aber er ist definitiv richtig, da es bei den anderen Links auch funktioniert, um die zu testen.
    Nur bei eBay ist immer so ein JavaScript Fehler.

  7. 12. Juli 2008, 23:17 | #7

    Bitte schreib mir eine email mit dem Code im Anhang. Ich werde dann versuchen, den Fehler nachzuvollziehen und dir zu helfen. Email: siehe Kontaktseite.

  8. Bianca
    13. Juli 2008, 09:39 | #8

    Es ist jetz etwas blöd, aber ich find die Kontaktseite nicht. Drum probier ich es hier mal mit dem Code ohne Klammern, vielleicht gehts dann.
    project default=”link”
    target name=”link”
    webtest name=”linkcheck”
    steps
    invoke description=”check Links” url=”http://localhost/Homepage.php”
    verifyTitle description=”we should see the Homepage” text=”ProSem Homepage”
    group description=”check all the Links”
    clickLink label=”eBay” save=”eBay”
    verifyTitle text=”eBay: Neue und gebrauchte Elektronikartikel, Autos, Kleidung, Sammlerstücke, Sportartikel und mehr – alles zu günstigen Preisen”
    /group
    /steps
    /webtest
    /target
    /project

  9. Dennis
    15. August 2008, 14:30 | #9

    Hallo Christian,

    hast Du zufällig Erfahrungen mit dem intern verwendeten HTML-Unit? Ich habe eine Seite die getestet werden muss und das Problem, dass webtest sehr restrikitv mit dem Umgang nicht wohlgeformter HTML seiten ist. Die Seite ist sehr groß und nicht mal eben XHTML-konform machbar. Da es gerade auf HTML-Unit 2.2 geändert wurde, wollte ich fragen in wie weit sich die Akzeptanz gegenüber nicht wohlgeformten Seiten geändert hat.

    Kannst Du noch etwas über “Best Practice” der Testerstellung schreiben? Wie strukturiert man seine Tests am besten, etc.? Ich finde es ein bischen messy wenn ich nur mit xml Dateien hantiere. Kennst Du vielleicht einen guten editor mit einer art autocompletion für DTD-verlinkung?

    LG dennis

  10. 18. August 2008, 12:52 | #10

    Hallo Dennis,

    HTML-Unit ist ein Art Ersatzbrowser zum testen von Websites. Canoo Webtest benutzt HTML-Unit als unterliegende Schicht, um Tests durchzuführen. Ich nehme an, dass auch die neueste HTML-Unit Version mit nicht wohlgeformten HTML Code Probleme hat. Als Lösungsansatz könnte man versuchen, nur Teile der Website zu testen, bzw. den Server so zu konfigurieren, dass nur Teile gerendert werden. Diese könnten dann getestet werden.

    Zum Thema Best Practice kann ich wenig sagen. Die XML Testdateien sollten in deinem Projekt liegen und einen sprechenden Namen haben. Idealerweise gibt es einen ANT oder MAVEN Task, der das entsprechende Verzeichnis absucht und alle Namen der XML-Testdateien in das Haupttestscript einträgt. Somit wird keins vergessen und man kann sehr leicht neue Tests hinzufügen, ohne ständig das Testscript anpassen zu müssen.

  11. Bernd
    26. November 2010, 14:13 | #11

    Hallo Herr Bünte,
    die Webapplikationen , die ich zu testen hätte besitzen zum Teil HTML Felder zum Login
    als auch Java-Script Textfelder als auch java-Script Menüs zum Logout.
    Zum Teil müssten auch Exceptions an bestimmten Stellen genau definiert werden, damit das Testskript durchläuft. Habe das schon mehrfach mit canoo webtest versucht .
    Können Sie mir Beispiele für die Bedienung von Javascript-Menüs und das Füllen von Java-Script Textfeldern zeigen. Danke

  12. 15. Dezember 2010, 11:59 | #12

    Hallo Bernd,

    der Artikel zu canoo webtests ist jetzt mehr als 3 Jahre alt. Seit dieser Zeit kann sich viel verändert haben. Da ich seit Anfang 2008 mit Ruby und nicht mehr Java programmiere, kann ich Ihnen leider nicht weiter helfen.

    Bei der Suche trotzdem viel Erfolg.

  13. Steffen
    26. April 2012, 17:24 | #13

    ich habe eine Frage zu Canoo WebTest und hoffe bei Ihnen richtig zu sein! Ich versuche nun seit Tagen auf einer VM (Windows 7 Profesional x64) Canoo WebTest zum laufen zu bringen und scheitere immer wieder! Ich habe bereits auf einem anderen Rechner (Windows 7 Ultimate x64) das Selbe probiert und alles hat wunderbar nach der Anleitung geklappt!

    Ich habe für Java die aktuellen Versionen (jdk-7u3-windows-i586 & jdk-7u3-windows-x64) installiert und sogar mehrere Experimente mit der Umgebungsvariable durch. Selbst die direkte Eingabe in der webtest.bat (set JAVA_CMD=”%JAVA_HOME%\bin\java.exe”) hat immer wieder den selben Fehler zu folge!

    —————————————————————————————————————————
    C:\Users\Admin>webtest -f C:\Program Files\Webtest\webtest.xml wt.createProject

    “C:\Program Files\Java\jdk1.7.0_03\\bin\java.exe” -Xms64M -Xmx256M -cp “C:\Program Files\Webtest\bin
    \..\lib\ant-launcher-1.7.0.jar” -Dant.library.dir=”C:\Program Files\Webtest\bin\..\lib” “-Dlog4j.con
    figuration=file:/C:\Program Files\Webtest\bin\..\lib/log4j.properties” org.apache.tools.ant.launch.L
    auncher -nouserlib -lib “C:\Program Files\Webtest\bin\..\lib\build;C:\Program Files\Webtest\bin\..\l
    ib\build\clover.jar” -f C:\Program Files\Webtest\webtest.xml wt.createProject
    Buildfile: C:\Program does not exist!
    Build failed
    —————————————————————————————————————————

    Können Sie mir einen Tipp geben wo mein Denkfehler liegt?

    Vielen vielen Dank

    Steffen Lorenz

  14. 13. Mai 2012, 12:07 | #14

    So wie ich das sehe, wird der Pfad falsch erkannt. Versucht mal das Freizeichen in “Program Files” zu escapen:

    webtest -f C:\Program\ Files\Webtest\webtest.xml
    oder
    webtest -f C:\Program%20Files\Webtest\webtest.xml

    Ich glaube daran wird es liegen.

  1. Bisher keine Trackbacks