Kochrezepte für Testautomatisierung (Teil 4) – Wenn das Chaos in der Küche regiert

Wir kennen die Situation sicherlich von schlecht geführten Restaurants. Am Tisch bekommen alle ihr Essen zu unterschiedlichen Zeiten, das Schnitzel ist wie eine Schuhsohle oder wir bekommen gar etwas, was wir gar nicht bestellt haben. Der Koch/die Köchin in der Küche ist völlig überfordert und kommt mit der Flut der Bestellungen und ständigen Änderungen am Rezept nicht zurecht.

Auch beim Softwaretest gibt es ähnliche Situationen. Dabei betrachten wir den Koch/die Köchin hier mal als Tester/in, der ein neues Rezept testet. Das heißt, das neue Rezept ist unser Testobjekt, welches vom Koch/Köchin, durch kochen überprüft wird. Das Testteam kommt mit der Flut an Änderungen nicht hinterher. Tests werden unnötig doppelt ausgeführt, andere werden vergessen oder übersehen. Fehler werden nicht entdeckt und können so in die Produktion gelangen. Das Chaos ist perfekt und die Qualität stimmt nicht. Doch was tun wir in so einem Fall? Den Koch/die Köchin antreiben, das Chaos automatisieren oder einfach mehr Tester/innen einsetzen? Nein! Denn was würde dann passieren?

Personal antreiben?

Da der Koch/die Köchin so schon durch das Chaos am Kollabieren ist, wird das Antreiben höchsten zu einer kurzzeitigen Verbesserung mit anschließendem K.O. führen. Damit erhalten wir also keine langfristige Optimierung der Situation.

Chaos automatisieren (Testautomatisierung einführen)?

Da wir erstmal einen Mehraufwand für die Automatisierung benötigen und in dem Chaos gar nicht klar ist, wo wir hier anfangen sollen, würde dies nur zu noch mehr Chaos und Überlastung in der Küche führen. Das ergibt somit eine noch schlechtere Qualität.

Einfach mehr Personal einsetzen?

Jeder kennt den Spruch „viele Köche verderben den Brei“. Wenn wir also einfach dem Koch/der Köchin noch weitere Hilfsköche/innen zur Seite stellen, heißt das nicht zwangsläufig damit sei alles gelöst. Hier ist nicht zu unterschätzen, dass das neue Personal erstmal eingearbeitet werden muss. Was wiederum zu Verzögerungen in den Arbeitsabläufen führen kann. Dies muss auf jeden Fall sorgfältig geplant werden, sonst führt dies zu noch mehr Chaos in der Küche.  

Also was können wir tun?

Erstmal müssen wir analysieren, wieso es Chaos in der Küche gibt und welche Ursachen zu Grunde liegen. Oft stellt sich dann heraus, dass es an Stellen klemmt, an die zuvor gar nicht gedacht wurde. Zum Beispiel, dass der Kellner/die Kellnerin die Bestellungen nur unleserlich auf einen Zettel schreibt und nicht ersichtlich ist, was für welchen Tisch bestellt wurde. Das heißt, der Koch/die Köchin (Tester/in) muss ständig nachfragen. In diesem Vergleich betrachten wir den Kellner/Kellnerin als Analyst/in und die Bestellung, die der Kellner/die Kellnerin aufnimmt, als Teil-Anforderung. So können auch im Test (in der Küche) die Probleme bereits bei den aufgenommenen Anforderungen liegen und der Tester/die Testerin muss ständig nachfragen, wie die Anforderung gemeint ist.

Genauso könnte es sein, dass der Koch/die Köchin immer erst die Zutaten zusammensucht und mit den Vorbereitungen beginnt, wenn die Bestellung bereits da ist, also der Testende die Testfälle erst dann erstellt, wenn er das fertige Produkt vorliegen hat.

Wichtig ist auch, dass die Kommunikation in der Küche stimmt. Aber nicht nur in der Küche auch mit dem Kellner/der Kellnerin, dem Gast und dem Erstellenden des Rezeptes muss die Kommunikation stimmen. Das heißt im Test, dass die Kommunikation nicht nur im Testteam stimmen muss, sondern eben auch mit dem Analyst/Analystin, dem Product-Owner und dem Entwickler/Entwicklerin.

Ein weiteres Problem könnte darin bestehen, dass der Abstand zwischen Herd und Spüle zu weit ist. Für unsere Tester/innen übersetzt heißt das, dass sein Testwerkzeug einfach zu langsam ist und zur Testfallerstellung oder Testdurchführung zu viel Zeit benötigt wird.

Als Fazit muss also der Arbeitsprozess genauer unter die Lupe genommen werden:

  • Ausgangslage
  • Kommunikation
  • Arbeitsschritte
  • Verwendete Werkzeuge
  • Dokumentation
  • etc.

Anhand der Analyse können Schwachstellen identifiziert und entsprechende Maßnahmen ergriffen werden. Kurz um, diese Analyse mit entsprechenden Maßnahmen muss ein regelmäßiger Prozess werden. Richtig: ich spreche von einer regelmäßigen Retrospektive. Wichtig ist auch, dass in solch einer Retrospektive nicht nur die Probleme identifiziert werden, sondern auch Actionitems definiert werden, die dann umgesetzt und in der nächsten Retrospektive überprüft werden. Wenn nur analysiert wird, wo die Probleme liegen und keine Maßnahmen ergriffen werden, dann ändert sich auch nichts.

Auch in Hinsicht der Testautomatisierung ist es wichtig, dass die Arbeitsprozesse optimiert sind, sonst bringt auch diese keinen Erfolg. Also ohne Öl wird das Schnitzel schwarz – ob automatisiert oder nicht.

Es gibt leider kein Patentrezept, welches in jedem Projekt funktioniert. Es gibt jedoch einige Best Practices aus denen sich jeder für sein Projekt entsprechende Anregungen zur Verbesserung holen kann. Für den ersten Einstieg in den regelmäßigen Verbesserungsprozess können Sie sich gern von uns beraten lassen und die ersten Retrospektiven mit einem/einer erfahrenen Berater/Beraterin aus unserem Hause gemeinsam durchführen.

Lesen Sie auch meine anderen Artikel zum Thema Testautomatisierung:

Kochrezepte für Testautomatisierung (Teil 1) – Suppe
KochrezepKochrezepte für Testautomatisierung (Teil 2) – Datensalat
Kochrezepte für Testautomatisierung (Teil 3) – Wie muss ein richtiges (Test-)Rezept aussehen?

Auswahl von Testautomatisierungswerkzeugen – Kriterien und Methoden

Im ersten Artikel wurden die grundsätzlichen Herausforderungen und Einflussfaktoren bei der Auswahl von Testautomatisierungswerkzeugen, als Ergebnis aus verschiedenen Interviews, vorgestellt. Es wurde aufgezeigt, dass es bereits erste Ansätze von Checklisten, aber noch keine einheitliche Methode zur Auswahl von Testautomatisierungswerkzeugen gibt. Die Aufgabe der Abschlussarbeit war es daher, einen einfachen, zielführenden Ansatz zu finden, der die Suche nach geeigneten Testautomatisierungs-werkzeugen je nach Projekteinsatz anhand eines Kriterienkatalogs unterstützt.

Grundvoraussetzung für die Entwicklung eines Kriterienkataloges ist die Beantwortung der Frage, welche Kriterien bei der Auswahl eines Werkzeugs überhaupt relevant sind. Darauf gehe ich im zweiten Teil der Blogserie ein.

Symbolbild: Junger Mann vor dem Bildschirm, zeigt mit dem Finger auf den Desktop und telefoniert

Relevanz der Auswahlkriterien

Die Frage nach geeigneten Kriterien zur Bestimmung der Qualität von Softwareprodukten und, daraus abgeleitet, von Testautomatisierungswerkzeugen wird in der Literatur ausführlich diskutiert. Die für den Kriterienkatalog ermittelten Kriterien wurden größtenteils auf der Basis von Literaturrecherchen entwickelt. Die verwendeten Literaturquellen stelle ich nachfolgend kurz vor:

Die Auflistung der Softwarequalitätsmerkmale ISO 25010 bietet eine hilfreiche Checkliste, um eine Entscheidung für oder gegen den Test jedes Kriteriums zu treffen. Vergleichbare Auflistungen von Qualitätsmerkmalen finden sich auch an anderer Stelle (Spillner/Linz 2019, S. 27). Die Autoren geben jeweils Hinweise, anhand derer für ein Projekt die Erfüllung der einzelnen Qualitätseigenschaften bestimmt werden kann. Im Bereich der Testautomatisierung finden sich Listen von Kriterien zum Beispiel in Baumgartner et al. 2021, Lemke/Röttger 2021, Knott, 2016. Diese Kriterien beziehen sich unter anderem auf die unterstützten Technologien, die Möglichkeiten der Testfallbeschreibung und Modularisierung, die Zielgruppe, die Integration in die Werkzeuglandschaft und die Kosten. Das Ziel ist hier jedoch lediglich das Identifizieren von relevanten Kriterien, nicht aber deren Bewertung. Zum anderen ergaben sich zusätzliche Kriterien aus den Experteninterviews und der Analyse der Projekte der ZDI.

Die in dieser Arbeit identifizierten Auswahlkriterien kombinieren daher Erkenntnisse und Erfahrungen aus bestehenden Schriften zu den Themen Qualität, Testautomatisierung sowie Erstellung und Prüfung von Anforderungen an Testautomatisierungswerkzeuge zu einem praktisch anwendbaren Ansatz.

Abbildung 1: Quellen des Kriterienkatalogs

Klassifizierung der Kriterien

Bei der Auswahl von Testautomatisierungswerkzeugen wurden Einflussfaktoren wie Erfahrung, Kosten oder Interessengruppen genannt. Die Kosten waren für viele der Schlüsselfaktor. Im Rahmen dieser Arbeit wurde erkannt, dass Kriterien wie Integration oder Compliance zwar je nach Rolle unterschiedlich ausgeprägt sind, aber in der Liste der Kriterien mehr oder weniger Standard sind. Und sie sind unveränderbar, unabhängig davon, welche Anwendung getestet wird. Es gibt jedoch einen kleinen Anteil von Kriterien, der je nach der zu testenden Anwendung variiert. Ein Szenario, um die Problemstellung zu veranschaulichen: In der Medizintechnikbranche wird eine neue, webbasierte Anwendung entwickelt – das Frontend mit Angular 8 und NodeJS und das Backend mit Java Microservices. Das auszuwählende Testautomatisierungswerkzeug muss primär zu den Rahmenbedingungen passen, die durch die zu testende Webanwendung vorgegeben sind. Bevor ein Automatisierungswerkzeug zum Einsatz kommen kann, müssen die Schnittstellentechnologien der Anwendung überprüft werden. In der Praxis verfügen Testautomatisierungswerkzeuge über spezifische Eigenschaften und werden daher für unterschiedliche Technologien verwendet. Einige sind eher auf Web-Tests spezialisiert, während andere mehr im Bereich der Desktop-Tests angesiedelt sind. Ob Webanwendung oder mobile Anwendung – es bestehen immer also auch bestimmte Erwartungen an das Testautomatisierungswerkzeug. Daher ist der kritischste Faktor das Testobjekt bzw. das System under Test (SuT). Es bildet die Basis, auf der die Werkzeugauswahl getroffen wird (Baumgartner et al. 2021, S. 45). Zusammenfassend lassen sich die Kriterien in zwei Arten unterteilen: in den Standard- und in den variablen Anteil.

Abbildung 2: Die zwei Arten von Kriterien

Die Standardkriterien hängen nicht von dem Testobjekt ab. In Anlehnung an die Qualitätskriterien wurden diese Kriterien in vier Kategorien gruppiert: Features, System, Benutzbarkeit und anbieterbezogene Kriterien. Im Unterschied dazu hängen die variablen Kriterien von dem zu testenden System ab. Zu den variablen Kriterien gehören beispielsweise die unterstützten Applikationstypen, Betriebssysteme, Schnittstellentechnologien, Browser und Geräte.

Strategie der Variablenauswahl

Variablenauswahl bedeutet, aus einer Anzahl von Variablen diejenigen auszuwählen, die in die Liste der Kriterien aufgenommen werden sollen. Zur Unterstützung der Auswahl variabler Kriterien wurde im Rahmen meiner Arbeit ein Zielmodell mit eine AND/OR-Zerlegung auf der Grundlage von GORE (Goal Oriented Requirements Engineering) und den Arbeiten von Lapouchnian (2005) und Liaskos et al. (2010) eingeführt. Es hatte sich als wirksam erwiesen, Alternativen oder Variabilitäten genau zu erfassen (Mylopoulos/Yu 1994, S. 159-168), um alternative Designs während des Analyseprozesses zu evaluieren (Mylopoulos et al. 2001, S. 92-96). Die Ziele und Anforderungen werden über AND/OR-Zerlegungen verknüpft. Durch die AND-Zerlegung wird ausgedrückt, dass die Erfüllung der jeweiligen notwendig ist. Bei einer OR-Verknüpfung bedeutet dies, dass ist die Erfüllung eines dieser Ziele oder Anforderungen ausreichend. Dadurch werden die ersten Erwartungen an das Werkzeug explizit formuliert und irrelevante Anforderungen vermieden.

Abbildung 3: Vereinfachtes Zielmodell für ein Beispielprojekt XY 

Vorgehensweise bei der Werkzeugauswahl

Ausgehend von den identifizierten Kriterienarten und Spillner et al. (2011) wird in dieser Arbeit eine strukturierte Vorgehensweise für die Auswahl des passenden Testautomatisierungswerkzeugs entworfen. Die neue Vorgehensweise gliedert sich in fünf Schritte:

  1. Erarbeitung der Projektanforderungen
  2. Identifikation der variablen Kriterien mit Hilfe des AND/OR-Zielmodells
  3. Gewichtung der Kategorien und Kriterien
  4. Evaluierung der verschiedenen Werkzeuglösungen
  5. Bewertung und Auswahl

Der nächste Blogartikel geht darauf ein, wie der Kriterienkatalog nach der beschriebenen Vorgehensweise aufgebaut wurde. Außerdem werden wir zeigen, wie die variablen Kriterien in den Katalog aufgenommen wurden, und die Ergebnisse der Verprobung des Kriterienkatalogs vorstellen.

Dieser Beitrag wurde fachlich unterstützt von:

Kay Grebenstein

Kay Grebenstein arbeitet als Tester und agiler QA-Coach für die ZEISS Digital Innovation, Dresden. Er hat in den letzten Jahren in Projekten unterschiedlicher fachlicher Domänen (Telekommunikation, Industrie, Versandhandel, Energie, …) Qualität gesichert und Software getestet. Seine Erfahrungen teilt er auf Konferenzen, Meetups und in Veröffentlichungen unterschiedlicher Art.

Alle Beiträge des Autors anzeigen

Video-Tutorial: So nutzen Teams das QA Navigation Board

Das QA Navigation Board versetzt Teams in die Lage, für jedes Softwareprojekt zielführend und effizient über die Aspekte der Qualitätssicherung, deren Priorität und Ausprägung in der Durchführung zu entscheiden. Zur Erläuterung seiner Funktionsweise haben wir ein kurzes Video-Tutorial erstellt.

Abbildung 1: QA Navigation Board bei der praktischen Anwendung

Funktionsweise des QA Navigation Board

Jedes Softwareprojekt zeichnet sich durch individuelle Schwerpunkte aus. Daraus ergeben sich in der Folge ebenso spezielle Qualitätsanforderungen. Für die Prüfung dieser Qualitätsanforderungen müssen daher – je nach Themenstellung – die passenden Maßnahmen festgelegt werden. Um hier nicht zu vergessen, die Methoden richtig zu gewichten und die Abfolgen sinnvoll zu planen, haben wir das QA Navigation Board entwickelt: Ein Hilfsmittel, das es Teams ermöglicht, das Testen von Softwareprojekten optimal zu organisieren. Es berücksichtigt die Fragen: Was ist zu testen, wie, in welchem Umfang, wo und wann.

Video-Tutorial

Damit die Nutzung des Boards auf Anhieb gelingt, ist eine Einführung in das Tool hilfreich. In einem ergänzenden Video-Tutorial erklären wir deshalb dessen Funktionsweise. Wie ist es aufgebaut? Welche Schritte der Testplanung erfolgen idealerweise nacheinander und warum? So gelingt der Start Schritt für Schritt bestmöglich.

Erfahrungen mit dem QA Navigation Board

Das QA Navigation Board wird bereits in zahlreichen Projekten konsequent und mit großem Erfolg eingesetzt. Teams, die mit dem Board arbeiten, bestätigen: Es nimmt alle Teammitglieder und ihre jeweiligen Kompetenzen mit. Es sorgt dafür, dass kein Aspekt der Software vergessen und richtig, dem Zweck entsprechend, gezielt qualitätsgesichert wird. Das Arbeiten mit dem QA Navigation Board sorgt so für Übersichtlichkeit, gibt eine klare Orientierung und wird gemeinsam vom gesamten Team in einem Workshop erstellt.  

Einführungsworkshop

Für Teams, die das Board in ihre Prozesse einbinden wollen, gibt es selbstverständlich nach wie vor unseren detaillierten Ablaufplan für einen Workshop zur Einführung des QA Navigation Boards. Wie es im Detail ausgefüllt wird und was sich hinter den einzelnen Punkten verbirgt, lässt sich darüber hinaus jederzeit hier nachlesen und immer wieder zur Hand nehmen.

Geht es um das Erkennen typischer QA-Problemfälle, deren Auswirkungen und Beseitigung, dient das Board als Werkzeug für die „Anamnese der QA-Strategie für agile Teams“ – Ein Vorgehensbeschreibung ist hier zu finden.

Testkostenschätzung – „Handeln wie auf dem Basar?“

Wenn sich ein externer Testdienstleister und der Kunde über den Umfang des nächsten Testprojektes abstimmen, nutzen sie eine Testkostenschätzung. Das Erstellen einer möglichst genauen und von allen Beteiligten akzeptierten Testkostenschätzung stellt aber meist eine Herausforderung dar. Dafür gibt es zwei Gründe – der Zeitpunkt der Erstellung und die festgelegten Parameter zur einzelnen Bewertung von Testszenarien bzw. Testfällen. Die meisten werden sich nun sicher die Frage stellen, wie es mit dieser Problemstellung zu genannter Überschrift gekommen ist. Diese Erkenntnis beruht auf meinen bisherigen Erfahrungen beim Erstellen von früheren Testkostenschätzungen. Dabei kam es immer wieder zu den gleichen Grundsatzdiskussionen und Anpassungen der erstellten Testkostenschätzungen. Darauf wird später noch einmal eingegangen. Zunächst werden die Grundlagen für eine Testkostenschätzung beschrieben. 

Grundlagen der Testkostenschätzung 

Für die Abrechnung von Testdurchführungen durch den Testdienstleister gegenüber dem Auftraggeber gibt es unterschiedliche Varianten. Bisher sind davon zwei in meinen Projekten, in denen ich Testkostenschätzungen erstellt habe, zum Einsatz gekommen: Zum einen über T&M-Basis (time and material), zum anderen über die Komplexität der durchzuführenden Testszenarien. 

Die erste Möglichkeit besteht darin, die Testdienstleistung anhand des Zeit-Aufwandes (Personen-Tage) abzurechnen. Dabei werden die erforderlichen Tage beziehungsweise Stunden und die benötigte Anzahl an Testern für die Testdurchführung geschätzt.  

Da sich diese Art der Testaufwandschätzung meistens auf einen vorgegebenen Zeitraum bezieht, gibt es keine Zuordnung zu bestimmten Szenarien bzw. Testfällen. Daraus ergibt sich, dass diese Schätzung im Allgemeinen durch den Auftraggeber in dem vollen Maße akzeptiert und auch beauftragt wird. 

Handschlag
Abbildung 1: Erfolgreiches Verhandeln

Die zweite Variante, auf welche sich dieser Beitrag bezieht, ist die Abrechnung auf Basis der Testszenarien und des Aufwands über ein Komplexitätsmodell. Dabei werden im ersten Schritt, anhand der durchzuführenden Testaktivitäten, die erforderlichen Testszenarien identifiziert. Im zweiten Schritt werden die zugehörigen Testfälle ermittelt und dem jeweiligen Szenario zugeteilt. Diese Szenarien bilden im besten Fall einen Geschäftsprozess ab und laufen somit über mehrere, im Unternehmen befindliche Systeme. Solch ein Prozess könnte exemplarisch über die folgenden Systeme führen: 

  • Kundenverwaltungssoftware (interne Nutzung durch Auftraggeber) 
  • Dokumentenablage (interne Nutzung durch Auftraggeber) 
  • Abrechnungssoftware (interne Nutzung durch Auftraggeber) 
  • Geräteverwaltung (interne Nutzung durch Auftraggeber) 
  • Kundenportal (externe Nutzung durch Kunden) 
  • Gerätenutzung (externe Nutzung durch Kunden) 
  • zusätzliche Prüfungen in Datenbanken 

Daraus folgt meist, dass unterschiedliche Geschäftsprozesse einen unterschiedlich hohen Aufwand bei der Testdurchführung bedingen. Neben der trivialen Betrachtung des direkten Testaufwandes muss berücksichtigt werden, dass nicht nur die reine Testdurchführung den eigentlichen Aufwand darstellt, sondern bereits die zu erfüllenden Vorbedingungen (z. B. bestimmte Datenkonstellationen) in den Aufwand mit eingerechnet werden müssen. 

Ebenso kann es zu einer höheren Testaktivität kommen, sobald weitere Unterstützung durch den Auftraggeber während der Testdurchführung benötigt wird. Denn aufgrund von Abstimmungen bzw. Verfügbarkeiten der jeweiligen Mitarbeitenden des Unternehmens verlängert sich der zeitliche Aufwand. All diese Aspekte haben einen direkten Einfluss auf den Aufwand der Testdurchführung. 

Komplexität bestimmen 

Um den Aufwand und damit auch den Preis eines Szenarios für die Testdurchführung zu ermitteln, müssen wir die Komplexität der zu erledigenden Testaufgaben bestimmen. Dazu wurden in den vergangenen Projekten unterschiedliche Herangehensweisen genutzt. 

Die erste „einfache“ Variante war die Bestimmung der Komplexität innerhalb von drei Klassen (kleines Szenario, mittleres Szenario oder großes Szenario). Aber auch dort gab es für bestimmte Szenarien mit dem Auftraggeber abgestimmte Ausnahmen, welche mit einem höheren Aufwand beziffert wurden, da zusätzliche externe Dienstleister bei der Testdurchführung beteiligt waren.  

Für eine genauere Bestimmung der Komplexitäten wurde eine ausführlichere Variante mit breiterer Komplexitätskategorie erarbeitet und eingeführt. Diese erweiterte Einteilung reicht von “1” für ein sehr kleines Szenario bis zu “9” für ein sehr aufwendiges Szenario unter Beteiligung von externen Dienstleistern. 

Abstimmung zwischen Auftraggeber und Dienstleister
Abbildung 2: Abstimmung zwischen Auftraggeber und Dienstleister

Zur Bestimmung der Kategorie für ein Szenario wurden die drei folgenden Bereiche innerhalb eines einzelnen Szenarios festgelegt: 

  • Aufwand für Testvorbereitung 
  • Aufwand für Testdurchführung 
  • Aufwand für Testspezifikation 

In diesen drei Bereichen werden jeweils eine gewisse Anzahl an Punkten vergeben, die sich am zeitlichen Aufwand orientieren. Die Summe der gesamten Punkte aus diesen drei Bereichen ergibt mit Hilfe eines Umrechnungsschlüssels die Komplexität eines Szenarios.  

Probleme bei der Testkostenschätzung 

Nachfolgend werden Probleme bei der Testkostenschätzung beschrieben bzw. Gegebenheiten, die dazu führen, dass nach erstellter Schätzung oft ein Handeln um die Kategorien der Szenarien beginnt.  

Aus Sicht des Auftraggebers ist klar, dass es in den meisten Fällen um die Kosten der Testdurchführung geht und diese möglichst geringgehalten werden sollten, ohne den Testumfang zu mindern. 

Da eine Testkostenschätzung zeitlich weit vor der eigentlichen Testdurchführung erstellt werden muss, stehen in den meisten Fällen noch keine genauen Spezifikationen zur Verfügung. Im besten Fall sind bereits erste Versionen von Fachkonzepten vorhanden. Diese verfügen jedoch oft noch nicht über die komplette Systemlandschaft, welche von der Softwareanpassung betroffen ist. Die noch fehlenden Dokumente wirken sich negativ auf die folgenden Punkte aus. 

Bei der Testkostenschätzung wird der Testaufwand eines Szenarios aufgrund der bisherigen Durchführungen ermittelt, bzw. bei neuen Themen geschätzt und entsprechend eingestuft. Da in den einzelnen Bereichen (z. B. Aufwand für Testdurchführung) eine Schätzung auf Grundlage des zeitlichen Aufwandes durchgeführt wird, kommt es immer wieder zu Diskussionen über die geschätzten Zeiten und der damit verbundenen Kategorie eines Szenarios. Der Auftraggeber ist nach dem Prüfen der Schätzung nicht selten der Meinung, dass es möglich ist, die Tests eines Szenarios in kürzerer Zeit durchzuführen. Oft setzt er diese Meinung durch und die Testkostenschätzung wird angepasst – erstes Handeln erfolgreich abgeschlossen.

Diese kleineren Abweichungen können durch erfahrene Tester, welche die beteiligten Systeme in- und auswendig kennen und somit schneller bei der Testdurchführung sind, ausgeglichen werden. Unerfahrene Tester, welche bei einem oder mehreren Systemen innerhalb des Szenarios nicht über das Expertenwissen verfügen, benötigen etwas mehr Zeit, wodurch bereits die erste Diskrepanz zwischen dem geschätzten und dem tatsächlichen Aufwand entsteht. 

Eine weitere Diskrepanz entsteht bei Änderungen an der Software über mehrere Systeme, durch die der Aufwand für das Herstellen der Testvorbedingungen steigt. Dies kann daraus folgen, dass bestimmte Datenkonstellationen nicht mehr ohne Weiteres im Vorsystem erzeugt werden können. Dies geschieht z. B. durch den Wegfall von Schreibrechten auf einer Datenbank. Da in diesem Projekt regelmäßige Softwareanpassungen (halbjährlich) durchgeführt werden, entstehen nach einer gewissen Zeit immer wieder Szenarien, welche den gleichen Geschäftsprozess abbilden. Diese bisherigen Schätzungen werden zum Vergleich herangezogen. Somit werden auch kleinere zusätzliche Aufwände, wie der Mehraufwand beim Herstellen der Testvorbedingungen, in der Kategorie gesenkt. Die Testkostenschätzung wird angepasst – zweites Handeln erfolgreich abgeschlossen

Es kann bei der Testkostenschätzung auch zu dem Punkt kommen, dass ein Szenario in der Kategorie zu gering eingestuft wurde. Dies tritt z. B. bei komplett neuen Funktionalitäten in der Software auf, für die es noch keine Erfahrungswerte gibt. Somit wird es nötig, das Szenario bei der nächsten Schätzung in der höheren Kategorie einzuordnen. Diese Erhöhung der Kategorie wird durch den Auftraggeber geprüft, welcher diesbezüglich kaum Erfahrungswerte besitzt und die vorherige Schätzung als Grundlage verwendet. Die Testkostenschätzung wird in diesem Fall nicht angepasst – drittes Handeln erfolgreich abgeschlossen

Dieses Handeln wird nicht bei jeder Kostenschätzung mit allen Szenarien durchgeführt, kommt aber bei jeder Schätzung mit einzelnen Szenarien immer wieder einmal vor.

Fazit 

Eine Testkostenschätzung auf Grundlage von zeitlichen Aufwänden sollte aus meiner Sicht nur für interne Zwecke beim Testdienstleister zur Ermittlung der Komplexität erfolgen. Denn eine zeitlich abhängige Schätzung für den Aufwand der Testvorbereitung, die Testdurchführung etc. kann nur funktionieren, wenn die einzelnen notwendigen Parameter auch messbar und von beiden Seiten festgelegt sind. Unterschiede ergeben sich bereits bei der Durchführung und Protokollierung von Testfällen durch verschiedene Tester. Der erste Tester protokolliert seine Ergebnisse genauer und mit zusätzlichen Screenshots, wohingegen der zweite Tester mittels Copy & Paste aus dem System die Ergebnisse ausreichend protokolliert. Dadurch kann bereits eine Abweichung von +/- 30 Minuten entstehen. 

Für eine Testkostenschätzung ist es notwendig, Bewertungskriterien heranzuziehen. Diese sollten aber sowohl für den Auftraggeber als auch den Testdienstleister nachvollziehbar und bewertbar sein. Darüber hinaus muss eine gewisse Vertrauensbasis untereinander gegeben sein, damit eine für beide Seiten überzeugende Schätzung erstellt und akzeptiert werden kann. Denn auch wenn manche Schätzungen von einzelnen Szenarien tiefer eingestuft werden, so gibt es wiederum auch solche, die in der Kategorie höher eingestuft sind. Dadurch kann sich die Testkostenschätzung in der Gesamtheit die Waage halten. 

Wenn man einmal eine gemeinsame Basis gefunden hat, erleichtert dies das Arbeiten an einer Testkostenschätzung ungemein. Denn wenn beide Seiten die gleiche Auffassung von dem geschätzten Aufwand vertreten, werden die nachträglichen Anpassungen – das “Handeln wie auf dem Basar” – zum Großteil minimiert. 

Verteiltes Arbeiten: Remote Mob Testing

Als weiterführenden Beitrag zum Remote Pair Testing möchte ich auf das Remote Mob Testing eingehen. In vielen Unternehmen arbeiten die Mitarbeiter an verschiedenen Standorten verteilt, auch innerhalb der Projektteams. Um nicht auf die Benefits des Mob Testings verzichten zu müssen, kann man Gebrauch von der verteilten Variante machen.

Zuallererst ist es wichtig, den Ansatz des Mob Testings zu verstehen. Hierbei handelt es sich um eine kollaborative und explorative Methode. Diese kann bspw. genutzt werden, um das Testwissen in den Teams zu verteilen oder mit dem Team gemeinsam zu automatisieren oder neue Technologien einzusetzen.

Die Rollen beim Mob Testing

Das Mob Testing besitzt vier verschiedene Rollen:

  • Der Driver ist für die Umsetzung der Testideen verantwortlich. Er befolgt die Angaben des Navigators und darf sich dabei nicht in die Testidee einmischen.
  • Der Navigator hingegen ist die Person, welche die Testidee hat und die Ansagen hierzu macht. Er erklärt dem Driver, wie und vor allem warum er die Idee umsetzen soll.
  • Die Mob Mitglieder beobachten das Geschehen und helfen dem Navigator dabei, die Ideen zu entwickeln. Ebenso können sie Fragen stellen.
  • Der Facilitator steuert die Zeit, rotiert als einzige Rolle nicht, notiert sich Anmerkungen und Auffälligkeiten und ist Moderator und Schiedsrichter. So ist er dafür verantwortlich, dass unnötige Diskussionen unterbunden und hilfreiche Konversationen gefördert werden.
Abbildung 1: Rollen beim Remote Mob Testing

Die Rollen Driver, Navigator und Mob Mitglied rotieren regelmäßig, z. B. wenn eine Testidee umgesetzt wurde oder alternativ nach einigen Minuten. Gemäß der Literatur ist für eine zeitlich indizierte Rotation eine Standardrotationszeit von 4 Minuten vorgesehen. Diese kann allerdings je nach Belieben angepasst werden. Ziel ist es, den aktuellen Navigator nicht mitten in der Testidee zu unterbrechen. Für das Remote Mob Testing gibt es ebenfalls Angaben, die besagen, dass die Remotedurchführung besser funktioniert, wenn die Zeit auf 10 Minuten angesetzt wird. Das soll zu weniger unpassenden Unterbrechungen führen.

Die Rollen beim Mob Testing

Für den Remote-Ansatz empfiehlt sich ebenfalls eine kleinere Gruppe. Eine geeignete Größe umfasst ca. vier bis sechs Personen, so dass es nicht unübersichtlich wird und die Konversation noch sinnvoll stattfinden kann. Die Dauer kann auf 1,5 Stunden angesetzt werden.

Um das Ganze sinnvoll remote durchführen zu können, sollte man sich erst einmal ein geeignetes Kommunikationstool auswählen. Gut funktionieren an dieser Stelle z. B. MS Teams oder Skype. Dabei gibt es unterschiedliche Umsetzungsmöglichkeiten für die Durchführung der Rotation und die daraus folgende Umsetzung durch den Driver.

Beispiele aus der Praxis

Im Folgenden werde ich zwei Ansätze vorstellen, die für mich gut funktioniert haben. Bereits in der Vorbereitung ist es für eine geregelte Rotation ratsam, eine Reihenfolge für den Wechsel festzulegen. Hierfür kann man die Teilnehmer durchnummerieren.

Der 1. Ansatz: Übergabe der Maussteuerung

Hierbei teilt der Facilitator seinen Bildschirm und der Driver fordert dann die Maussteuerung an. Diese wird weitergegeben, sobald ein neuer Driver an der Reihe ist. Dieser Ansatz ist gut geeignet, wenn man an einem Testobjekt arbeitet, welches für ein sinnvolles Weiterarbeiten den Zustand des letzten Drivers benötigt. Zudem ist dies auch mein persönlicher Lieblingsansatz, weil er unkompliziert und schnell funktioniert

Der 2. Ansatz: Übergabe der Bildschirmübertragung

Bei diesem Ansatz teilt jeder Driver seinen Bildschirm, sobald er an der Reihe ist. Dieses Vorgehen eignet sich jedoch nur, wenn am Testobjekt weitere Ideen durchgeführt werden können und zwar unabhängig vom zuvor durchgeführten Test. Denn der letzte Stand des vorherigen Drivers ist auf der neuen Bildschirmübertragung nicht mehr vorhanden. Eine weitere Möglichkeit für diesen Ansatz ist es, einen Zugriff auf das Objekt durch mehrere Personen einzurichten – also z. B. einen User für alle Beteiligten.

Fazit

Bereits das Mob Testing selbst lässt sich einfach anwenden und ist, wie das Pair Testing auch, eine sehr leichtgewichtige Testmethode. Genauso sind die beiden Ansätze (Änderung der Maussteuerung vs. Bildschirmübertragung), die ich in diesem Beitrag vorgestellt habe, unkompliziert und einfach in der Umsetzung. Beide Varianten haben gut funktioniert und ermöglichen das verteilte Zusammenarbeiten.

Für den häufigeren Gebrauch und bspw. das gemeinsame Entwickeln von automatisierten Tests stehen zudem einige Tools zur Verfügung. Will man aber das Testobjekt explorativ erkunden und schnell und unkompliziert verteilt Testen, eignen sich dafür die beiden vorgestellten Varianten sehr gut.

Verteiltes Arbeiten: Remote Pair Testing

Bei der ZEISS Digital Innovation wird der verteilte Ansatz schon lange gelebt. Gerade zu Corona-Zeiten ist dieser Ansatz gefragter denn je. Die gute Nachricht: Die Arbeit kann auch von zu Hause aus weiter gehen. Aber Remote-Arbeit ist nicht nur im Homeoffice möglich, sondern auch an unterschiedlichen Standorten und Büros.

Das klassische Pairing wird bereits sehr erfolgreich in der agilen Softwareentwicklung eingesetzt. Es ist eine effiziente Methode, um komplexe Aufgaben zusammen zu lösen und das bestmögliche Ergebnis durch das Wissen von zwei Personen zu erzielen. Außerdem ist es ein optimales Hilfsmittel, um Wissen zu verteilen. Durch eine ausführliche Kommunikation der Gedanken und Ideen erreichen beide Teilnehmer am Ende ein ähnliches Know-how-Level. In diesem Beitrag möchte ich daher zeigen, wie die verteilte Zusammenarbeit gelingen kann.

Vorstellung der Methode: Pair Testing

Das Pairing beinhaltet die Aufteilung des Paares in zwei Rollen. Auf der einen Seite gibt es den Driver. Dieser setzt seine Testidee um und teilt seine Gedanken dem Navigator mit. Hierbei erklärt der Driver alles, was er tut, so transparent wie möglich. Dadurch kann der Navigator die Ansätze und Schritte des Drivers nachvollziehen.

Auf der anderen Seite gibt es den Navigator. Dieser überprüft die Eingaben des Drivers und teilt ebenfalls seine Gedanken dazu mit. Dadurch können neue Lösungswege aufgezeigt werden und der Navigator kann durch Fragen seine Unklarheiten beseitigen. So lernen beide voneinander.

Damit jeder die Chance bekommt, die Anwendung zu erleben und seine Ideen umzusetzen, wechseln die Rollen regelmäßig. Der Wechsel erfolgt nach einer abgeschlossenen Testidee oder nach einigen Minuten. Dies wird auch die Rotation der Rollen genannt.

Mann am Steuer und Frau mit Karte
Abbildung 1: Driver und Navigator

Remote Arbeit: Technische Voraussetzungen

Damit beide Parteien remote miteinander arbeiten können, bedarf es einer geeigneten Konferenzsoftware, beispielsweise MS Teams oder Skype. Damit kann das Testobjekt via Screensharing geteilt werden. Für den Arbeitsprozess gibt es zwei Möglichkeiten:

  • Zum einen kann für die Rollenrotation die Maussteuerung abwechselnd eingefordert werden.
  • Alternativ kann auch zum Rollenwechsel die Bildschirmfreigabe gewechselt werden. Allerdings benötigen dann beide den Zugriff auf das Testobjekt. Ebenso kann ein Gedanke nicht direkt weitergeführt werden, da sich die Applikation nach dem Wechsel in einem anderen Zustand befindet.

Wenn man den Ansatz des Rollenwechsels nach einigen Minuten verfolgt, kann für das Stoppen der Zeit jede beliebige Stoppuhr-Funktion (bspw. Handy-Uhr) verwendet werden. Jedoch kann das zu Problemen führen, wenn man mitten in der Testidee unterbrochen wird und diese dann ggf. vom neuen Driver weiterverfolgt werden muss. Daher lohnt es sich hier, die Rotation nach abgeschlossenen Testideen durchführen zu lassen.

Pair Testing: Allgemeine Voraussetzungen

Um ein Gelingen des verteilten Arbeitens zu bewirken, gibt es noch andere Aspekte zu beachten.

Die Aufgaben für die Pair-Testing-Session sollten groß und komplex genug sein, so dass sie zu zweit gelöst werden können. Daher ist eine gute Vorbereitung der Session wichtig – hierbei sollten geeignete Aufgabenstellungen zurechtgelegt werden. Diese Inhalte können z. B. Stories sein, die getestet werden sollen.

Fokussierte Zusammenarbeit erfordert viel Konzentration. Daher ist es wichtig, abgestimmte Pausen einzulegen, um wieder Energie zu tanken. Einfache Aufgaben können auch allein schnell und effektiv gelöst werden. Daher ist es ratsam, sich Zeitfenster zu schaffen, in denen Pair-Testing-Sessions für die vorbereiteten Inhalte durchgeführt werden. Das kann dann z. B. bedeuten, dass man einen halben Tag zusammen im Paar testet und die andere Hälfte allein arbeitet.

Zusammenfassung

Pair Testing ist eine leichtgewichtige Methode, die von jedem unkompliziert eingesetzt werden kann. Mit der richtigen technischen Unterstützung ist sie auch remote einfach umzusetzen. So können wir voneinander lernen und uns bei komplizierten Aufgaben gegenseitig unterstützen, trotz weiter Entfernungen. Außerdem hilft die gemeinsame Arbeit, der Remote-Entfremdung vorzubeugen.

Einfache Anamnese der QA-Strategie für agile Teams

Mit Hilfe unseres agilen Visualisierungswerkzeugs, dem QA Navigation Board, möchten wir eine Methode vorstellen, mit der agile Entwicklungsteams typische QA-Problemfälle und deren Auswirkungen erkennen und diese beseitigen können.

Vergleichbar mit einem falschen Architekturansatz oder der Verwendung der falschen Programmiersprache kann eine falsche Test- und Qualitätssicherungsstrategie im Laufe des Projektes zu Beeinträchtigungen führen. Im besten Fall kommt es nur zu Verzögerungen oder Mehraufwand. Im schlechtesten Fall wird unzureichend getestet und es tauchen immer wieder schwerwiegende Abweichungen im Betrieb der Anwendung auf.

Einführung​

Die Probleme werden durch die agilen Entwicklungsteams bemerkt und die Auswirkungen in der Retrospektive dokumentiert, aber oft können sie wegen fehlender QA-Expertise nicht die Ursache erkennen und somit das Problem auch nicht beheben. Das Team benötigt in diesen Fällen Unterstützung durch einen agilen QA-Coach. Dieser zeichnet sich dabei zum einen durch seine Kenntnisse in der agilen Arbeitsweise aus, aber zum anderen auch durch seine Erfahrungen in der agilen Qualitätssicherung.

Der erste Schritt in der Arbeit des agilen QA-Coaches ist es, den aktuellen Stand des Testvorgehens des agilen Entwicklungsteams festzuhalten. Dazu nutzt er zum Beispiel in einem Workshop das sogenannte QA Navigation Board. Mit dem QA Navigation Board haben die Entwicklungsteams ein visuelles Hilfsmittel, mit dem sie die planerischen Aspekte der Qualitätssicherung beurteilen können. Dabei kann das QA Navigation Board innerhalb der Projektlaufzeit auch als Referenz des aktuellen Vorgehens und als Ansatz für potenzielle Verbesserung genutzt werden.

QA Navigation Board

Anti-Pattern​

Darüber hinaus ermöglicht das QA Navigation Board eine Anamnese des aktuellen Testvorgehens. Der agile QA-Coach kann durch die Visualisierung bestimmte Symptome für Anti-Pattern im Qualitätssicherungs- und Testprozess aufdecken und diese mit dem Team direkt besprechen. Als Anti-Pattern werden in der Softwareentwicklung Lösungsansätze bezeichnet, die ungünstig oder schädlich für den Erfolg eines Projektes oder einer Organisation sind.

Nachfolgend möchte ich verschiedene Anti-Pattern vorstellen. Neben den Eigenschaften zur Identifikation, stelle ich noch deren Auswirkungen dar. Im Sinne des Gegenstücks zum Anti-Pattern, dem Pattern, werden auch gute und bewährte Problemlösungsansätze vorgestellt.

Anti-Pattern – Wird schon gut gehen​

Dieses Anti-Pattern zeichnet sich durch das komplette Fehlen von Tests oder anderen Maßnahmen zur Qualitätssicherung aus. Dadurch ergeben sich schwerwiegende Konsequenzen für das Projekt und das Produkt. Das Team kann keine Qualitätsaussage über das Ergebnis seiner Arbeit treffen und besitzt damit streng genommen kein auslieferungsfähiges Produkt. Die Fehler tauchen beim Endanwender auf und sorgen damit immer wieder für Ablenkung im Entwicklungsprozess des Teams, da die sogenannten Incidents aufwendig analysiert und behoben werden müssen.

QA Navigation Board
Keine TestsAuswirkungenLösung
• Es gibt keine Tests• Keine Qualitätssausage• „Schnell weggehen“
• Getestet wird beim Anwender• QA einführen

Der Lösungsansatz ist einfach: Testen! Je eher Abweichungen gefunden werden, desto einfacher lassen sie sich beseitigen. Darüber hinaus sorgen Qualitätssicherungsmaßnahmen wie Codereviews und statische Codeanalyse als konstruktive Maßnahmen für eine Verbesserung.

Anti-Pattern – Dysfunktionaler Test​

Laut ISO 25010 gibt es acht verschiedene Qualitätskriterien für Software: Funktionalität, Effizienz, Kompatibilität, Benutzbarkeit, Zuverlässigkeit, Sicherheit, Wartbarkeit und Übertragbarkeit. Meist liegt der Schwerpunkt bei der Umsetzung neuer Software auf der Funktionalität, aber heutzutage spielen anderen Kriterien wie Sicherheit und Benutzbarkeit eine wichtige Rolle. Je höher die Priorität der anderen Qualitätskriterien ist, desto wahrscheinlicher ist es, für diese einen nicht-funktionalen Test vorzusehen.

Darum sollte die erste Frage zu Beginn eines Softwareprojektes lauten, auf welchen Qualitätskriterien der Fokus der Entwicklung und damit auch der Qualitätssicherung liegt. Um den Teams einen einfachen Einstieg in das Thema zu geben, nutzen wir den QA-Oktanten. Folgend der ISO 25010 beinhaltet der QA-Oktant die Qualitätskriterien für Softwaresysteme. Sie geben aber auch einen Hinweis auf die notwendigen Testarten, welche sich aus der gesetzten Gewichtung der unterschiedlichen funktionalen und nichtfunktionalen Kriterien ergeben.

Nur funktionale TestsAuswirkungenLösung
• Es gibt nur funktionale Tests• Keine Qualitätssausage über nicht-funktionale Kriterien• Wichtige Qualitätskriterien mit Kunden besprechen
• Es geht wie gewollt, aber …• Nicht-funktionale Testarten
• Mit dem QA-Oktanten starten

Anti-Pattern – Angriff der Dev-Krieger

Viele agile Entwicklungsteams – besonders Teams, die nur aus Entwicklern bestehen – setzen bei ihren QA-Maßnahmen nur auf entwicklungsnahe Tests. Meist kommen hier nur Unit- und Komponententests zum Einsatz. Diese lassen sich einfach im gleichen Entwicklungswerkzeug schreiben und schnell in den Entwicklungsprozess integrieren. Besonders komfortabel ist dabei die Möglichkeit, dass sich über Code Coverage Tools eine Aussage über die Abdeckung der Tests gegenüber dem Code geben lässt. Schnell tritt nämlich eine Sicherheit ein, wenn das Code Coverage Tool eine 100%-ige Testabdeckung meldet. Doch die Problematik steckt im Detail bzw. hier in der Komplexität. Für einfache Anwendungen wäre dieses Vorgehen ausreichend, aber bei komplexen Anwendungen treten Probleme auf.

Bei komplexen Anwendungen können trotz einer komfortablen Unit-Test-Abdeckung Fehler auftauchen, die sich erst durch aufwendige System- und End2End-Tests entdecken lassen. Und für diese aufwendigen Tests ist es notwendig, ein erweitertes QA-Know-how im Team zu haben. Tester oder geschulte Entwickler müssen auf höheren Teststufen der Komplexität der Anwendung entgegentreten, um hier eine passende Qualitätsaussage zu treffen.

QA Navigation Board
Angriff der DevOnlyAuswirkungLösung
• Nur entwicklungsnahe Tests• Kein End2End-Test• Tester ins Team holen
• Kein Tester im Team• Bugs treten bei komplexen Features auf• Auf höheren Teststufen testen
• 100% Codeabdeckung• Schnell

Anti-Pattern – Die Spanische Variante

Die Zeit, in der eine Funktion in den Code gebracht wurde und dann auf dem Zielsystem landet, wird immer kürzer. Damit verkürzt sich auch die Zeit für einen umfangreichen Test immer weiter. Für agile Projekte mit festen Iterationen durch Sprints ergibt sich ein weiteres Problem: Hier wird die Anzahl der zu prüfenden Funktionen mit jedem Sprint größer.

Reine klassische manuelle Tests kommen hier an ihre Grenzen. Darum sollten Tester und Entwickler gemeinsam an einer Testautomatisierungsstrategie arbeiten.

QA Navigation Board
Manual WorkAuswirkungLösung
• Es gibt nur manuelle Tests• Späte Rückmeldung bei Fehlern• QA auf alle Schultern verteilen
• Tester überfordert• Auf allen Teststufen testen
• Automatisierung einführen

Anti-Pattern – Automatisierte Regressionslücke

Das andere Extrem wäre ein Projekt ohne manuelle Tests. Dies bedeutet zwar eine hohe Integration in die CI-/CD-Prozesse und eine schnelle Rückmeldung bei auftretenden Fehlern, aber auch vermeidbare Probleme. Eine hohe Rate an Testautomatisierung ist mit einem großen Aufwand verbunden – sowohl bei der Erstellung der Tests als auch bei der Wartung. Und je höher die Komplexität der Anwendungsfälle ist und je schwieriger die verwendeten Technologien sind, desto höher ist die Wahrscheinlichkeit, dass durch Probleme während des Testdurchlaufes dieser stoppt oder aufwendige Prüfungen von Testabweichungen notwendig sind. Außerdem prüfen die meisten automatisierten Tests nur die Regression ab. Durch automatisierte Tests würden somit nie neue Fehler gefunden, sondern nur die Funktionsweise der Altfunktionen geprüft.

Darum sollte immer mit einem gesunden Augenmaß automatisiert werden und parallel durch manuelle und ggf. durch explorative Tests nach neuen Abweichungen Ausschau gehalten werden.

QA Navigation Board
100% TestautomationAuswirkungLösung
• Es gibt nur automatisierte Tests• Sehr viel Aufwand• Mit Augenmaß automatisieren
• Alle überfordert• Manuelles Testen hat seinen Sinn
• Build Stops durch Problemfälle

Anti-Pattern – Testsingularität

Tests aus unterschiedlichen Teststufen und -arten haben jeweils einen unterschiedlichen Testfokus. Damit ergeben sich auch unterschiedliche Anforderungen an die Testumgebung wie Stabilität, Testdaten, Ressourcen etc. Entwicklungsnahe Testumgebungen werden sehr oft mit neuen Versionen versorgt, um die Entwicklungsfortschritte zu prüfen. Für die höheren Teststufen oder andere Testarten benötigt man einen stabileren Versionsstand über eine längere Zeit.

Um nicht ggf. die Tests durch einen geänderten Softwarestand bzw. eine geänderte Version zu kompromittieren, sollte es für jede Testart eine Testumgebung geben.

QA Navigation Board
One Test EnvironmentAuswirkungLösung
• Es gibt nur eine Testumgebung• Kein Testfokus möglich• Mehrere Testumgebungen
• Kompromittierte Tests• Nach Teststufe oder Testfokus
• Keine produktionsnahen Tests• „Pro Testart eine Testumgebung“

Anti-Pattern – BauManuFaktur

Moderne Entwicklung lebt von einer schnellen Auslieferung und eine zeitgemäße Qualitätssicherung von der Integration der automatisierten Tests in den Build-Vorgang sowie der automatisierten Verteilung des aktuellen Softwarestandes auf die unterschiedlichen (Test-) Umgebungen. Ohne ein Build- oder CI-/CD-Werkzeug können diese Funktionen nicht bereitgestellt werden.

Sofern es in einem Projekt noch Aufgaben zur Bereitstellung eines CI-/CD-Prozesses gibt, können diese am Board als „To Dos“ markiert werden.

QA Navigation Board
No Build ToolAuswirkungLösung
• Es gibt kein Build-Werkzeug• Keine CI/CD• CI/CD einführen
• Langsame Auslieferung• Lücken am Board markieren
• Späte Testergebnisse
• Ressourcenabhängig

Anti-Pattern – Early Adopter

Neue Technologien bringen meist auch neue Werkzeuge mit sich und neue Versionen neue Funktionen. Aber die Einführung neuer Werkzeuge und das Update auf neue Versionen birgt auch ein Risiko. Auch hier ist es ratsam, mit Bedacht vorzugehen und nicht alle Teile/Werkzeuge des Projektes auf einmal zu ändern.

QA Navigation Board
Early AdopterAuswirkungLösung
• Einfach immer das neueste …• Herausforderungen in der Einarbeitung• Kein Big Bang
• Skill-Schwächen• Alte Tools kennt man
• Neue Probleme• Skill-Schwächen am Board markieren

Kochrezepte für Testautomatisierung (Teil 3) – Wie muss ein richtiges (Test-) Rezept aussehen?

In den beiden vorhergehenden Themen „Zutaten und Küchengeräte für Testomaten und wer ist der Koch“ sowie „Testomaten auf Datensalat an Stressing“ habe ich darüber berichtet, welche Voraussetzungen für die Testautomatisierung gegeben sein müssen und welche Herausforderungen bei den Testdaten gemeistert werden müssen, um erfolgreich Automatisierung einzusetzen. Doch nun stellt sich die Frage, wie denn das Rezept, also ein Testfall für die Testautomatisierung, aussehen muss.

Dazu betrachten wir erst einmal ein typisches Kochrezept. Es besteht im Wesentlichen aus zwei Abschnitten, der Aufzählung der Zutaten (Testdaten) und der Beschreibung, in welcher Reihenfolge die Zutaten verarbeitet werden müssen. Die Beschreibung enthält dann sowohl die Schritte, die zur Zubereitung des Rezepts notwendig sind als auch die Erwähnung der Zutaten aus der Zutatenaufzählung. Nun haben auch Kochrezepte eine unterschiedliche Detailtiefe, je nachdem für wen die Rezepte bestimmt sind. Für den gelernten Chefkoch sind die Rezepte oft weniger detailliert, da der Koch bereits gewisse Arbeitsabläufe kennt und diese nicht näher beschrieben werden müssen. Rezepte für den Privathaushalt oder gar für einen Kochanfänger müssen da schon anders aussehen. So ist das auch bei den Testfällen. Für den Tester mit entsprechendem Domainwissen über die Fachlichkeit seiner Anwendung können die Testfälle weniger detailliert ausfallen. Wie ist das aber für einen Automaten? Dazu vergleichen wir hier einen Bäcker mit einem Brotbackautomaten. Für den Bäcker reicht das Rezept: Backe mir ein Roggenbrot. Für den Backautomaten ist eine genaue Rezeptbeschreibung notwendig – die Reihenfolge, wie die Zutaten in den Automaten gefüllt, welches Programm und welche Temperatureingestellt werden müssen usw.

Da wir in der Qualitätssicherung nicht nur ein Rezept bzw. einen Testfall haben, möchten wir uns jedoch die Arbeit etwas vereinfachen. So wie in der Großküche werden auch wir Vorbereitungen treffen, die uns später die Arbeit erleichtern. Während in der Küche z.B. die Salatbeilage für mehrere Gerichte verwendet wird, werden auch in der Testfallerstellung wiederverwendbare Testfallblöcke erstellt. Dazu werden mehrere Testschritte zusammengefasst und als Testschrittblock zur Wiederverwendung gespeichert. Dieses Verfahren kann sowohl beim manuellen Testen als auch in der Testautomatisierung angewendet werden. Der Unterschied liegt hier jedoch wieder in der Detailtiefe, d.h. dort, wo für das manuelle Testen ggf. eine geringe Detailtiefe ausreichend ist, wird für den Automaten immer die maximale Detailtiefe benötigt.

Teig wird per Hand geknetet, Backzutaten und Backutensilien liegen daneben
Abbildung 2: Brot backen

vs.

Ausschnitt von Code für Testfallerstellung
Abbildung 3: Testfallerstellung

Der Testautomat ist ja so gesehen eigentlich der schlechteste Koch der Welt. Er würde auch das Wasser anbrennen lassen, wenn wir ihm nicht sagen würden, dass der Topf vom Herd muss, wenn das Wasser blubbert. Aber warum benutzen wir dann überhaupt Testautomatisierung? Nun, der Testautomat hat einige wesentliche Vorteile: Ein Koch kann auch mal eine Zutat vergessen oder bei der Abarbeitung des Rezeptes variieren. Das Ergebnis ist dann nicht jedes Mal das gleiche Gericht. Der Automat vergisst hier nichts und hält sich immer an die vorgegebene Reihenfolge des Rezepts. Doch der größte Vorteil des Testautomaten ist die Geschwindigkeit, mit der er die Testfälle durchführen kann. Der Koch benötigt außerdem auch mal eine Pause. Würden wir uns so einen Automaten in der Küche vorstellen, bekämen wir sinnbildlich eine Gulaschkanone, die im Sekundentakt alle möglichen Rezepte abarbeitet und dessen Ergebnis auf den Teller schießt.

Das klingt für die Testautomatisierung sehr verlockend, dabei müssen jedoch immer wieder der Aufwand und der Nutzen ins Verhältnis gesetzt werden. Der Aufwand, so einen Automaten mit den perfekt designten Testfällen (Rezepten) zu füttern, wird oft unterschätzt: Wenn ich nur einmal im Jahr eine Geburtstagsfeier mit zehn Gästen habe, lohnt sich ein Kochautomat sicher nicht. Habe ich dagegen ein Eventunternehmen, welches jeden Tag eine ganze Hochzeitsgesellschaft à la Carte versorgen muss, ist so ein Automat definitiv eine Überlegung wert.

Remote-Entfremdung – Es geht auch ohne!

Mit Blick auf die Digitalisierung und die damit einhergehende Integration von IT- und Softwarekomponenten steigt in einer speziellen IT-Disziplin der Bedarf nicht nur linear, sondern eher exponentiell an – in der Qualitätssicherung! Knappe Büroflächen, eine zunehmend schwierige Recruitingsituation und das wenig innovative Image der Qualitätssicherung verstärken das Problem deutlich.

Der Einsatz von externen QA-Consultants scheint auf den ersten Blick die Lösung zu sein, bringt aber auf den zweiten Blick auch einige Hürden mit sich:

  • Durch neue Gesetzgebungen (Arbeitnehmerüberlassungsgesetz) ergeben sich arbeitsrechtliche Folgen bei dem Einsatz eines oder mehrerer Testexperten; durch die angesprochene Nähe zum Kunden und die Integration in die Testprozesse des Kunden kommt es zu einer Arbeitnehmerüberlassung und den sich daraus ergebenden organisatorischen Folgen
  • Soll das Testteam beim Kunden direkt zum Einsatz kommen, ist es darüber hinaus notwendig, Räumlichkeiten und die entsprechende Technik für alle Beteiligten zur Verfügung zu stellen
  • Für ein externes Testteam muss das notwendige Budget bereitgestellt werden – durch die Vor-Ort-Tätigkeit des externen Testteams bzw. der externen Testexperten erhöht sich das Budget
  • Durch die aktuelle Situation am Arbeitsmarkt wird es immer schwieriger, Mitarbeiter für interne Stellen als auch beim externen Dienstleister zu finden, die ihren Lebensmittelpunkt an den Projektstandort verlegen bzw. reisebereit sind

Als Lösung bietet sich hier ein externes Testcenter an, das die notwendigen Tests aus der Ferne bzw. Remote betreut. Folgende Vorteile eines Remote-Einsatzes ergeben sich für den Kunden:

  • Geringere Kosten für den Testservice, da die Reise- und Unterbringungskosten wegfallen
  • Höhere Skalierbarkeit des Testpersonals, da der Dienstleister seine Auslastung an einem Standort optimieren und damit dem Kunden eine höhere Planungssicherheit bei der Bereitstellung der Ressourcen garantieren kann
  • Es sind durch die Konzentration auf die Standorte mehr Know-how-Träger und Experten für Sondereinsätze verfügbar
  • Durch die Zentralisierung bleiben die Testteams stabil, was eine Fluktuation des erworbenen Domainwissens vermindert
Abbildung 1: Zusammenarbeit an verschiedenen Standorten

Darüber hinaus ergibt sich für den Dienstleister die Möglichkeit, das Testcenter an einem lieferstarken und lieferstabilen Standort zu eröffnen. Damit kann er die passenden Mitarbeiter finden und länger an sich binden.

Durch den Einsatz eines abgesetzten Testteams/Testcenters bzw. durch die räumliche Trennung zum Kunden taucht aber ein neues Problem auf, die sogenannte Remote-Entfremdung. Diese drückt sich durch folgende Symptome aus:

  • Geschwindigkeitsnachteil aufgrund von technischen und kommunikativen Hürden
  • „Mangelhafte“ Abstimmungen führen zu abweichenden Testergebnissen (von Kundenerwartung)
  • Durch mangelnde Transparenz entsteht beim Kunden ein Vertrauensverlust in die Testergebnisse
  • Durch die räumliche Trennung besteht für die Tester eine begrenzte Möglichkeit, das Domainwissen des Kunden aufzunehmen, was trotz guter Testexpertise zu falschen Testvorgehen führen kann

Um der Remote-Entfremdung entgegenzuwirken, haben wir ein Ansatz entwickelt, welcher die Vorteile eines abgesetzten Testcenters oder verteilten Testteams aufweist, aber dabei versucht, deren Nachteile so klein wie möglich zu halten.

Der Ansatz besteht aus der Optimierung unseres kundenorientierten Testvorgehens für den abgesetzten bzw. verteilten Testeinsatz und der Verwendung von ETEO, unserem bereits in Softwareentwicklungsprojekten etablierten Arbeitskonzept für verteilte Teams. Dabei werden sowohl beim Kunden ein kleines Vor-Ort-Büro als auch Arbeitsplätze an unseren Standorten (Remote-Büro) eingerichtet.

Das Vorgehensmodell unseres kundenorientierten Testvorgehens besteht aus drei Phasen: der Planung, der Transition und der eigentlichen Servicebetreuung. In der Planung werden die Machbarkeit geprüft und die vertraglichen Dinge geregelt. 

Vorgehensmodell gegen Remote-Entfremdung
Abbildung 2: Vorgehensmodell gegen Remote-Entfremdung

Der Schwerpunkt liegt sowohl in einem Projekt mit Kundennähe als auch in einem abgesetzten Vorgehen auf der Transition.

Im ersten Schritt werden unsere IT-Experten und die des Kunden eingebunden. Sie identifizieren gemeinsam die technischen Rahmenbedingungen wie Remote-, Systemzugänge sowie Berechtigungen und verbinden außerdem das „Vor-Ort-Büro“ mit dem „Remote-Büro“.

Parallel dazu stimmen sich die Testverantwortlichen des Kunden mit unserer Test-Taskforce (unserem Testmanager und Testanalysten) ab. Zu den Aufgaben gehört es dabei, das Domainwissen und die Organisation des Kunden kennenzulernen, den Aufbau des Remoteteams zu organisieren (TM) und das „Vor-Ort-Büro“ sowie das „Remote-Büro“ einzurichten.

Grundlegend arbeiten die Tester Remote von ihrem heimatlichen Standort aus, aber im Rahmen der Transition findet eine mindestens sechswöchige Einarbeitung vor Ort beim Kunden statt. Dies ermöglicht zum einen den Testern das intensive Kennenlernen des Kunden und seiner Prozesse und zum anderen aber auch dem Kunden, sich mit dem Testteam bekannt zu machen. Grundlage der Einarbeitung ist ein expliziter Einarbeitungsplan, welcher durch den Testmanager erstellt und durch den Kunden reviewed wurde.

Während der eigentlichen Servicebetreuung kommen weitere Werkzeuge zum Einsatz, um der Remote-Entfremdung entgegenzuwirken. Das erste Werkzeug ist die Test-Taskforce, welche aus unserem Testmanager und den Testanalysten besteht. Diese halten sich trotz Remote-Schwerpunkt des Projekts einen signifikanten Teil beim Kunden auf. Dabei finden verschiedene Szenarien Anwendung: Der Testmanager ist mindestens zwei Tage vor Ort beim Kunden und die restliche Zeit beaufsichtigt er das Team. In Spitzenzeiten bzw. zu wichtigen Anlässen verweilt der Testmanager länger beim Kunden vor Ort. Für die Testanalysten wäre ein ähnliches Set denkbar. Es besteht aber auch die Möglichkeit, dass die Testanalysten sich wechselseitig vor Ort beim Kunden und im Remote-Büro (z. B. im Wochenwechsel) abwechseln. Die Testanalysten benötigen weitestgehend gleiches Know-how (Domainwissen), um sich im Ernstfall auch vertreten zu können. Durch den Besuch im Remote-Büro erfolgt automatisch die Wissensvermittlung durch die Testanalysten an die Tester. Auch für die Testanalysten gilt, dass sie in Spitzenzeiten länger bzw. sogar zeitgleich vor Ort beim Kunden sein können. Durch dieses Konzept lassen sich die Reisekosten um 25 % einsparen.

Ein zweiter Aspekt zur Reduktion der Remote-Entfremdung ist die Nutzung von ETEO. ETEO – Ein Team Ein Office ist unser innovatives Konzept für die verteilte Zusammenarbeit und eine moderne Form der Zusammenarbeit, bei der alle Beteiligten von verschiedenen Standorten aus gemeinsam an einem Szenario arbeiten können. 

Entwicklerteams an zwei Standorten
Abbildung 3: Verteilte Zusammenarbeit an zwei verschiedenen Standorten

Durch den gezielten Einsatz von Technik, Methoden und dafür ausgebildetem Personal ist ein Vorgehensmodell entstanden, das Reisekosten auf ein Minimum reduziert und die Transparenz über alle Zyklen des Testprojekts als oberste Priorität versteht.

Verteiltes Daily
Abbildung 4: Verteiltes Daily

Teil des ETEO-Konzeptes ist ein kurzes verteiltes Daily, das sogenannte „test thing“.

Ziel der täglichen Abstimmung ist der Bericht des Status, die Benennung von Behinderungen und die Planung des Tages. Durch die Technik des ETEO-Konzepts können alle Beteiligten vor Ort und im Remote-Büro teilnehmen. Zur Abstimmung der Tagesplanung kommt ein elektronisches Aufgabenboard (eteoBoard) zum Einsatz.

An den Remote-Standorten findet ein zyklischer Wissenstransfer (bspw. alle 14 Tage) für alle Teammitglieder statt. Diese Termine dienen neben dem Wissensaustausch und Wissensaufbau auch der Durchführung von Retrospektiven, um ggf. Probleme zu dokumentieren und den Testprozess zu verbessern.

Verteilte Zusammenarbeit - test thing
Abbildung 5: Test thing

Darüber hinaus kommen noch weitere Werkzeuge zum Einsatz. Mit regelmäßigen Statusreports durch den Testmanager wird eine Transparenz für den Kunden, aber auch für das gesamte Team erreicht. Erweitert wird diese Transparenz durch den Aufbau eines Dashboards, was basierend auf dem verwendeten Testmanagementwerkzeug für alle Beteiligten wichtige, mit dem Kunden abgestimmte, Kennzahlen darstellt.

In nahezu allen Branchen entlang der IT-Herausforderungen, aber besonders in der QA, ist das notwendige Skalieren zum Hauptproblem Nummer 1 erwachsen. Selbst die Verstärkung durch externe Kräfte ist zum einen nicht immer möglich und/oder bringt zum anderen neue Herausforderungen mit sich. Eine Lösung sind eingespielte Teams, um hochqualifizierte Qualitätsbeurteilungen Ihrer Software zu kontinuierlichen Services erwachsen zu lassen.

Mit dem beschriebenen Ansatz kann man in den Ressourcenpool der skalierfähigen Standorte zugreifen, wie z.B. Leipzig, Dresden oder Miskolc und dabei durch die passenden Werkzeuge und Vorgehensweisen der Remote-Entfremdung entkommen.

Protractor – Automatisiert Testen mit Angular

Kritische Fehler, die erst im Rahmen des Live-Betriebes öffentlich werden, stellen ein großes finanzielles Risiko und nicht zuletzt eine negative Werbung für ein Produkt und die beteiligten Unternehmen dar. Deshalb ist das Thema Test in der modernen Softwareentwicklung ein grundlegender und integraler Bestandteil. Durch eine hohe Testabdeckung und der zeitnahen Rückmeldung der Testergebnisse lässt sich die Qualität und Reife des Produktes ausreichend genau nachweisen und bestätigen.

Eine Lösung, die eine schnelle Durchführung dieser Tests ermöglicht und den Anforderungen moderner Entwicklungsprojekte entspricht, ist der Einsatz von Testautomatisierungswerkzeugen. Diese Werkzeuge arbeiten nach dem Prinzip der toolgesteuerten Aufnahme von Informationen über die grafische Oberfläche des Testobjekts und der damit möglichen automatisierten Durchführung von skriptgebundenen Interaktionen sowie der daraus resultierenden Prüfung der jeweiligen Applikation.

Testautomatisierungswerkzeuge sorgen für eine schnelle und kontinuierliche Rückmeldung über den Stand der Qualität der zu testenden Software. Aber bei ihrem Einsatz müssen einige Punkte beachtet werden. Es gibt verschiedene Werkzeuge auf dem Markt die unterschiedliche Ansätze wählen, wie sie sich in den Entwicklungs- und Testprozess integrieren oder welche Technologien sie unterstützen. Der effektive Einsatz einer Testautomatisierungslösung steht und fällt mit der verwendeten Engine, die zur Ansteuerung der grafischen Oberfläche genutzt wird. Diese muss die zu testende Technologie optimal unterstützen. Besonders Entwicklungsprojekte, die “neue” Technologien wie Angular2 einsetzen, haben die Herausforderung, dass die vorhandenen und bekannten Werkzeuge nicht immer auf dem gleichen Stand sind wie ihr Arbeitsgegenstand.

Projekt CLINTR und Tests mit Protractor

In unserem aktuellen Softwareentwicklungsprojekt Clintr nutzen wir Angular2 als Entwicklungsframework und wollten von Beginn an eine hohe Dichte von automatisierten Testfällen. Clintr ist eine Web-Anwendung, die Dienstleister auf potenzielle Kunden in ihrem Kontaktnetzwerk aufmerksam macht. Dazu werden Daten der angebotenen XING-API verwendet und analysiert, um nach bestimmten Kriterien vollautomatisiert einen Dienstleistungsbedarf bei Firmen abzuleiten. Wurde ein Dienstleistungsbedarf einer Firma identifiziert, sucht Clintr im Kontaktnetzwerk (z.B. XING oder CRM-Systeme) des Dienstleisters nach Kontaktpfaden zum potenziellen Kunden. Im Backend kommen Spring Boot basierte Microservices mit Kubernetes als Container Cluster Manager zum Einsatz, während im Frontend Angular (>2) eingesetzt wird. Um hochfrequent neue Versionen der Anwendung veröffentlichen zu können, wurde eine Continuous Delivery Pipeline in die Google-Cloud etabliert und das für Test- bzw. Produktionsumgebung.

Wir haben uns durch den Einsatz von Angular2 für das Automatisierungs-Testwerkzeug Protractor entschieden. Protractor baut auf Selenium und dem WebDriver Framework auf. Wie gewohnt laufen die Oberflächentests im Browser ab und simulieren das Verhalten eines Nutzers, der die Anwendung verwendet. Da Protractor direkt für Angular geschrieben wurde, kann es auf alle Angular-Elemente ohne Einschränkungen zugreifen. Darüber hinaus werden keine zusätzlichen Anweisungen für das Warten auf Komponenten wie “sleeps“ oder “waits“ benötigt, da Protractor selbst erkennt, in welchem Status die Komponenten sich befinden bzw. ob sie für die anstehende Interaktion zur Verfügung stehen.

How To

Für die Inbetriebnahme benötigt man AngularCLI und NodeJS. Danach können im Projekt die Oberflächentests (end-to-end oder e2e) erstellt werden. Zur Vorbereitung der lokalen Testausführung wechselt man mit der Konsole in das Projekt-Verzeichnis und gibt “ng serve” ein. Nach der Eingabe von “ng e2e” werden die Testfälle dann auf dem localhost ausgeführt.

Die end-to-end Tests bestehen aus Type Script Dateien mit der Endung .e2e-spec.ts, .po.ts oder nur .ts. In den Dateien, die mit .e2e-spec.ts enden, werden die Testfälle beschrieben. Nur Tests die in diesen Dateien stehen werden ausgeführt. In dem folgenden Beispiel sieht man den Kopf einer .e2e-spec.ts-Datei:

    import { browser, by, ElementFinder } from 'protractor';
    import { ResultPage } from './result-list.po';
    import { CommonTabActions } from './common-tab-actions';
    import { SearchPage } from './search.po';
    import { AppPage } from './app.po';
    import { CardPageObject } from './card.po';
    import * as webdriver from 'selenium-webdriver';
    import ModulePromise = webdriver.promise;
    import Promise = webdriver.promise.Promise;
     
    describe('Result list', function () {
     
     let app: AppPage;
     let result: ResultPage;
     let common: CommonTabActions;
     let search: SearchPage;
     
     beforeEach(() => {
     app = new AppPage();
     result = new ResultPage();
     common = new CommonTabActions();
     search = new SearchPage();
     result.navigateTo();
     });

Diese wird wie auch die anderen Dateitypen mit den Importen eröffnet. Darauf folgt der Beginn der Testfälle mit describe. In dem String in der Klammer wird angeben, welcher Bereich getestet werden soll. Darunter werden die einzelnen .po.ts Dateien angelegt und instanziiert, die für die darauffolgenden Tests benötigt werden. Durch die beforeEach Anweisung lassen sich Vorbedingungen für den Test definieren. Zum Zweck der Wiederverwendbarkeit lassen sich die Tests auch in Module auslagern (siehe nachfolgendes Code-Beispiel):

    it('should display the correct background-image when accessing the page', require('./background'));
    it('should send me to the impressum page', require('./impressum'));
    it('should send me to the privacy-policy page', require('./privacy-policy'));
     
    it('should open the search page after clicking clintr logo', require('./logo'));

Im nachfolgenden Code sind normale e2e Tests aufgeführt. Dort steht zuerst, was erwartet wird und danach die Ausführung des Tests. Hierbei sollte man sich merken, dass die e2e Tests in der .e2e-spec.ts nur die Methoden der .po.ts aufruft, und dann das Ergebnis zurückerwartet. Die ausführenden Methoden gehören in die .po.ts.

    it('should still show the elements of the searchbar', () => {
     expect(result.isSearchFieldDisplayed()).toBe(true);
     expect(result.isSearchButtonDisplayed()).toBe(true);
    });
     
    it('should show the correct Search Term', () => {
     expect(result.getSearchTerm()).toBe(result.searchTerm);
    });

Das nachfolgende Code-Beispiel zeigt die zu der vorherigen .e2e-spec.ts gehörigen .po.ts. Es ist nicht zwingend notwendig, dass jede .e2e-spec.ts ihre eigene .po.ts hat oder umgekehrt. Zum Beispiel kann eine .po.ts Aktionen von Tabs enthalten, wie Tab wechseln oder schließen. Solange eine .e2e-spec.ts nur Methoden von anderen .po.ts benutzt, benötigt sie nicht zwingend eine eigene .po.ts. Wie vorher erwähnt, beginnt die .po.ts mit den Importen und danach wird Klasse (im Beispiel ResultPage) erstellt.

Die navigateTo Methode lässt den Test bei ihrem Aufruf auf die vorgesehene Seite springen. Da der Test das in diesem Fall nicht direkt machen soll, geht er zuerst auf die Search Seite. Dort wird ein Suchbegriff eingegeben und die Suche gestartet. Somit kommt der Test auf die result_list Seite, wo dann die Tests ausgeführt werden.

    import { element, by, ElementFinder, browser } from 'protractor';
    import { SearchPage } from './search.po';
    import * as webdriver from 'selenium-webdriver';
    import { CardPageObject } from './card.po';
    import ModulePromise = webdriver.promise;
    import Promise = webdriver.promise.Promise;
     
    export class ResultPage {
     
     public searchTerm: string = 'test';
     
     search: SearchPage;
     
     navigateTo(): Promise<void> {
     this.search = new SearchPage();
     return this.search.navigateTo()
     .then(() => this.search.setTextInSearchField(this.searchTerm))
     .then(() => this.search.clickSearchButton());
     }

In den drei nachfolgenden Methoden wird jeweils ein Element der Seite abgefragt. Die ersten zwei Tests haben als Rückgabewert einen Union Type. Das heißt, dass entweder ein boolean oder ein Promise<boolean> zurückgegeben werden kann. Also entweder ein Boolean oder das Versprechen auf einen Boolean. Wenn man mit dem Rückgabewert Promise arbeitet, sollte darauf immer ein then folgen, da es sonst zu asynchronen Fehlern kommen kann.

    isSearchButtonDisplayed(): Promise<boolean> | boolean {
     return element(by.name('searchInputField')).isDisplayed();
    }
     
    isSearchFieldDisplayed(): Promise<boolean> | boolean {
     return element(by.name('searchButton')).isDisplayed();
    }
     
    getSearchTerm(): Promise<string> {
     return element(by.name('searchInputField')).getAttribute('value');
    }

Beispiel

Ein Umsetzungsbeispiel für einen Testfall in ClintR ist der Test des Impressumlinks. Er soll zuerst den Link drücken. Danach soll der Test auf den neu entstandenen Tab wechseln und bestätigen, ob die URL /legal-notice enthält. Als letztes soll er diesen Tab wieder schließen. Dieser Test wurde erst nur für die Startseite erstellt.

    it('should send me to the impressum page',() => {
     impressum.clickImpressumLink();
     common.switchToAnotherTab(1);
     expect(browser.getCurrentUrl()).toContain('/legal-notice');
     common.closeSelectedTab(1);
    })

Da das Impressum, laut Akzeptanzkriterium, von allen Unterseiten erreichbar sein muss, wurde dieser später in alle anderen Specs übertragen. Um den Code übersichtlich zu halten, wurde entschieden, diesen Test in ein Modul (impressum.ts) auszulagern.

    import { browser } from 'protractor';
    import { AppPage } from './app.po';
    import { CommonTabActions } from './common-tab-actions';
     
    module.exports = () => {
     let common: CommonTabActions = new CommonTabActions();
     new AppPage().clickImpressumLink().then(() => {
     common.switchToAnotherTab(1);
     expect(browser.getCurrentUrl()).toContain('/legal-notice');
     common.closeSelectedTab(1);
     });
    };

Die Verwendung in der e2e-spec.ts erfolgt auf diesem Wege:

    it('should send me to the impressum page', require('./impressum'));

Besonderheiten, Hinweise & Probleme

In jeder e2e-spec.ts können bestimmte vorgegebene Anweisungen geschrieben werden – z.B. beforeEach, beforeAll oder afterEach und afterAll. Wie die Namen schon sagen, wird der Code, der in einer dieser Anweisung steht, vor bzw. nach jedem oder allen Tests ausgeführt. In unserem Beispiel sollte jeder Test seinen eigenen Seitenaufruf haben. Somit kann z.B. die navigateTo Methode in die beforeEach Anweisung geschrieben werden. afterEach kann z.B. dafür genutzt werden, Tabs, die während der Tests geöffnet worden sind, wieder zu schließen.

Jeder Test beginnt mit dem Wort it. Wenn man vor diesem Wort ein x schreibt, also xit, wird dieser Test bei der Testausführung übersprungen. Es wird dann aber bei der Testausführung anders als bei einem auskommentierten Test mitgeteilt, dass ein oder mehrere Tests übersprungen worden sind. Sollte man einen Testfall mit f schreiben, also fit, werden nur noch Tests bei der Ausführung berücksichtigt, die auch ein fit davor stehen haben. Das ist nützlich, wenn man sehr viele Testfälle hat und man nur einige von ihnen laufen lassen will.

Beim Arbeiten mit Promise, die man aus manchen Methoden erhält, sollte man darauf achten, dass es bei falscher Handhabung zu asynchronen Fehlern kommen kann. Viele Ereignisse wie das Drücken eines Buttons oder die Abfrage, ob ein Element angezeigt wird, erzeugen als Wiedergabewert ein solches Promise. Selbst das Öffnen einer Seite gibt ein Promise<void> zurück. Um Fehler zu vermeiden sollte auf jedes Promise, welches weitere Aktionen nach sich zieht, wie das Drücken eines Buttons und die Ausgabe von einem dadurch entstandenen Wert, explizit mit then reagiert werden. Zum Beispiel:

    drückeButton().then( () => {
     gibMirDenEntstandenenWert();
    });
    //Wenn dieser Wert wieder ein Promise ist, der etwas auslösen soll, dann würde das Ganze so aussehen:
    drückeButton().then( () => {
     gibMirDenEntstandenenWert().then( () => {
     machNochEtwas();
     });
    });
    // oder etwas kürzer
    drückeButton()
     .then(gibMirDenEntstandenenWert)
     .then(machNochEtwas);

Für weitere Informationen zum Thema Promise siehe hier.

Fazit

Protractor eignet sich sehr gut für die Automatisierung von Oberflächentests in einem Softwareentwicklungsprojekt mit Angular2. Die Dokumentation seitens des Projektes ist sehr ausführlich und umfangreich. Durch die Nutzung von Selenium lassen sich die Tests ohne Probleme in den Buildprozess einbinden.