CI/CD and Testing in E-commerce platform implementation (Magento, Shopware)

CI/CD und Tests: eine Notwendigkeit für E-Commerce-Plattformen

Warum sind Continuous Integration (CI), Continuous Delivery (CD) und ein standardisierter Entwicklungslebenszyklus für die Entwicklung von E-Commerce-Software unerlässlich? Bei Gesprächen mit verschiedenen E-Commerce-Händlern war ich überrascht zu erfahren, wie wenige von ihnen angemessene CI/CD-Prozesse implementiert haben und mit welchen Herausforderungen sie deshalb konfrontiert sind. Dies scheint unabhängig von der jeweiligen E-Commerce-Plattform zu sein. Warum also investieren Unternehmen nicht in CI/CD? Meine Recherchen haben hauptsächlich drei Gründe ergeben:

  • Die Entwicklungsprozesse würden verlangsamt, wenn Entwickler sowohl Code als auch Tests schreiben müssten.
  • Durch zusätzlichen Code für automatisierte Tests wird das Projekt teurer.
  • Dem Team fehlt das notwendige Know-how, um ein ordnungsgemäßes CI/CD einzurichten.
  • Die Entwickler sind unsicher, wie man Tests schreibt.

Die folgenden Softwareeigenschaften, die sich direkt auf den Umsatz auswirken, sind Verfügbarkeit und Zuverlässigkeit:

Verfügbarkeit bezeichnet den Prozentsatz der Zeit, in der Ihr Online-Shop betriebsbereit und voll funktionsfähig ist.

Zuverlässigkeit und Robustheit beschreiben, wie ausfallsicher das Shopsystem ist und wie es mit Ausnahmesituationen umgeht. Dabei ist jeder Vorfall, der zu Ausfallzeiten oder kritischen Fehlfunktionen führt, gleichbedeutend mit Umsatzverlusten. Wie können also die Risiken minimiert werden?

Investitionen in einen effizienten Entwicklungsworkflow, Continuous Integration und Delivery (oder Continuous Deployment) sowie eine zuverlässige Infrastruktur sind einige der wichtigsten Schritte zur Erhöhung der Verfügbarkeit und Zuverlässigkeit.

Was ist CI/CD und wie kann es helfen?

CI/CD bezeichnet eine Reihe von Praktiken, die darauf abzielen, häufige Freigaben von Softwareänderungen (neue Funktionen, Fehlerbehebungen) zu ermöglichen, während das Risiko schwerwiegender Probleme minimiert wird.

Continuous Integration (CI) integriert alle Codeänderungen, die Entwickler in ein gemeinsames Versionskontrollrepository einbringen. Jede Änderung muss von automatischen Tests überprüft werden. CI ist nur dann effektiv, wenn Codeänderungen in kurzlebigen Branches eingecheckt und täglich in den Hauptbranch (Trunk) zusammengeführt werden. Dieser Ansatz, bekannt als Trunk-based Development, erleichtert die Integration kleinerer Codeportionen. Dadurch werden potenzielle Probleme, die durch automatische Tests entdeckt werden, einfacher zu lösen und gelangen vor allem nicht in das Produktionssystem. Darüber hinaus ist es durch das Zusammenführen kleiner Codefragmente sehr selten, dass Konflikte auftreten. Selbst wenn ein Konflikt auftritt, ist er leicht zu lösen. Diesen Workflow haben wir in unsere Shopware- und Magento-basierte Projektentwicklung integriert.

Continuous Intergration Diagramm
Eine Visualisierung von Kontinuierlicher Integration

Continuous Delivery (CD), die auf der Kontinuierlichen Integration aufbaut, automatisiert die Freigabe von Code-Änderungen in Vorproduktionsumgebungen zur Durchführung von Tests. Diese Tests können entweder automatisch oder manuell ausgeführt werden. Nach erfolgreicher Testdurchführung und mit der Zustimmung des Produktbesitzers können die Änderungen in der Produktionsumgebung implementiert werden.
Continuous Delivery erfordert eine menschliche Überwachung
Die kontinuierliche Bereitstellung tritt in Kraft, sobald die Testergebnisse manuell überprüft, eine optionale manuelle Prüfung durchgeführt und die endgültige Genehmigung erteilt wurde.

Continuous Deployment hingegen geht noch einen Schritt weiter. Sie stellt eine Praxis dar, bei der sämtliche Code-Änderungen auf automatisierte und kontinuierliche Weise in die Produktion überführt werden, ohne dass eine manuelle Intervention oder Freigabe von irgendjemandem notwendig ist. Einzig ein misslungener Test kann diesen Prozess unterbrechen. Dieser Ansatz ist zwar der effizienteste, erfordert jedoch umfassende automatisierte Tests auf mehreren Ebenen. Kontinuierliche Bereitstellungen sollten regelmäßig erfolgen und stets kleine Verbesserungen beinhalten.
Continuous Deployment ist vollständig automatisiert
Die kontinuierliche Bereitstellung ermöglicht eine vollautomatisierte Bereitstellung in der Produktion, ohne dass menschliches Zutun erforderlich ist.

CI/CD für Infrastruktur

Infrastruktur als Code (IaC) hat sich als der Standard für die Bereitstellung und Verwaltung von Infrastrukturen durchgesetzt. Tools wie Terraform oder Pulumi unterstützen die meisten Cloud-Anbieter. Der Code, welcher die Infrastruktur definiert, kann getestet werden. Solche Tests sollten integraler Bestandteil der kontinuierlichen Integration sein.

Verwaltung von Funktionen mit kurzen Release-Zyklen

Die Entwicklung auf Basis des Hauptzweiges und kurze Release-Zyklen können dazu führen, dass eine neu entwickelte Funktion noch nicht bereit ist, öffentlich zugänglich zu sein - zumindest nicht für alle Kunden. Eine praktikable Technik zur Lösung dieses Problems ist die Verwendung von Feature Flags (alternativ Feature Toggles). Sie ermöglichen das Aktivieren oder Deaktivieren von Funktionen, üblicherweise über vordefinierte Umgebungsvariablen. So können wir eine Funktion verbergen, wenn sie noch nicht für die Öffentlichkeit zugänglich sein soll. Shopware hat bereits eine Unterstützung für Feature Flags in sein Kernplattform-Framework integriert.

Feature Flags und A/B-Tests

Feature Flags sind auch nützlich für die Durchführung von A/B-Tests. Dank Feature Flags müssen Sie keine zwei Versionen der Anwendung für ein Experiment erstellen. Stattdessen aktivieren Sie das gewünschte Verhalten mit einem Feature Flag nur für eine ausgewählte Gruppe von Kunden.

Automatisiertes Testen der Implementierung von E-Commerce-Plattformen

Ein typisches Konstrukt besteht aus drei Testebenen, bekannt als die Testpyramide, und umfasst:

  • Unit-Tests
  • Integrationstests
  • End-to-End-Tests

Unit-Tests richten sich auf einzelne Komponenten oder Funktionen der Anwendung und testen sie isoliert. Unit-Tests sollten keine Verbindung zu externen Diensten wie einer Datenbank, einem Cache-Server oder einem Message Broker benötigen und sie müssen schnell sein. Das bedeutet, dass der gesamte Testsatz in Sekunden statt in Minuten abgeschlossen sein sollte. Um hochtestbaren Code zu schreiben, ist TDD (Test Driven Development) sehr vorteilhaft. Bei TDD beginnen Sie das Schreiben von Code mit dem Schreiben der Tests für diesen Code. Dies hilft tatsächlich, den Code für eine höhere Testbarkeit zu strukturieren.

Integrationstests bewerten die Interaktion zwischen mehreren Komponenten oder Diensten. Die Tests betreffen den Anwendungscode mit den integrierten Diensten, wie der Datenbank, dem Message Broker oder APIs.

End-to-End-Tests validieren die gesamte Anwendung über die Benutzeroberfläche oder API und simulieren echte Kunden oder Nutzer. Da solche Tests die langsamsten sind, sollten sie eher die geschäftskritischen Funktionen abdecken.

End-to-End-Tests müssen auch zuverlässig und reproduzierbar sein. Ein flüchtiger Test (manchmal bestanden, manchmal nicht) bringt nicht viel Wert. Für End-to-End-Tests verwenden Shopware und Magento browserbasierte Testframeworks wie Cypress, Playwright und Selenium.

Alle Arten von Tests müssen zuverlässig und reproduzierbar sein (sie dürfen weder voneinander abhängen, noch von der Reihenfolge, in der sie ausgeführt werden). Integrationstests und End-to-End-Tests benötigen vorbereitete Daten-Fixtures. Daten-Fixtures sind gefälschte Daten, die für jedes Testszenario geladen und danach bereinigt werden müssen.

Die Testpyramide

Die Testpyramide

Testen von eigenen Erweiterungen für Shopware oder Magento

Die Prüfung von Erweiterungen für eine E-Commerce-Plattform wie Shopware oder Magento erfordert zusätzlich eine Matrix aller Konfigurationen, mit denen die Erweiterung kompatibel sein soll. Hierzu zählen alle von PHP, Datenbankserver-Versionen und anderen Modulen und Plugins unterstützten Konfigurationen. Es ist ebenso wesentlich, die Abhängigkeitsanforderungen strikt in der Konfiguration des Abhängigkeitsmanagers (composer.json) zu deklarieren. Diese Maßnahme verhindert, dass eine Erweiterung in inkompatiblen Umgebungen installiert wird.

Was ist, wenn mein Projekt keine Tests hat?

Die empfohlene Praxis besteht darin, Tests parallel zum Code von Beginn an zu schreiben, selbst wenn das Projekt nur ein Proof of Concept ist. Oftmals werden sogar konzeptionelle Projekte weiterentwickelt und schließlich übernommen. Unsere Erfahrung zeigt, dass das Schreiben von Tests vom ersten Tag an dabei hilft, Widersprüche in den Projektanforderungen zu identifizieren, Fehler frühzeitig zu erkennen und eine robustere Anwendungsarchitektur zu entwickeln.

Aber was ist, wenn das Projekt bereits ausgereift ist oder von einem anderen Team übernommen wurde und es keine Tests gibt? Das Hinzufügen von Tests zu bestehendem Code ist bekanntlich schwierig, aber es ist ein wertvolles Instrument, um den Entwicklern zu helfen, zu verstehen, wie komplexe Software funktioniert und Änderungen mit Vertrauen vorzunehmen. In einem solchen Szenario ist die optimale Lösung, mit End-to-End-Tests der missionkritischen Funktionalität zu beginnen, wie beispielsweise dem kompletten Kaufprozess und der Integration mit wichtigen externen Systemen wie ERP. Gleichzeitig sollte sichergestellt werden, dass alle zukünftigen Änderungen relevante Tests enthalten. Obwohl End-to-End-Tests die langsamsten sind, hängen sie nicht vom Code ab. Daher gibt es viel Gewinn bei relativ geringen Kosten.

Code-Qualitätsstandards

Faktoren wie die Konsistenz und Lesbarkeit des Codes, Effizienz, Performance und Sicherheit beeinflussen die Gesamtqualität des Projekts. Die Integration von Tools zur statischen Code-Analyse ermöglicht die Validierung der Code-Syntax nach einmal festgelegten Regeln. Genau wie Unit-Tests sollte die statische Analyse regelmäßig vor dem Committing des Codes ins Repository durchgeführt und ein integraler Bestandteil der Continuous Integration Pipeline sein. Für PHP-basierte Projekte wie Magento oder Shopware gibt es eine Vielzahl von Open-Source-Tools, wie PHPStan, PHP_CodeSniffer, PHP Mess Detector oder Psalm.

Fazit

Lassen Sie mich eine häufig gestellte Frage von vielen Händlern aufgreifen. Verlangsamen Testautomatisierung, CI/CD und TDD ein E-Commerce-Projekt und erhöhen dessen Kosten? Die Antwort ist nein. Tatsächlich ist das Gegenteil der Fall. Durch regelmäßiges Testen während der Entwicklung erhalten die Entwickler sofortiges Feedback. Darüber hinaus erzwingt TDD gute Code-Praktiken. All dies führt zu deutlich weniger Fehlern. Ohne automatisierte Tests werden unsere Kunden letztendlich alles testen, und das wollen wir definitiv nicht.

FacebookTwitterPinterest