User Interface Testing mit Python und Selenium

Letzte Aktualisierung: 16. Mai 2015

Je komplexer Applikationen werden, desto größer wird das Risiko, bestehende Funktionalitäten durch Änderungen an der Codebasis zu beeinträchtigen. Um von solchen Beeinträchtigungen möglichst vor dem nächsten Deployment und damit vor den Nutzern zu erfahren, werden Tests automatisiert und möglichst häufig ausgeführt, optimalerweise im Rahmen eines Continuous Integration Prozesses. Eine Testvariante sind User Interface Tests. Diese können sehr schön mit Selenium implementiert werden. Dabei wird die Interaktion mit der Anwendung im Webbrowser automatisiert, es wird quasi die Benutzung durch den Anwender simmuliert.

Tests mit Selenium können auf zwei Wegen entstehen. Die einfachste Variante ist die Verwendung der Selenium IDE. Diese bietet eine einfache Oberfläche, mit deren Hilfe die Test erstellt werden können. Möchte man alle Möglichkeiten von Selenium – auch in größeren Projekten – nutzen, wird man allerdings den Selenium Webdriver nutzen, die Programmierschnittstelle von Selenium. Es gibt Bibliotheken in verschiedenen Sprachen, so auch in Python.

Ein einfaches Beispiel (aus der Dokumentation) kann so aussehen:

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class PythonOrgSearch(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()

    def test_search_in_python_org(self):
        driver = self.driver
        driver.get("http://www.python.org")
        self.assertIn("Python", driver.title)
        elem = driver.find_element_by_name("q")
        elem.send_keys("pycon")
        elem.send_keys(Keys.RETURN)
        assert "No results found." not in driver.page_source

    def tearDown(self):
        self.driver.close()

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

Zwar finden sich im Web eine Reihe von Tutorials, für eine effiziente Einarbeitung kann ich aber das Buch Learning Selenium Testing Tools with Python von Unmesh Gundecha empfehlen. Es erläutert klar die Grundlagen und geht sehr schnell zu praktisch verwertbaren Beispielen über. Mit Grundkenntnissen in Python und diesem Buch ausgestattet kann man in kurzer Zeit umfangreiche Tests von Webapplikationen erstellen.

Es ist immer etwas schwierig, den Zeitaufwand für die Erstellung von Tests zu rechtfertigen, da kein unmittelbar erkennbarer Business Value entsteht. Führt eine gute Testabdeckung in der Praxis aber dazu, dass Fehler frühzeitig erkannt werden, ist die Investition aber sehr sinnvoll. Und nicht zuletzt nimmt eine gute Testabdeckung den Entwicklern die Angst, durch nachträgliche Änderungen an der Codebasis etwas kaputt zu machen. Das ist auch viel wert.