© DrHitch/Shutterstock.com
Spock, Geb und Selenium

4 Selenium im Grid parallelisieren


Die automatisierte Ausführung von Testläufen ist ein wichtiger Schritt im Softwareentwicklungsprozess, um zu gewährleisten, dass Probleme und Auffälligkeiten bei Codeänderungen schnell erkannt werden.

Nachdem wir im vorangegangenen Kapitel hauptsächlich auf die Aufzeichnungen von Tests mit Selenium Builder eingegangen sind, legen wir in diesem Kapitel den Schwerpunkt auf das Ausführen der Tests. Die bisher gezeigte Möglichkeit des Abspielens von Tests über das Selenium-Builder-Add-on im Firefox ist auf einen Browser beschränkt und muss aktiv durch den Anwender erfolgen. Für eine automatisierte Testdurchführung ist Selenium Builder deshalb eher ungeeignet. Des Weiteren sorgen Browserinkompatibilitäten immer wieder für Probleme, die nur durch Testläufe mit verschiedenen Browsern gefunden werden können.

Die Firma Sauce Labs [1], die wesentlich Selenium Builder entwickelt, bietet beispielsweise über ihre Cloud-Lösung eine entsprechende Infrastruktur an, die die Anforderungen der Automatisierung und des Cross-Browser-Testings erfüllt. Diese Lösung eignet sich aus rechtlichen Gründen für viele Projekte jedoch nicht, da die zu testenden Ressourcen über das Internet erreichbar sein müssen.

Selenium Interpreter mit Java

Mit dem Selenium Interpreter [2] steht eine freie Java-Bibliothek zur Verfügung, mit deren Hilfe aufgezeichnete Selenium-Builder-Skripte abgespielt werden können. Das Ausführen der Testsuite für die im dritten Kapitel vorgestellten Mitteilungen kann mit dem folgenden Befehl auf der Kommandozeile erfolgen:

java -jar SeInterpreter.jar createNewsSuite.json

Es wird standardmäßig nur ausgegeben, ob die Ausführung erfolgreich verlief. Für detailliertere Informationen zu den abgearbeiteten Schritten muss der Loglevel auf DEBUG umgestellt werden.

Die Bibliothek bietet aktuell die Möglichkeit zur Nutzung von Firefox sowie des Remote-Drivers zum Abspielen der Tests. Mit Webdriver als Basis lassen sich jedoch mit ein wenig Eigenarbeit einfach weitere Browser unterstützen. Hierfür muss die Klasse WebDriverFactory implementiert werden. Zur Verwendung von Chrome ist die Umsetzung wie in Listing 4.1 gezeigt denkbar einfach. Über Webdriver lässt sich ebenfalls PhantomJS [3] einbinden. PhantomJS ist ein Browser ohne Oberfläche, der auf WebKit basiert und sich damit hervorragend zur Ausführung von Tests auf Serverumgebungen eignet. Die Implementierung der WebDriverFactory erfolgt analog zu dem vorgestellten Beispiel mit Chrome.

package com.sebuilder.interpreter.webdriverfactory;

import java.util.HashMap;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class Chrome implements WebDriverFactory {
/**
* @param config Key/value pairs treated as required capabilities.
* @return A ChromeDriver.
*/
@Override
public RemoteWebDriver make(HashMap<String, String> config) {
return new ChromeDriver(DesiredCapabilities.chrome());
}
}

Listing 4.1

Mit dem Selenium-Interpreter-Parameter driver wird definiert, mit welchem Browser die Ausführung des Tests erfolgt. Listing 4.2 zeigt den Ausschnitt eines Gradle-Skripts, das Testausführungen mit mehreren Browsern ermöglicht, die nacheinander ablaufen. Hierfür werden zunächst die Abhängigkeiten zu den verschiedenen WebDriver-Implementierungen definiert. Für die beiden genannten Browserimplementierungen Chrome und PhantomJS gibt es jeweils eine eigene Gradle-Task, die mit Umgebungsvariablen den Pfad zu den Treibern festlegt. Anschließend erfolgt die Testdurchführung durch Starten des Selenium Interpreters. Die Gradle-Task runWithAllDrivers sorgt für den aufeinanderfolgenden Aufruf aller Browserimplementierungen.

...
dependencies {
compile('com.saucelabs:sebuilder-interpreter:1.0.6')
compile "org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion"
compile "org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion"
compile("com.codeborne:phantomjsdriver:1.2.1") {
transitive = false
}
}

task runWithAllDrivers {
// The drivers we want to use
def drivers = ["Firefox", "Chrome", "PhantomJs"]
dependsOn drivers.collect { driver -> "runSeInterpreterWith${driver}" }
}

task(runSeInterpreterWithPhantomJs, dependsOn: ['unzipPhantomJs', 'classes'], type: JavaExec) {
def phantomJsFilename = Os.isFamily(Os.FAMILY_WINDOWS) ? "phantomjs.exe" : "bin/phantomjs"
systemProperty "phantomjs.binary.path",
new File(unzipPhantomJs.outputs.files.singleFile, phantomJsFilename).absolutePath

main = 'com.sebuilder.interpreter.SeInterpreter'
classpath = sourceSets.main.runtimeClasspath
args "src/main/resources/createNewsSuite.json"
args "--driver=PhantomJs"
}

task(runSeInterpreterWithChrome, dependsOn: ['unzipChromeDriver', 'c...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang