Automatisierte Tests – Was bringt das eigentlich?

Gerade im B2B eCommerce ist bei unseren Kunden ein Gesamtumsatzanteil der eCommerce Anwendung von > 40% üblich. Es gilt deshalb den reibungslosen Betrieb der eCommerce zu gewährleisten und abzusichern, um Umsatzausfälle zu vermeiden. Neben einer guten Hostingumgebung helfen hierbei automatisierte Tests, sogenannte Unit Tests. Automatisierte Tests sind Programme, die das Verhalten einer Anwendung automatisiert und reproduzierbar testen können.

Der Einsatz von automatisierten Tests dient der Absicherung von Projektergebnissen, vor allem nachdem die Supportphase beginnt, aber auch schon während der Entwicklung, um erreichte Ergebnisse abzusichern.

Es empfiehlt sich deshalb bei Projekten auf eine hohe Abdeckung des Funktionsumfangs durch automatisierte Tests zu achten.

Bei Unit M werden mittlerweile keine Projekte ohne automatisierte Tests mehr umgesetzt. Dies führt zu weniger komplexen Umsetzungen, einer besseren Testabdeckung und letztlich zu einer definierbaren Qualität.

Wie werden automatisierte Tests erstellt?

Zunächst ist bei automatisierten Tests zwischen Oberflächentests und Funktionstests zu unterscheiden.

Funktionstests werden eingesetzt, um z.B. Berechnungsfunktionen zu testen. Hierbei werden die Funktionen mit definierten Parameters aufgerufen und das Berechnungsergebnis mit einem Erwartungswert verglichen.

Bei Oberflächentests wird der Aufruf, z.B. bei einer Webanwendung, durch einen Browser simuliert, um das Verhalten der Webanwendung bei bestimmten Benutzerinteraktion automatisiert testen zu können. Die Infrastruktur für Oberflächentests ist etwas aufwendiger, da der, oder falls gewünscht auch mehrere spezifische Browser, in der gewünschten Version in der Testumgebung vorhanden sein müssen.

Im Folgenden stellen wir am Beispiel der eCommerce Plattform OXID eSales dar, wie solche automatisierten Tests erstellt werden.

Funktionstests (oder Unit Tests)

Funktionstests, oder auch Unit Tests genannt, dienen dazu einzelne Funktionen von Modulen, z.B. OXID Modulen, automatisiert zu testen.

Definition von Unit Tests

Automatisierte Tests - Definition von Integrationstests

Automatisierte Tests – Definition von Integrationstests

Dazu wird in einem OXID Projekt pro Modul ein Ordner “test” (siehe 1) angelegt. Des Weiteren wird für die Unit Tests ein Unterordner mit Namen „integration” angelegt (siehe 2). In diesem Ordner werden dann die Tests abgelegt. Diese Tests haben den Postfix, oder die Endung, *Test.php (siehe 3. AdminArticleMainTest.php). Durch eine Namenskonvention ist sichergestellt, dass der Bezugspunkt des Tests immer klar ist (siehe 4.) Über die Definition “extends oxUnitTestCase” wird festgelegt, das es sich um einen Test handelt (siehe 5.). Die Funktionsnamen der automatisierten Testfunktionen beginnen mit test* (siehe 6., testMyFunction).

Sofern die Voraussetzungen für automatisierte Tests korrekt geschaffen sind, ist das oben gezeigte Beispiel ausführbar.

Testergebnisse (Asserts)

Was jetzt noch fehlt sind natürlich die Bewertung der Testergebnisse, um prüfen zu können, ob eine Funktion auch tatsächlich das getan hat, was sie tun soll. Hierfür stehen sogenannte Asserts zur Verfügung, die der Testumgebung mitteilen, ob ein Test erfolgreich war, oder nicht.

AssertEquals ist eine der einfachsten Assertfunktionen. Diese Funktion prüft die Erwartung gegen das Testergebnis und sieht ungefähr so aus:

$this->assertEquals( Erwartung , Testergebnis );

Hier einige triviale Beispiele, die die Funktionalität erläutern:

$this->assertEquals( 1 , 1 ); // Ergibt TRUE
$this->assertEquals( 1, 5 ); // Ergibt FALSE

Eine vollständige Definition aller möglichen Asserts für die Programmiersprache PHP findet sich hier:

https://phpunit.de/manual/current/en/appendixes.assertions.html

Testaufruf

Über einen Kommandozeilenbefehl “runtests”, der innerhalb der Testumgebung von OXID ausgeführt wird, werden alle automatisierten Tests gestartet und die Ergebnisse jedes Tests in der Kommandozeilenumgebung angezeigt.

Oberflächentests

Definition von Selenium Tests

Oberflächentests, oder z.B. auch Seleniumtests genannt, werden ähnlich definiert, wie Unit Tests, nur, dass sie im Ordner “acceptance” anstatt “integration” abgelegt werden. Die Konfiguration ist allerdings etwas aufwändiger. Des Weiteren ist ein sogenannter Seleniumserver erforderlich. Dieser Server erzeugt den Browser und führt dort die gewünschten Befehle aus. Die Rückmeldungen stehen dann wiederum in einer der Unit Tests ähnlichen Programmierumgebung zur Verfügung. Über diese Umgebung lassen sich die Browserinteraktion programmgesteuert definieren.

Funktionsübersicht

Automatisierte Tests - Definition Acceptancetests

Automatisierte Tests – Definition Acceptancetests

Z.B. stehen folgende Funktionen hierfür zur Verfügung:

  • Mausklick simulieren: $this->click(‘html id oder dom pfad’);
  • Mausklick simulieren und auf Seitenreload warten: $this->clickAndWait(‘html id oder dom pfad’);
  • Warten auf Nachgerenderte HTML Elemente: $this->waitForItemAppear(‘html id oder dom pfad’)
  • Prüfe ob ein Element existiert: $this->assertElementPresent(‘html id oder dom pfad’);
  • Shop einloggen: $this->loginInFrontend(‘username’, ‘password’);
  • Texteingabe: $this->type(“html id oder dom pfad”, “mein text”);
  • Checkbox anklicken: this->check(“html id oder dom pfad”);
  • Prüfe auf Text: $this->assertEquals(‘Erwartung’, $this->getText(“id order dom pfad”));

Testaufruf

Der Testaufruf erfolgt über die Konsole ähnlich wie ein Integration Test, über den Befehl ./runtests-selenium innerhalb des bin Ordners der testing_libary von Oxid.

OXID Systemtests

Auch der eCommerce Systemhersteller OXID bietet für seine Produkte automatisierte Tests an, die auch den OXID Partnern und Kunden zur Verfügung stehen. Um diese Tests in die eigene Entwicklung zu integrieren empfiehlt es sich die von OXID  zur Verfügung gestellte spezielle Entwicklungsumgebung einzusetzen, die kostenfrei im Internet zur Verfügung steht. Diese Umgebung ist bereits für den Testablauf der OXID Tests vorbereitet.

Über den Kommandozeilenbefehl /var/www/oxideshop/source/vendor/bin/runtests lassen sich die automatisierten Tests von OXID einfach aufrufen.

Automatisierte Tests - Ablauf der automatisierten OXID eSales Tests

Automatisierte Tests – Ablauf der automatisierten OXID eSales Tests

Durch die Verwendung der OXID Tests ist es möglich zu prüfen, ob z.B. eigene projektspezifische Veränderungen des OXID Webshops den Standardfunktionsumfang verändert haben.

Nachdem alle Tests durchgelaufen sind, ist leicht erkennbar, ob Handlungsbedarf besteht, oder nicht.

Automatisierte Tests - Ergebnis eines automatisiertes OXID Testlaufs

Automatisierte Tests – Ergebnis eines automatisiertes OXID Testlaufs

Fazit

Der Einsatz von automatisierten Tests empfiehlt sich, um die Projektergebnisse abzusichern und Seiteneffekte, die durch Änderungen an anderen Stellen im Shop hervorgerufen werden, frühzeitig zu erkennen.

Auch „projektfremde“ Entwickler können dadurch zielsicher Support und Korrekturen durchführen.

Neu erkannte Probleme sind durch neue Tests automatisiert abgesichert. Im Laufe eines Projektes steigt so die Qualität immer weiter an.