BLOG

Selenium für automatisierte Akzeptanztests einer Drupal-Installation

Selenium ist eine Software zur Durchführung von funktionalen Tests in der Softwareentwicklung. Im Gegensatz zu Softwaretests, welche den Code selber testen, beispielsweise, ob sich dieser an gültige Standards hält, richtet sich Selenium an die Funktionalität der Software. Der dahinter stehende Code findet dabei keine Beachtung. Im Verbindung mit Drupal können so Funktionen wie Login oder verschiedene Berechtigungen automatisiert überprüft werden.

Aber warum soll ich testen?

Bei der Umsetzung von Drupal-Konzepten kann es vorkommen, dass wichtige Einstellungen oder Konfigurationen vergessen oder durch das routinierte Bedienen der Drupal-Installation übersehen werden. Man weiß schließlich, wie das System 'richtig' zu bedienen ist. Der spätere Nutzer arbeitet aber u.U. anders mit dem Programm und nach einer 'falschen' Eingabe fliegt ihm das gesamte System um die Ohren. Darauf folgen Gespräche und Nachbesserungen und damit verbunden Stress und Zeitverlust, welches zulasten anderer Projekte fällt. Es ist utopisch zu glauben durch Softwaretests ein fehlerfreies Produkt ausliefern zu können.
Die Wahrscheinlichkeit, dass kritische Fehler auftreten, kann aber deutlich verringert werden. Allein die Überlegung, was überhaupt wie getestet werden soll, ermöglicht bereits einen anderen Blickwinkel auf das Produkt, welcher eventuelle Unzulänglichkeiten schon ans Licht bringen kann.

Funktionstests bei Drupal

Das Testen einer Drupal-Installation bietet sich beispielsweise bei komplexen und somit fehleranfälligeren Konzepten an. Beispielsweise in der Rechteverwaltung: Ein bestimmter User darf einen Inhaltstyp nur dann sehen, wenn er die gleichen Anfangsbuchstaben im Benutzernamen hat, einen anderen nur dann bearbeiten, wenn er einem bestimmten Vokabular-Term angehört und einen dritten nur dann veröffentlichen, wenn er von einem Autor einer bestimmten Rolle erstellt wurde, welcher die gleichen Geodaten im Profil angegeben hat
Wenn diese Rechtestruktur nicht ausreichend getestet wurde, können Fehler auftreten, welche einigen Nutzern plötzlich falsche Berechtigungen gewähren.
Ein solches Konzept per Hand ausreichend zu testen ist nicht nur anstrengend, sondern auf Dauer ebenfalls fehleranfällig, da nach jeder Änderung an der Drupal-Installation erneut getestet werden muss, was wiederum Frust und somit Nachlässigkeit nach sich ziehen kann. Wer füllt schon gerne 500-mal das selbe Formular aus und überprüft, ob es für bestimmte Nutzer sichtbar ist, denn letztes Mal hat es schließlich auch geklappt?

Selenium

Um derartige händische Fehler zu vermeiden, sollte auf Software zurückgegriffen werden, welche gar nicht anders kann als objektiv zu arbeiten. Der große Vorteil ist die Möglichkeit, den Test nach jeder Änderung am System wiederholen zu lassen, um festzustellen, ob sich durch die Änderung Fehler im System ergeben haben. Selenium ist eine OpenSource-Software zum Testen von Webanwendungen. Es wird eine 'Fernsteuerung' eines Webbrowsers sowie das Auslesen der angezeigten Inhalte ermöglicht. Selenium arbeitet als Proxy zwischen Webserver und Browser und bettet ein JavaScript in die Website ein, welcher vom Browser interpretiert wird und die so übermittelten Befehle ausführt. Die Fernsteuerung geschieht somit nicht, wie es zunächst den Eindruck vermittelt, von außen, sondern aus dem Inhalt der Webseite und dem darin enthaltenen Injected-JavaScript von innen.

Selenium IDE

Selenium IDE ist die einfachste Variante der Selenium-Familie. Es handelt sich dabei um ein Firefox-Plugin, welches ohne weitere Konfiguration sofort einsetzbar ist. Die Bedienung ist denkbar einfach, da eine Aufnahmefunktion verfügbar ist, welche alle Aktionen auf einer Webseite protokolliert. Die so gewonnenen Befehle können einfach wieder abgespielt werden. Das Befehlsspektrum reicht von "Klicke auf den Knopf und warte bis die nächste Seite geladen ist" (clickAndWait) bis "Schaue nach ob Zugriff Verweigert angezeigt wird" (verifyTextPresent). Auch Speicherfunktionen und Pfade im DOM werden unterstützt. Damit werden Funktionen möglich wie: 'Schaue nach, was der Inhalt des obersten Elements in der Liste ist und speichere dieses ab' (storeText).
Die Befehle werden in einer bestimmten Syntax abgespeichert, welcher Selenese genannt wird. Hierbei handelt es sich um eine dreispaltige HTML-Tabelle. Ein Befehl erhält eine Zeile, wobei das Kommando in der ersten Zelle steht und die verbleibenden zwei für Attribute wie Pfad und Variablenname verwendet werden können. Ein Beispiel anhand eines kleinen Google-Aufrufes:

  1. Rufe Google auf
  2. Fülle das Formular mit name="q" mit comm-press (Suchfeld)
  3. Klicke auf den Button mit name="btnG" (Suchen-Button) und warte bis die nächste Seite geladen ist
  4. Schaue nach ob der Text "www.comm-press.de" vorhanden ist

In Selenese sehen diese Befehle folgendermaßen aus:

  <table border="2" cellpadding="1" cellspacing="1">
    <thead>
      <tr>
        <td rowspan="1" colspan="3">google</td>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>open</td>
        <td>http://www.google.com</td>
        <td>&nbsp;</td>
      </tr>
      <tr>
        <td>type</td>
        <td>q</td>
        <td>comm-press</td>
      </tr>
      <tr>
        <td>clickAndWait</td>
        <td>btnG</td>
        <td>&nbsp;</td>
      </tr>
      <tr>
        <td>verifyTextPresent</td>
        <td>www.comm-press.de</td>
        <td>&nbsp;</td>
      </tr>
    </tbody>
  </table>

bzw.

google
open http://www.google.com  
type q comm-press
clickAndWait btnG  
verifyTextPresent www.comm-press.de  

Die Möglichkeiten eines Testskripts in Selenese sind zwar bereits sehr vielfältig, es können sogar eigene Kommandos hinzugefügt werden, dennoch ist ein solches Skript der Logik nicht mächtig. Schleifen oder Bedingungen sind dadurch nicht möglich. Ein Beispiel:

  1. Suche bei Google nach drupal
  2. Schaue nach, ob der Text "comm-press" vorhanden ist
  3. while(Text ist nicht vorhanden){
      schau auf der nächsten Seite nach
    }

Von Selenese zur Hochsprache

Das Problem mit der linearen Arbeitsweise von Selenese kann durch eine Hochsprache gelöst werden. Selenium IDE bietet hierfür eine Exportfunktion, welche den Selenese-Code in eine Programmiersprache übersetzt. Verfügbare Skriptsprachen sind:

  • Java
  • Groovy
  • C#
  • Perl
  • PHP
  • Python
  • Ruby

Nachdem das Selenese-Script in die gewünschte Sprache übersetzt wurde, können Anpassungen per Hand hinzugefügt werden. Die oben genannte Google-Such-Schleife sieht dann in PHP in etwa so aus:

<?php
 
// Öffne Google.com.
 
$this->open("http://www.google.com");

 
// Fülle das Suchformular mit 'drupal'.
 
$this->type("q", "drupal");

 
// Klicke auf 'suchen'.
 
$this->click("btnG");

 
// Warte bis die nächste Seite geladen wurde.
 
$this->waitForPageToLoad("30000");

 
// Seitenzähler.
 
$seite = 1;
 
// Anpassung des xPath.
 
$td = 12;

 
// Führe die Schleife solange aus bis der Text 'comm-press' vorhanden ist.
 
while (!$this->isTextPresent("comm-press")) {

   
// Klicke auf das Element mit dem angegebenen xPath
   
$this->click("//td[$td]/a/span[2]/b");

   
// Warte bis die nächste Seite geladen wurde.
   
$this->waitForPageToLoad("30000");

   
// Zähle Seite einen hoch.
   
$seite++;

   
// Sofern $td kleiner als 22 zähle einen hoch.
   
if ($td < 22) {
     
$td++;
    }
  }
 
// Ausgabe auf welcher Seite 'comm-press' gefunden wurde.
 
echo 'Gefunden auf Seite ' . $seite;
 
?>

Dieses Script dient nur zur Veranschaulichung. Es kann beispielsweise die letzten Ergebnis-Seiten nicht öffnen und gibt dann einen Fehler zurück. Aber für eine Demonstration sollte es ausreichend sein.
Nun stellt sich aber die Frage, wie dieses Script nun ausgeführt werden soll. Selenium unterstützt nur Selenese und keine der oben genannten Programmiersprachen.

Selenium RC

Selenium Remote-Control ist ein weiteres Tool aus der Selenium-Familie. Es bringt einen Proxy sowie die Driver für die jeweilige Programmiersprache mit. Der große Vorteil gegenüber Selenium IDE ist die Unabhängikeit vom Browser, da es sich hierbei nicht um ein Plugin für einen bestimmten Browser handelt. Es startet den gewünschten Browser und lässt ihn via JavaScript die gewünschten Befehle ausführen. Die Befehle können entweder per Hand in die Konsole oder, sinnvollerweise, von einem Script eingegeben werden.
Die unterstützten Sprachen benötigen zusätzlich ein entsprechendes Test-Framework. Beispielsweise für Java JUnit oder TestNG. Für PHP kann phpUnit verwendet werden. SimpleTest scheint auch zu funktionieren, hab ich allerdings nicht ausprobiert.
Die Installation von Selenium RC ist denkbar einfach. Sofern Java vorhanden ist, muss lediglich der Selenium-Server (selenium-server.jar) gestartet werden.
Das oben genannte Script muss noch mit den Setup-Daten versehen werden:

<?php
 
// Browserauswahl.
 
$this->setBrowser("*firefox");
 
// Startseite.
 
$this->setBrowserUrl("http://www.google.com/");
 
?>

Das vollständige Script mit Setup und phpUnit-Verweis sieht dann folgendermasen aus:

<?php
 
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

  class
GoogleSuche extends PHPUnit_Extensions_SeleniumTestCase {

    protected function
setUp() {
     
$this->setBrowser("*firefox");
     
$this->setBrowserUrl("http://www.google.com/");
    }

    public function
testMyTestCase() {
     
$this->open("/");
     
$this->type("q", "drupal");
     
$this->click("btnG");
     
$this->waitForPageToLoad("30000");

     
$seite = 1;
     
$td = 12;

      while (!
$this->isTextPresent("comm-press")) {

       
$this->click("//td[$td]/a/span[2]/b");
       
$this->waitForPageToLoad("30000");
       
$seite++;
        if (
$td < 22) {
         
$td++;
        }
      }
      echo
'Gefunden auf Seite ' . $seite;
    }

  }
 
?>

Ausgeführt werden kann dieses Script bei gestartetem Selenium-Server mit dem Konsolenbefehl phpunit script.php

Fazit

Selenium ist ein tolles Werkzeug zum automatisierten Testen von Webanwendungen. Besonders für komplexe Webseiten nimmt es viel Arbeit ab. Zu Beginn eines Projektes muss natürlich mehr Arbeit darin investiert werden, die Tests zu entwerfen und umzusetzen, langfristig muss aber nicht mehr getan werden, um die Funktionalität einer Webseite zu überprüfen, als das Testscript auszuführen. Es gibt noch weitere Komponenten von Selenium wie Selenium Grid, welches mehrere Selenium RC-Server verwalten kann. Hierbei wird der Test mit Konfiguration (also beispielsweise googlesuche.php auf Win XP mit IE6) per Konsole an ein Hub gesendet, welcher den Befehl automatisch an einen freien RC-Server mit entsprechender Konfiguraton weitergibt.

Hiermit ergibt sich eine Infrastruktur, welche eine Website auf relativ einfache Weise in verschieden Browser-OS-Kombinationen testen kann. Auch das periodische Testen ist per Cronjob einfach möglich. Der Funktionsumfang ist bei allen Selenium-Produken leider auf den von JavaScript beschränkt. So könne keine Alert-Fenster geschlossen oder Uploads getätigt werden. Selenium IDE ist wunderbar einfach zu bedienen, soll es dann aber mehr sein, setzt Selenium RC eine gewisse Einarbeitungsphase voraus, zumal die Doku besonders über den PHP-Driver nicht besonders vollständig ist. Wer dies also liest und gerne Dokus schreibt...

Wer noch mehr lesen möchte, dem sei die Analyse und Bewertung des Tools Selenium von Christian Rukes, Wulf Weich und Daniel Neuhaus der FOM Düsseldorf empfohlen.

Abschließend kann ich nur sagen: Hätte ich Selenium doch bloß schon gekannt, als ich noch Browser-Games gespielt habe...

Ich mag's

Kommentare

http://www1.inf.tu-dresde...

http://www1.inf.tu-dresde...

Sehr schöne Doku über Selenium.

Hochsprachen

Hi,

PHP, Python und Perl sind keine Hochsprachen. Es sind Skriptsprachen.

- j

Wow, es liest sogar jemand unsere Arbeiten

Das ist natürlich schön, wenn auch andere sich für seine Arbeiten interessieren. Danke für die Verlinkung!

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
Mit dem Absenden dieses Formulars, akzeptieren Sie die Datenschutzrichtlinie von Mollom.