Threat Stack heißt jetzt F5 Distributed Cloud App Infrastructure Protection (AIP). Beginnen Sie noch heute damit, Distributed Cloud AIP mit Ihrem Team zu verwenden.
Threat Stack führt täglich zahlreiche Tests durch, um zu überprüfen, ob auf unserer Threat Stack Cloud Security Platform® alles wie erwartet funktioniert. Als Ergänzung zu den Unit- und Integrationstests der Softwareentwickler hat unser Test Engineering-Team Folgendes als Teil unserer automatisierten Regressionstestsuite erstellt:
Wie soll man bei fast dreihundert Abnahmetests den Überblick behalten? Die Testingenieure hier bei Threat Stack richten ihre Tests mit ThoughtWorks Gauge ein, einem kostenlosen, leichten und plattformübergreifenden Framework zur Testautomatisierung.
Ein Gauge-Test besteht aus zwei Hauptteilen:
Indem Gauge den Testplan vom Code trennt, der den Test ausführt, werden unsere Tests lesbarer und wartbarer, und Testschritte können zwischen unseren Tests gemeinsam genutzt werden.
Im weiteren Verlauf dieses Beitrags konzentrieren wir uns auf zehn der wichtigsten Funktionen, die wir an Gauge lieben:
Das Messgerät ist sehr einfach zu installieren. Gehen Sie zur Installationsseite von Gauge. Wählen Sie dort Ihr Betriebssystem, Ihre Programmiersprache und Ihre IDE aus. Daraufhin werden Ihnen individuelle Anweisungen zur Installation aller Komponenten angezeigt. MacOS-Installationen können in HomeBrew durchgeführt werden, Linux-Installationen mit APT_GET und Windows mit dem Windows Installer, wenn Sie nicht aus dem Quellcode installieren möchten.
Nachdem alles heruntergeladen wurde, kann der Language Runner für eine Programmiersprache wie Ruby installiert werden, indem Sie „gauge install ruby“
in die Befehlszeile eingeben.
Bei einem neuen Framework zur Testautomatisierung kann es schwierig sein, zu bestimmen, welche Dateien in welchen Ordnern sein müssen und wie Tests eingerichtet und gestartet werden.
Gauge umgeht diese Verwirrung, indem es ein Beispielprojekt mit einigen Tests beifügt, an denen neue Benutzer des Frameworks herumbasteln können. Nehmen wir an, Sie haben ein bestimmtes Wort wie „Gauge“, „Mingle“ oder „Snap“. Wie könnten Sie Tests entwerfen, die die Anzahl der Vokale im Wort zählen und dabei sicherstellen, dass die erwartete und die tatsächliche Anzahl übereinstimmen?
Die Beispieltests basieren auf Daten. Die Eingaben werden in einer Datentabelle mit zwei Spalten erfasst: „Wort“ und die erwartete „Vokalanzahl“.
Das Beispielprojekt kann direkt nach der Installation von der Befehlszeile mit „gauge run spec“
ausgeführt werden.
Beispielausgabe, Befehlszeile:
Der Versuch herauszufinden, was in einer Reihe automatisierter Tests tatsächlich getestet wird, kann frustrierend sein. Dies gilt insbesondere, wenn Sie zahlreiche Codeblöcke untersuchen müssen, bevor Sie den Zweck des Tests, die vom Test ausgeführten Schritte oder den Code entschlüsseln, der jeden Testschritt ausführt.
Gauge umgeht diese Verwirrung, indem es den Testplan und die Art und Weise seiner Ausführung trennt. Gauge organisiert Schritte in einer Markdown- Datei, der Textformatierungssprache, die 2004 von Josh Gruber und Aaron Swartz entwickelt wurde. Die Testschritte werden als Aufzählungspunkte in Spezifikationsdateien gespeichert, die dann von den Schrittimplementierungen ausgeführt werden können.
Spezifikationen: Bei Spezifikationen handelt es sich nicht einfach nur um die Auflistung der Spezifikationen für eine Funktion eines Produkts: Sie bieten eine Möglichkeit, sowohl den Testcode zu organisieren als auch die HTML- oder XML-Berichte einzurichten. Jedes Element in der *.spec- Datei entspricht einem Element in Markdown. Spezifikationen sind ein „Testfall auf Geschäftsebene“, der auch als Ihre Funktionsdokumentation dienen kann. Sie sind in der Wirtschaftssprache verfasst. Normalerweise beschreibt eine Spezifikation oder Spezifikation eine bestimmte Funktion der getesteten Application “, heißt es in der offiziellen Gauge-Dokumentation .
Jede Spezifikation verfügt über eine Überschrift, in der die verschiedenen Testszenarien beschrieben werden, die ausgeführt werden. Die zugehörigen Testszenarien werden in Unterüberschriften beschrieben. Diese Kopf- und Unterüberschriften werden beim Anzeigen der Protokolle berücksichtigt, um zu sehen, was erfolgreich war und was fehlgeschlagen ist, sowie im HTML-Bericht.
Schrittdefinitionen: Jeder in der Spezifikation aufgeführte Schritt entspricht entweder einem Konzept oder einer wiederverwendbaren Schrittdefinition, die die einfache Sprache der Spezifikation mit dem ausgeführten Java-, C#-, Javascript-, Python- oder Ruby-Code kombiniert.
Durch die Trennung des Tests vom Code, der den Test ausführt, können andere Tester, Unternehmensanalysten und Produktbesitzer anhand der Spezifikationsdatei deutlich erkennen, wie der Test aufgebaut ist, ohne sich in den Code einarbeiten zu müssen.
Die Spezifikationen sind so gestaltet, dass sie sehr lesbar sind.
Benötigen Sie ein Beispiel für eine Spezifikationsdatei? Hier ist die Spezifikation des Demoprojekts, das Gauge beim Initialisieren eines neuen Gauge-Projekts installiert:
# Spezifikationsüberschrift Dies ist eine ausführbare Spezifikationsdatei. Diese Datei folgt der Markdown-Syntax. Jede Überschrift in dieser Datei bezeichnet ein Szenario. Jeder Aufzählungspunkt bezeichnet einen Schritt. * Vokale in der englischen Sprache sind „aeiou“. ## Vokale zählen in einem einzelnen Wort * Das Wort „gauge“ hat „3“ Vokale. ## Vokale zählen in mehreren Wörtern Dies ist das zweite Szenario in dieser Spezifikation. Hier ist ein Schritt, der eine Tabelle erstellt. * Fast alle Wörter haben Vokale |Wort |Vokalanzahl| |------|-----------| |Gauge |3 | |Mingle|2 | |Snap |1 | |GoCD |1 |
Jeder Aufzählungspunkt in dieser Spezifikation entspricht einem Testschritt, der im Ordner „step_implementations“ aufgeführt ist.
Brauchen Sie ein weiteres Beispiel? Angenommen, Sie haben im Ordner „Specs“ einen Test namens „login.spec“ , der sich bei einer Site anmeldet:
# Anmeldetest ## Überprüfen Sie, ob gültige Benutzer sich bei der Site anmelden können * ANMELDUNG: Geben Sie den Benutzernamen ein: „info@threatstack.com“ * LOGIN: Passwort eingeben: „1234“ * ANMELDUNG: Wählen Sie [ANMELDEN]
Jeder im Ordner step_implementations abgelegte Schritt kann vom Test automatisch gefunden und ausgeführt werden.
login_spec.rb Schritt 'LOGIN: Benutzernamen eingeben: ' do | Benutzername | fill_in(EMAIL_TEXTBOX, mit: Benutzername) end
Haben Sie den Eindruck, dass Sie immer wieder die gleiche Abfolge von Schritten ausführen? Sie können diese drei Anmeldeschritte in einer Konzeptdatei unter Login.cpt platzieren.
login.cpt # Anmelden als und * LOGIN: Benutzernamen eingeben: * LOGIN: Passwort eingeben: * ANMELDUNG: Wählen Sie [ANMELDEN]
Wenn andere Tests eine Anmeldekomponente haben, können Sie statt alle drei Schritte zu kopieren und einzufügen, nur eine Zeile in den Test einfügen: Melden Sie sich als „info@threatstack.com“ und „1234“ an.
Das Erlernen eines neuen Automatisierungsframeworks kann verwirrend sein. Manchmal reicht das Lesen der Dokumentation nicht aus. Haben Sie Fragen, die durch das Lesen der ausführlichen Dokumentation von Gauge.org nicht beantwortet werden können? Die Entwickler reagieren recht schnell auf StackOverflow , Google Groups und Gitter Chat .
Test-Spezifikationen werden, wie wir bereits besprochen haben, in Markdown geschrieben. Diese in der Spezifikation aufgeführten Tests können als eigentliche Dokumentation der Funktionsweise des getesteten Softwareprodukts genutzt werden. Da die Spezifikationen in Markdown aufgelistet sind, können sie zum Erstellen leicht lesbarer HTML-Berichte verwendet werden.
Werfen wir einen Blick auf den HTML-Bericht des Demoprojekts, in dem die Anzahl der Vokale in einem Wort gezählt wird:
Wir können sehen, dass der HTML-Bericht Folgendes enthält:
Jedes gute Automatisierungsframework enthält Möglichkeiten zum Einrichten von Vorbedingungen für einen Test und eine Teardown-Methode, die nach Abschluss der Tests ausgeführt wird.
Ein Beispiel wäre eine Automatisierungssuite, die sich auf Browsertests konzentriert. Diese hätte eine Setup-Methode, die den Browser initialisiert, wenn die Testsuite gestartet wird, und eine Teardown-Methode, die den Browser schließt, wenn die Tests abgeschlossen sind.
Gauge bietet Ausführungs-Hooks , die vor und nach jeder Suite, Spezifikation, jedem Szenario oder Schritt in Ihrer Automatisierungstestsuite ausgeführt werden können.
Durch die Verwendung der Ausführungscodes entfernt Gauge die Duplizierung von Code, der vor jeder Suite, Spezifikation, jedem Szenario oder Schritt ausgeführt werden muss.
Gauge verfügt sowohl in der IDE als auch auf der Befehlszeile über das, was sie als „erstklassige Refactoring-Unterstützung“ bezeichnen. Wer beispielsweise gerne kontinuierlich den Wortlaut eines Tests ändert, damit immer klarer wird, was der Test eigentlich macht, kann Folgendes in die Befehlszeile eingeben:
$ gauge --refactor "alter Schrittname" "neuer Schrittname"
Weitere Informationen zu Befehlszeilentools für Gauge finden Sie unter manpage.gauge.org .
Tests können so eingerichtet werden, dass sie datengesteuert entworfen werden, sodass Tests, die lediglich Variationen eines Themas sind, mit einer Tabelle der zu verwendenden Testparameter gefüttert werden können.
Nehmen wir an, Sie haben eine Reihe von Webdiensten, die getestet werden müssen und einen API-Endpunkt erreichen. Anhand des Webdienstnamens, des Schemas und des Ports müssen Sie überprüfen, ob die HTTP-Antwort „ 200 OK“ lautet.
Da die einzelnen Tests einander ähneln, können die Daten in einer leicht lesbaren Tabelle formatiert werden.
webservice_test.spec
Jede einzelne Informationszeile wird in den Testschritt eingespeist und von der entsprechenden Schrittimplementierung ausgeführt, wodurch dem Autor doppelte Arbeit erspart bleibt.
Manchmal müssen Sie Daten zwischen Testschritten austauschen und sie für später speichern. Sobald Sie wie im obigen API-Test die Antwort vom Erreichen des Endpunkts erhalten haben, müssen Sie Testschritte durchführen, um sicherzustellen, dass sie in einem gültigen Format mit dem richtigen JSON-Schema vorliegt, oder um sicherzustellen, dass beim Ausführen eines negativen Tests die richtigen Fehlermeldungen aufgelistet werden.
Gauge verwendet drei Arten von DataStores: ScenarioStore, SpecStore und SuiteStore speichern Daten als Schlüssel-/Wertpaare für den Lebenszyklus des Szenarios, der Spezifikation oder der gesamten Testsuite.
Beispiel: Im Abschnitt zur Schrittimplementierung können Sie Element-IDs wie folgt hinzufügen:
// Wert hinzufügen scenario_store = DataStoreFactory.scenario_datastore; scenario_store.put("element-id", "455678"); // Wert abrufen element_id = scenario_store.get("element-id");
Wie wir eingangs erwähnt haben, benötigen Sie, wenn Sie täglich so viele Tests durchführen wie wir bei Threat Stack, ein plattformübergreifendes Framework zur Testautomatisierung, das zugleich robust und flexibel ist und über die Funktionen und Fähigkeiten verfügt, um Ihre spezifischen Testanforderungen zu erfüllen. Gleichzeitig ist es äußerst benutzerfreundlich und automatisiert, sodass Sie in einem angemessenen Zeitrahmen und mit genau dem richtigen Maß an Aufwand und Input seitens des Testers gründliche Tests durchführen können.
Bleiben Sie dran: In einem zukünftigen Beitrag werden wir uns einige der anderen Testtools ansehen, die wir bei Threat Stack verwenden, darunter Capybara.
Threat Stack heißt jetzt F5 Distributed Cloud App Infrastructure Protection (AIP). Beginnen Sie noch heute damit, Distributed Cloud AIP mit Ihrem Team zu verwenden.