Selenium Grid mit Docker - Continuous Testing im Continuous Delivery Umfeld

🕒 Lesedauer: 5 Minuten

Lange Testlaufzeiten, instabile Umgebungen und nicht skalierbare Tests? Viele Entwicklungsteams kämpfen mit ineffizienten Testprozessen, die ihre CI/CD-Pipeline ausbremsen und die schnelle Bereitstellung neuer Softwareversionen erschweren.

Ein zentrales Ziel von Continuous Testing ist es, Softwareänderungen schneller und zuverlässiger zu testen, um sie frühzeitig bereitzustellen. In modernen CI/CD-Pipelines (Continuous Integration/Continuous Deployment) sind skalierbare, parallele und reproduzierbare Testumgebungen entscheidend. Hier kommen Selenium Grid und Docker ins Spiel: Sie ermöglichen eine effiziente Testautomatisierung, verkürzen Testzeiten und verbessern die Stabilität Ihrer Tests.

Wir erklären Ihnen heute

▶️ Was Selenium Grid und Docker sind und welche Vorteile sie für Testautomatisierung bieten
▶️ Warum die Kombination sinnvoll ist und wie sie zur Skalierung automatisierter Tests beiträgt
▶️ Wie Sie Selenium Grid 4 mit Docker einrichten – inkl. aktueller Best Practices
▶️ Erste Schritte mit Hub und Nodes – und wie man Selenium Grid  aufsetzt
▶️ Was Docker-Compose ist und wie es das Management der Testinfrastruktur erleichtert
▶️ Eine Beispielimplementierung mit modernem RemoteWebDriver-Code für eine reibungslose Testausführung

 

Was ist Continuous Testing und Continuous Delivery?

Continuous Testing

Continuous Testing ist der Prozess der kontinuierlichen Durchführung automatisierter Tests innerhalb einer CI/CD-Pipeline (z.B. mit Jenkins), um alle Codeänderungen frühzeitig auf Qualität zu prüfen. Ziel ist es, sowohl funktionale als auch nicht-funktionale Anforderungen (z. B. Last- und Performancetests) in den Entwicklungsprozess zu integrieren und so Risiken frühzeitig zu identifizieren. Durch den Einsatz von Testautomatisierung und Infrastruktur als Code (IaC) lassen sich Testumgebungen dynamisch und reproduzierbar bereitstellen.

Continuous Delivery

Continuous Delivery (CD) ist ein DevOps Softwareentwicklungsansatz, der den Bereitstellungsprozess (Deployment und Delivery) durch eine automatisierte und kontinuierlich optimierte Pipeline verbessert. Dabei werden Techniken wie Continuous Integration (CI), automatisierte Tests und Infrastructure as Code (IaC) genutzt, um Softwareänderungen schneller und zuverlässiger in Produktionsumgebungen auszuliefern.

Eine typische CI/CD-Pipeline besteht aus folgenden Phasen:

  1. Code Commit: Entwickler pushen Änderungen in ein Versionskontrollsystem (z. B. Git).
  2. Build-Prozess: Der Quellcode wird kompiliert und in ein lauffähiges Artefakt umgewandelt.
  3. Automatisierte Tests: Unit-, Integrations- und End-to-End-Tests werden ausgeführt, um die Codequalität zu sichern.
  4. Bereitstellung: Erfolgreich getestete Builds werden in Staging- oder Produktionsumgebungen ausgerollt.

Diese Pipeline stellt sicher, dass Änderungen jederzeit sicher und effizient bereitgestellt werden können.

Image
testing-pipeline.png
Bild: Testing Pipeline [Quelle: Qytera]

Was ist Selenium bzw. Selenium Grid?

Selenium

Selenium ist ein weit verbreitetes Open-Source-Framework zur automatisierten Testung von Webanwendungen. Es ermöglicht Entwicklern und Testern, Interaktionen mit einer Webanwendung zu simulieren, Automatisierungsskripte zu implementieren und wiederholt auszuführen. Selenium unterstützt verschiedene Programmiersprachen wie Java, Python, JavaScript, C# und Ruby, was es zu einer flexiblen Lösung für Testautomatisierung macht.

Mit Selenium lassen sich nicht nur einfache Testfälle wie das Klicken von Buttons oder das Ausfüllen von Formularen automatisieren, sondern auch komplexe Szenarien wie Authentifizierung, Datenbankinteraktionen und dynamische Elemente testen.

Selenium Grid

Image
selenium-hub.png
Bild: Selenium Hub. [Quelle: Qytera]

Selenium Grid ist ein Bestandteil der Selenium Suite, der speziell für parallele Testausführungen auf mehreren Browser-Instanzen und Plattformen entwickelt wurde. Anstatt Tests nur auf einer einzelnen Maschine auszuführen, ermöglicht Selenium Grid die Verteilung der Tests auf verschiedene Maschinen oder Container, um Testzeiten zu verkürzen und Skalierbarkeit zu erreichen.

Die Architektur von Selenium Grid basiert auf dem Hub-Node-Prinzip:

  • Der Hub ist die zentrale Steuerungseinheit, an die Testanforderungen gesendet werden.
  • Die Nodes sind die eigentlichen Ausführungsumgebungen, auf denen die Tests ablaufen.

Mit der Einführung von Selenium Grid 4 wurde die Architektur weiterentwickelt. Während frühere Versionen eine separate Installation von Hub und Nodes erforderten, bietet Selenium Grid 4 nun verschiedene Betriebsmodi:

  • Standalone-Modus: Ideal für lokale Tests, alles läuft in einem einzigen Container.
  • Distributed-Modus: Separater Hub und mehrere Nodes, optimal für skalierbare Testausführungen.
  • Kubernetes-Modus: Ermöglicht eine Integration mit Kubernetes-Clustern für eine containerisierte Testinfrastruktur, mit fertigen Helm-Charts ready-to-deploy.

Selenium Grid wird häufig mit Docker kombiniert, um eine leichtgewichtige, portable und skalierbare Testinfrastruktur aufzubauen. Docker ermöglicht es, Nodes mit verschiedenen Browsern als Container bereitzustellen, ohne dass komplexe manuelle Installationen erforderlich sind.

Selenium Grid mit Containerisierung starten

Starten von Selenium Grid im Standalone-Modus

Für einfache Testumgebungen kann Selenium Grid als einzelner Container betrieben werden:

docker run -d -p 4444:4444 --name selenium-grid selenium/standalone-chrome

Nach dem Start kann die Grid-Konsole unter http://localhost:4444 aufgerufen werden, um den Status zu überprüfen.

Verteiltes Setup mit mehreren Nodes

Für größere Testumgebungen empfiehlt sich ein verteiltes Setup mit mehreren Nodes. Dazu wird ein Hub gestartet, an den sich die Nodes anschließen:

docker network create grid  # Dieser Befehl muss nur einmal ausgeführt werden, um doppelte Netzwerkerstellungen zu vermeiden. 
docker run -d -p 4442-4444:4442-4444 --network grid --name selenium-hub selenium/hub:4.15.0 
docker run -d --network grid --name chrome-node -e SE_EVENT_BUS_HOST=selenium-hub selenium/node-chrome:4.15.0
Image
docker-mobile (1).png
Bild: Docker Mobile [Quelle: Qytera]

Automatisierung mit Docker Compose

Zur einfacheren Verwaltung mehrerer Container wird docker-compose genutzt. Eine compose.yml Datei (ehemals docker-compose.yml) kann folgendermaßen aussehen:

version: "3" 
services: 
  selenium-hub: 
    image: selenium/hub:4.15.0 
    container_name: selenium-hub 
    ports: 
      - "4442:4442" 
      - "4443:4443" 
      - "4444:4444" 
  chrome: 
    image: selenium/node-chrome:4.15.0 
    depends_on: 
      - selenium-hub 
    environment: 
      - SE_EVENT_BUS_HOST=selenium-hub 
      - SE_EVENT_BUS_PUBLISH_PORT=4442 
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

Diese Konfiguration ermöglicht es, Selenium Grid mit einem einzigen Befehl zu starten:

docker-compose up -d 
# Um die Container später zu stoppen und zu entfernen: 
docker-compose down

Integration in Test-Skripte

Nach dem Start des Selenium Grid können Tests mithilfe des RemoteWebDriver ausgeführt werden:

ChromeOptions options = new ChromeOptions(); 
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444"), options); 
driver.get("https://www.example.com");

Durch diese Architektur lassen sich Tests effizient über mehrere Browser und Plattformen hinweg ausführen und skalieren.

 

Beispiel für einen Selenium-Testlauf im Grid

Hier ist ein Beispiel für einen automatisierten Test, der in Selenium Grid ausgeführt wird:

import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeOptions; 
import org.openqa.selenium.remote.RemoteWebDriver; 
import java.net.MalformedURLException; 
import java.net.URL; 
public class SeleniumGridTest { 
    public static void main(String[] args) throws MalformedURLException { 
        ChromeOptions options = new ChromeOptions(); 
        WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), options); 
        
        driver.get("https://www.selenium.dev"); 
        System.out.println("Title: " + driver.getTitle()); 
        
        driver.quit(); 
    } 
}

Dieser Test verbindet sich mit dem Selenium Grid, öffnet die Selenium-Website und gibt den Titel der Seite in der Konsole aus.

 

Fazit: Selenium Grid mit Docker

Selenium Grid in Kombination mit Containerisierung bietet eine leistungsstarke Möglichkeit, automatisierte Tests parallel auszuführen und Testzeiten erheblich zu reduzieren. Durch die Nutzung von Docker oder Kubernetes kann die Skalierbarkeit und Wartbarkeit weiter verbessert werden. Die Integration in eine CI/CD-Pipeline ermöglicht zudem eine nahtlose und kontinuierliche Qualitätssicherung für moderne Webanwendungen.

 

 

FAQ: Selenium Grid und Docker

Was ist Selenium Grid und wie funktioniert es mit Docker?

Selenium Grid ist ein Tool zur Durchführung von Tests in parallelen Umgebungen. Mit Docker kann Selenium Grid in einem Container-Setup betrieben werden, was die Verwaltung und Skalierung der Testinfrastruktur vereinfacht.

Wie starte ich ein Selenium Grid mit Docker?

Um ein Selenium Grid mit Docker zu starten, benötigen Sie Docker installiert und konfigurierte Docker-Images. Sie können dann Docker-Container für den Hub und die Nodes erstellen, um das Grid einzurichten.

Welche Rolle spielt Continuous Integration in Verbindung mit Selenium Grid?

Continuous Integration (CI) ermöglicht es Entwicklern, Änderungen in den Code häufig zu integrieren. Selenium Grid kann in CI-Pipelines integriert werden, um automatisierte Tests bei jedem Build durchzuführen und sicherzustellen, dass die Software stabil bleibt.

Ist es möglich, Selenium Grid in Kubernetes zu betreiben?

Ja, Sie können Selenium Grid in Kubernetes betreiben, indem Sie Container für den Hub und die Nodes bereitstellen. Dies bietet eine flexible und skalierbare Lösung für Testautomatisierung in einer agilen Softwareentwicklungsumgebung.

Welche Tools benötige ich für die Installation von Selenium Grid mit Docker?

Sie benötigen Docker, um die Docker-Container zu verwalten, und möglicherweise Tools wie Maven für das Build-Management und Jenkins für die CI/CD-Pipeline.

Wie kann ich die Docker-Container für Selenium Grid managen?

Sie können Docker-Befehle wie 'docker ps' verwenden, um die aktiven Container zu überwachen, und 'docker start' oder 'docker stop', um die Container zu starten oder zu stoppen. Die Verwaltung erfolgt über die Docker-CLI.

Was bedeutet Continuous Deployment in Verbindung mit Selenium Grid und Docker?

Continuous Deployment bezieht sich auf den Prozess, bei dem Änderungen sofort nach dem Bestehen der Tests in die Produktionsumgebung bereitgestellt werden. Selenium Grid kann dabei helfen, indem es schnelle, automatisierte Tests bereitstellt, um sicherzustellen, dass die Anwendung stabil bleibt. Damit werden Deployments sicherer.

 

Veröffentlicht am 17.Februar 2025

Aktualisiert am 17.Februar 2025

Matthias Eggert

DevOps Engineer

Matthias Eggert ist ein erfahrener DevOps-Engineer mit starkem Fokus auf Testautomatisierung und Qualitätssicherung. Nach vielen Jahren in der Automobilbranche, wo er sicherheitskritische Systeme wie Bremssysteme und Batteriemanagementlösungen betreute, bringt er sein Wissen nun bei Qytera ein. Sein Schwerpunkt liegt auf modernen Testing-Strategien, CI/CD-Pipelines und Cloud-Technologien. Als Jenkins- und AWS-zertifizierter Experte kombiniert er sein tiefes Verständnis für DevOps mit innovativen Testansätzen, um robuste und effiziente Softwarelösungen zu gewährleisten.

Finden Sie weitere interessante Artikel zum Thema: