Maximieren Sie Feature-Flag-Tests & QA
Um vertrauenswürdige Lösungen zu entwickeln, müssen Sie sicherstellen, dass Ihre Software funktioniert, bevor Ihre Benutzer sie ausprobieren.


Eine gängige Methode für Entwicklungsteams, um sicherzustellen, dass ihre Software wie erwartet läuft, sind automatisierte Unit-, Integrations- und End-to-End-Tests sowie eine manuelle Qualitätssicherung.
Feature Flags sind äußerst nützliche Werkzeuge, um schneller und sicherer zu arbeiten. Da Feature Flags jedoch Verzweigungserlebnisse in Ihre Codebasis einbringen, werden Sie sich fragen, wie meine automatisierte Teststrategie mit Feature Flags zusammenspielt.
Eine Strategie, die jede Kombination testet, ist nicht nachhaltig. Nehmen wir zum Beispiel an, Sie haben eine Anwendung mit 10 Funktionen und 10 entsprechenden automatisierten Tests. Wenn Sie nur 8 ein/aus Feature Flags hinzufügen, haben Sie theoretisch 2^8 = 256 mögliche zusätzliche Zustände, also fast 25 Mal so viele Tests wie zu Beginn.
Da das Testen aller möglichen Kombinationen nahezu unmöglich ist, was können Sie stattdessen tun? Sie sollten sich auf bestimmte automatisierte Tests und Techniken konzentrieren, um den größten Nutzen zu erzielen. Ich werde die verschiedenen Stufen des automatisierten Testens anhand der "Testpyramide" durchgehen, wie sie in meinem kostenlosen E-Book Ship Confidently with Progressive Delivery and Experimentieren beschrieben ist, damit Sie sehen können, wie jede Stufe Feature Flags bei der Aufrechterhaltung einer hohen Qualität unterstützt.
1. Unit-Tests - Testen Sie häufig für solide Bausteine
Erfolgsmethode: Stellen Sie sicher, dass die Bausteine Ihrer Anwendung mit vielen Unit-Tests gut getestet sind. Die kleineren Einheiten wissen oft nichts über den Zustand von Experimenten oder Funktionen. Verwenden Sie für die Einheiten, die sich dessen bewusst sind, Mocks und Stubs, um diese White-Box-Testumgebung zu kontrollieren.
Unit-Tests sind die kleinsten Teile des testbaren Codes. Es ist eine Erfolgsmethode, dass diese Einheiten so klein sind, dass sie von Experimenten oder Feature Flags nichts mitbekommen oder nicht davon betroffen sind. Wenn sich beispielsweise ein Feature Flag in zwei getrennte Codepfade aufspaltet, sollte jeder Codepfad über einen eigenen Satz unabhängiger Unit-Tests verfügen. Sie sollten diese kleinen Codeeinheiten häufig testen, um eine hohe Codeabdeckung zu gewährleisten, genau wie Sie es tun würden, wenn Sie keine Feature Flags oder Experimente in Ihrer Codebasis hätten. Wenn der Code, den Sie Unit-Tests unterziehen, Code enthalten muss, der von einem Feature Flag oder einem Experiment betroffen ist, sollten Sie sich die Techniken des Mocking und Stubbing ansehen, die im Abschnitt Integrationstests weiter unten beschrieben werden.
2. Integrationstests - Erzwingen Sie Zustände, um Code zu testen
Erfolgsmethode: Verwenden Sie Mocks und Stubs, um den Zustand von Features und Experimenten zu kontrollieren. Konzentrieren Sie sich auf einzelne Codepfade, um eine ordnungsgemäße Integration und Geschäftslogik sicherzustellen.
Bei Integrationstests kombinieren Sie Einheiten zu einer übergeordneten Geschäftslogik. Hier wirken sich Experimente und Feature Flags wahrscheinlich auf den logischen Ablauf des Codes aus, und Sie müssen eine bestimmte Variante oder einen Zustand eines Feature Flags erzwingen, um den Code zu testen.
Bei einigen Integrationstests haben Sie immer noch vollständigen Zugriff auf die Ausführungsumgebung des Codes, in der Sie die Funktionsaufrufe zu externen Systemen oder internen SDKs, die Ihre Experimente antreiben, nachbilden können, um die Ausführung bestimmter Codepfade während Ihrer Integrationstests zu erzwingen. Wenn zum Beispiel Ihr Feature Flag von einer Funktion isFeatureEnabled aus einem Feature Management SDK gespeist wird, können Sie den isFeatureEnabled SDK-Aufruf mocken, damit er in einem Integrationstest immer true zurückgibt. Dadurch wird jede Unvorhersehbarkeit beseitigt, so dass Ihre Tests deterministisch ablaufen können.
Bei anderen Integrationstests haben Sie vielleicht keinen Zugriff auf einzelne Funktionsaufrufe, aber Sie können dennoch API-Aufrufe zu externen Systemen überspielen. So können Sie beispielsweise Daten, die das Feature Flag oder die Experimentierplattform versorgen, übergehen, um ein Experiment in einem bestimmten Zustand zurückzugeben, um einen bestimmten Codepfad zu erzwingen.
Auch wenn Sie in dieser Phase des Testens den Indeterminismus von Experimenten oder Feature Flags ausblenden können, ist es dennoch die Erfolgsmethode für Ihren Code und Ihre Tests, so wenig wie möglich von Experimenten oder Feature Flags zu wissen und sich auf die Codepfade der Varianten zu konzentrieren, die wie erwartet ausgeführt werden.
3. End-to-End-Tests - konzentrieren Sie sich auf die kritischen Varianten
Erfolgsmethode: Testen Sie nicht jede mögliche Kombination von Experimenten oder Features mit End-to-End-Tests. Konzentrieren Sie sich stattdessen auf wichtige Variationen oder Tests, die sicherstellen, dass Ihre Anwendung auch dann noch funktioniert, wenn alle Funktionen ein-/ausgeschaltet sind.
End-to-End-Tests sind die teuersten Tests, die geschrieben und gepflegt werden müssen, da es sich dabei oft um Black-Box-Tests handelt, die keine gute Kontrolle über ihre laufende Umgebung bieten und Sie sich möglicherweise auf externe Systeme verlassen müssen. Vermeiden Sie es daher, sich auf End-to-End- oder vollständige Blackbox-Tests zu verlassen, um jeden Zweig eines jeden Experiments oder Feature Flags zu überprüfen. Diese kombinatorische Explosion von Ende-zu-Ende-Tests wird Ihre Produktentwicklung verlangsamen. Reservieren Sie stattdessen End-to-End-Tests für die geschäftskritischsten Pfade eines Experiments oder Feature Flags oder verwenden Sie sie, um den Zustand Ihrer Anwendung zu testen, wenn sich die meisten oder alle Feature Flags in einem bestimmten Zustand befinden. So können Sie beispielsweise einen End-to-End-Test durchführen, wenn alle Feature Flags eingeschaltet sind, und einen anderen, wenn alle Feature Flags ausgeschaltet sind. Der letztgenannte Test kann simulieren, was passieren würde, wenn das System, das Ihre Feature Flags mit Strom versorgt, ausfällt und ordnungsgemäß abgebaut werden muss.
Wenn Sie End-to-End-Tests benötigen, stellen Sie sicher, dass Sie den Zustand des Experiments oder der Feature Flags noch kontrollieren können, um Indeterminismus zu vermeiden. In einer Webanwendung können Sie zum Beispiel einen speziellen Testbenutzer, ein spezielles Test-Cookie oder einen speziellen Testabfrageparameter verwenden, um eine bestimmte Variante eines Experiments oder Feature Flags zu erzwingen. Beachten Sie bei der Implementierung dieser speziellen Überschreibungen, dass sie nur intern verwendet werden dürfen, damit Ihre Benutzer nicht die gleiche Kontrolle über ihre eigenen Funktionen oder Experimente haben.
Ein Beispiel dafür, wie Optimizely dies intern mit Cypress.io und Selenium umsetzt, finden Sie in diesem Blogbeitrag des Optimizely QA-Teams.
Revolutionize your digital strategy
4. Manuelle Überprüfung (QA) - für geschäftskritische Funktionen reservieren
Erfolgsmethode: Sparen Sie Zeit und Ressourcen, indem Sie die manuelle QA für das Testen der kritischsten Varianten reservieren. Stellen Sie sicher, dass Sie der QA Tools zur Verfügung stellen, mit denen sie den Status von Funktionen und Experimenten erzwingen kann.
Ähnlich wie bei End-to-End-Tests kann die manuelle Überprüfung verschiedener Varianten schwierig und zeitaufwändig sein, weshalb Unternehmen in der Regel nur einige wenige manuelle QA-Tests durchführen. Reservieren Sie die manuelle Überprüfung für geschäftskritische Funktionen. Und wenn Sie spezielle Parameter zur Steuerung der Zustände von Experimenten oder Feature Flags für End-to-End-Tests implementiert haben, können dieselben Parameter von einem QA-Team verwendet werden, um eine Variation zu erzwingen und ein bestimmtes Erlebnis zu verifizieren.
Lassen Sie uns wissen, was Sie denken!
Wie führen Sie automatisierte Tests mit Feature Flags durch? Schreiben Sie mir eine Nachricht in unserer Slack-Community oder finden Sie mich auf Twitter unter @asametrical.
Dies ist Teil einer Reihe von Erfolgsmethoden, die Ihrem Unternehmen helfen, Progressive Delivery und Experimentieren erfolgreich umzusetzen, um schneller und sicherer zu liefern.
Wenn Ihnen dieser Inhalt gefällt, sollten Sie sich mein kostenloses E-Book ansehen: Mit Progressive Delivery und Experimentieren zuversichtlich ausliefern. Darin finden Sie weitere Erfolgsmethoden vom Einstieg bis zur unternehmensweiten Skalierung dieser Techniken.
Und wenn Sie auf der Suche nach einer Plattform für den Einstieg sind, sollten Sie sich das kostenlose Angebot von Optimizely ansehen.