Automatisierte Tests – Was bringt das eigentlich?

Automatisierte Tests – 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 perfekt erstellt und was bringt das eigentlich?

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 Parameter 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, sind automatisierte Tests und dienen dazu einzelne Funktionen von Modulen, z.B. OXID Modulen, automatisiert zu testen.

 

Definition von Unit Tests

Definition Integrationtests

Definition Integrationtests

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 auch Seleniumtests genannt, sind ebenfalls automatisierte Tests und werden ähnlich definiert, wie Unit Tests, nur, dass sie im Ordner „acceptance“ anstatt „integration“ abgelegt werden. Die Konfiguration ist allerdings etwas aufwendiger. Ebenfalls 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

Definition automatisierter Acceptancetests

Definition automatisierter Acceptancetests

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

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 Integrations-Test

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

 

Systemtests

Die meisten eCommerce Systemhersteller, wie z.B. OXID, bieten für seine Produkte automatisierte Tests an, die auch den OXID Partnern und Kunden zur Verfügung stehen. Um diese automatisierten 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.

automatisierten OXID eSales Tests

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.

Ergebnis eines automatisiertes OXID Testlaufs

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.

 

In unserem B2BTalks-Podcast „Warum automatisierte Tests im B2B eCommerce unverzichtbar sind“ können Sie die Thematik noch weiter vertiefen.