Automatisierters Testen von Web Apps mit Selenium

0 | 0 Kommentare | 20353 Aufrufe
Sie können diese Wikiseite nach der Anmeldung auf Webmasterpro bearbeiten. Helfen Sie mit und verbessern Sie "Automatisierters Testen von Web Apps mit Selenium" mit Ihrem Wissen!

Anzeige Hier werben

Bild zu Automatisierters Testen von Web Apps mit Selenium

Selenium ist ein Framework zur Automatisierung von Tests. Das Framework ist speziell darauf ausgelegt Webseiten und Applikationen von der User-Seite aus zu testen.

Allgemeines

Selenium ist in Java programmiert und lässt sich deshalb auf jedem System, das über eine aktuelle JRE besitzt, ausführen. Grundsätzlich wird nur ein Server gestartet, der sich als Proxy zwischen die erstellten Test-Cases und die jeweiligen Browser setzt und so die Remote-Steuerung des Browsers zulässt.

Es gibt zwei Herangehensweisen zur Erstellung von Tests. Diese lassen sich aber auch gut verbinden um schneller zu einem Ergebnis zu gelangen.

Die IDE

Bild zu Automatisierters Testen von Web Apps mit Selenium
Klicken zum Vergrößern

Die Selenium IDE ist ein Firefox-Plugin und dient dazu Browserinteraktionen aufzunehmen, abzuspielen und Test-Cases zu visualisieren. Abhängig vom Aufbau der Website funktioniert die Aufnahme entsprechender Kommandos besser oder schlechter, trotzdem ist die IDE sehr gut dazu geeignet ein Grundgerüst für einen komplexeren Test zu erstellen.

Leider bietet die IDE keine Elementauswahl, wie sie zum Beispiel der Firebug besitzt. Auch ist es nur möglich Klicks aufzunehmen, wenn man sie wirklich betätigt. Eine vorherige Inspektion des Kommandos ist nicht möglich. Dies stört vor allem bei Formularen, da auch das Aufnehmen der input-Felder erst beim Absenden des Formulars stattfindet. Ob alle Felder richtig aufgenommen wurden, lässt sich also erst nach dem Abschicken feststellen.

Die IDE lässt sich per Plugins um einige nützliche Features, wie zum Beispiel Highlighting oder Logging, erweitern. Eine Erweiterung für die Elementauswahl konnten wir zurzeit jedoch nicht finden.

Das Verhalten der IDE ist nicht immer konsistent, so wird zum Beispiel beim echo() Befehl der Wert des target-Felds ausgegeben und nicht, wie man vermutet, der Wert der im value steht.

Die IDE bietet die Möglichkeit, erstellte Cases in Scripte umzuwandeln. Dabei ist vor allem im deutschen Raum zu beachten, das Eingaben nicht Escaped werden. Umlaute in Elementen können hier also leicht zu Fehlern führen.
Die IDE bietet die Möglichkeit den Header der unterschiedlichen unterstützten Scriptsprachen beim Export zu verändern. So lässt sich das Problem mit den Umlauten zum Beispiel für Python mit einem einfachen #-*- coding: UTF-8 -*- am Anfang des Headers beheben.

Laut Menü gibt es noch die Möglichkeit ganze Test-Suites zu exportieren, leider war dies für keine der angebotenen Programmiersprachen möglich, der Versuch wurde immer mit einer Fehlermeldung quittiert. Der Export einzelner Cases funktioniert jedoch, sodass man die Möglichkeit hat diese nach dem Export händisch zu einer Suite zusammenzufügen.

Selbst Programmiert

Selenium bietet die Möglichkeit die Test-Cases in mehreren Programmiersprachen zu erstellen, derzeit existieren Bibliotheken für

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

Um einen Test für Selenium zu schreiben, muss nur das Package bzw. Modul importiert werden. Wie dass aussieht, kann man weiter unten im Beispiel sehen. Zusätzlich lassen sich per HTTP-Request Kommandos an den Selenium Remote Control Server übermitteln, somit ist es prinzipiell möglich mit jeder Programmiersprache, die HTTP-Requests beherrscht, den Server und somit die Tests zu steuern.

Installation

Da der Server in Java geschrieben ist, wird eine Installation für ihn nicht benötigt. Er kann einfach heruntergeladen und per java -jar gestartet werden.

Nur für die Clients der entsprechenden Programmiersprachen benötigt man eine Installation, diese ist aber zum Beispiel in Python bereits mit einem einfach sudo pip install -U selenium getan. Eine Auflistung aller wichtigen Informationen zur Installation lässt sich hier finden.

Anwendung

Bild zu Automatisierters Testen von Web Apps mit Selenium
Anwendung 1
Bild zu Automatisierters Testen von Web Apps mit Selenium
Anwendung 2

Das Framework benötigt eine gewisse Einarbeitung, doch lassen sich bereits nach kurzer Zeit, auch Dank der IDE, einfache Tests basteln. Als Beispiel wollen wir hier einen einfachen Test zeigen der herausfindet, ob unsere Website auf der ersten Seite der Google-Suchergebnisse zu finden ist. Dazu lassen wir unsere Aktionen, die uns zu den Google-Ergebnissen führen, von der IDE aufnehmen. Dort angekommen markieren wir den gewünschten Text und können ihn dann per Rechtsklick - verifyTextPresent auf Existenz prüfen lassen.
Dies wäre das normale Vorgehen wie es auch im Beispielvideo der Selenium-Macher vorgestellt wird, der aktuelle Test wird aber fehlschlagen.

Google lädt nach dem Klick die Seite nicht neu, deswegen nimmt Selenium auch einen click auf und keinen clickAndWait.
Die IDE macht es uns allerdings einfach dieses kleine Problem zu beheben. Per Klick auf das entsprechende Kommando können wir dieses nach unseren Wünschen ändern. Wir könnten hier ein clickAndWait oder waitForPageToLoad anwenden, da die Googleseite aber wie gesagt nicht komplett neu geladen wird, wird der wait-Befehl nicht aufgelöst und läuft bis zum Timeout durch (siehe Bild Anwendung 1), deswegen erhalten wir auch hier einen Timeout-Fehler.

Deshalb werden wir bei diesem Beispiel den Befehl waitForTextPresent einsetzen. Diesen können wir entweder per Rechtsklick - "Show All Available Commands" finden oder direkt ins Kommando-Feld eintragen. Dadurch können wir uns jetzt auch das waitForPageToLoad nach dem Klick sparen und erhalten einen Case der fehlerfrei durchläuft, sofern natürlich auf der ersten Seite der gewünschte Text vorliegt. Sollte der Text nicht vorhanden sein, wird nach Ablauf des Timeout ein Fehler erzeugt. Der voreingestellte Timeout ist 30000ms, dieser lässt sich aber einfach in den Optionen verändern. Dabei sollte man allerdings beachten, dass alle wait-Funktionen ohne gesonderten Timeout auf dieses Attribut zurückgreifen, daher kann ein zu geringer Wert an einer anderer Stelle des Tests, oder der Suite, zu Problemen führen.

Bereits an diesem Beispiel kann man erkennen, dass das Erstellen von Test-Cases alles andere als trivial ist. Vor allem Vorgänge die nicht Standardmäßig ablaufen, benötigen eine gute Kenntnis der Selenium API um verlässliche und schnelle Tests zu erstellen. Das Erhalten dieser Kenntnisse, ist die größte Hürde die vor der Verwendung von Selenium steht, denn hier muss doch einiges an Zeit investiert werden.

Exportieren wir den Code nach Python, sieht dieser so aus:

 
Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#-*- coding: UTF-8 -*-

from selenium import selenium
import unittest, time, re

class googleTest(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*firefox", "http://www.google.de/")
        self.selenium.start()
    
    def test_google(self):
        sel = self.selenium
        sel.open("/")
        sel.type("q", "webmasterpro")
        sel.click("btnG")
        for i in range(60):
            try:
                if sel.is_text_present(u"Webmasterpro.de - Magazin für professionelles Webdesign"): break
            except: pass
            time.sleep(1)
        else: self.fail("time out")
    
    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

Der Code ist recht übersichtlich und lässt sich leicht anpassen. Der Durchlauf dieses Tests dauert ca. 10 Sekunden, dabei wird allerdings ein erheblicher Teil der Zeit darauf verwendet die Testumgebung aufzubauen.

Bild zu Automatisierters Testen von Web Apps mit Selenium

Die Zeit die ins Lernen der API fließt zahlt sich schnell aus. Mit der entsprechenden Kenntnis sind zeitaufwendige Tests in relativ kurzer Zeit erstellt und können von da an automatisiert ablaufen.

Selenium-Grid

Umfangreiche Tests können schnell einen gewissen Zeitrahmen sprengen. Selenium-Grid ist ein Zusatz zum normalen Selenium und bietet ein mächtiges Tool um Tests auf mehrere Threads und Rechner aufzuteilen. Eine sehr gute Installations-Anleitung sowie eine Demo lassen sich auf der offiziellen Seite finden.

Zum Zeitpunkt des Tests war die Demo leider fehlerhaft (wahrscheinlich das oben angesprochene Problem mit Google-Live-Search). Trotzdem konnte man den Speedup gut beobachten. So wurden die Tests mit einem Client in 46 Sekunden erledigt, mit 4 Clients auf dem gleichen Rechner waren die Tests bereits in 16 Sekunden fertig.

Fazit

Die Einarbeitung in Selenium lohnt sich auf jeden Fall. Vor allem Entwickler die ihre Website nicht ungetestet ihren Usern vorsetzen wollen, sollten das Framework genauer unter die Lupe nehmen.

Durch die IDE lassen sich bereits nach kurzer Zeit erste Erfolge erzielen, die die doch umfangreichere Einarbeitung auffrischen. Vor allem bei Formularen spielt Selenium seine Stärken voll aus, da zeitraubendes Eintippen von Formulardaten oder Texten vollkommen automatisiert werden kann.

Dabei ist das IDE-Firefox-Addon trotz mancher Schwachstellen eine große Hilfe, vor allem beim Erstellen eines Grundgerüsts für einen komplexeren Test. Die Unterstützung aller beliebten Web-Entwicklungssprachen ist ein sehr großer Vorteil und vereinfacht die Anwendung des Frameworks enorm, da zusätzlich zum Erlernen der API nicht auch noch das zwanghafte erlernen einer neuen Sprache hinzukommt.

Die Möglichkeit Tests auf mehrere Threads bzw. auch Rechner zu verteilen erhöht die Anwendbarkeit des Frameworks enorm und erspart einem nochmal viel Zeit.

Positives

  • Mächtiges Werkzeug zur Erstellung anwendungsorientierter Tests
  • Open-Source
  • Möglichkeit JavaScript einzubinden und auszuführen
  • Unterstützung vieler Programmiersprachen (C#, Java, Perl, PHP, Python, Ruby)
  • Unterstützung vieler Test-Frameworks (Bromine, JUnit, RSpec, Test::Unit, TestNG, unittest)
  • Gute Dokumentation
  • Erweiterbar durch Plugins
  • Addon zur Erstellung von Test-Cases (nur Firefox)
  • Direktes Testen von erstellten Tests im Browser (nur Firefox)
  • Paralleles Testen mehrerer Browser und Test-Cases via Selenium Grid

Negatives

  • IDE noch nicht ganz ausgereift

Wikiseite bearbeiten

Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher haben 3 Personen an der Seite "Automatisierters Testen von Web Apps mit Selenium" mitgewirkt.

Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "Automatisierters Testen von Web Apps mit Selenium" hier bearbeiten.

Mitarbeiter

Kommentare: Automatisierters Testen von Web Apps mit Selenium