Was sind Funktionstests?

Abgeschlossen

In diesem Abschnitt schließen Sie sich dem Tailspin-Team an, als das Team Funktionstests für seine Pipeline definiert. Mit Funktionstests wird überprüft, ob jede Funktion der Software ordnungsgemäß funktioniert.

Das Team definiert zunächst, was ein Funktionstest abdecken soll. Dazu werden einige Arten von Funktionstests untersucht. Anschließend entscheidet sich das Team, den ersten Test zur Pipeline hinzuzufügen.

Wöchentliche Besprechung

Das Team führt wöchentlich eine Besprechung durch. Andy stellt die Releasepipeline vor. Das Team sieht einen erfolgreichen Buildvorgang durch die Pipeline, von einer Phase in eine andere. Schließlich wird die Web-App in die Stagingphase hochgestuft.

Amita: Ich bin mit der Pipeline sehr zufrieden. Dadurch wird die Builderstellung erheblich vereinfacht. In der Test-Umgebung wird automatisch ein Release bereitgestellt. Dies bedeutet, dass ich Buildartefakte nicht manuell herunterladen und auf meinen Testservern installieren muss. Das ist eine bedeutende Zeitersparnis.

Die Komponententests, die von Mara und Andy erstellt wurden, beseitigen außerdem alle Regressionsfehler, bevor das Release entsteht. Dadurch wird eine Hauptquelle für Frustrationen beseitigt. Ich verschwende keine Zeit, um Regressionsfehler zu finden und zu dokumentieren.

Mir gefällt allerdings nicht, dass all meine Tests immer noch manuell durchgeführt werden. Der Prozess ist langsam, und wir können dem Management erst was zeigen, wenn ich fertig bin. Das ist ein Problem, weil die Tests wichtig sind. Durch Tests wird sichergestellt, dass die Benutzer die richtige Funktionalität erhalten. Es wird aber Druck gemacht, schneller zu liefern.

Andy: Ich bin sicher, dass wir dir helfen können. Welche Art von Tests beansprucht die meiste Zeit?

Amita: Ich denke, das sind die UI-Tests. Ich muss mich durch jeden Schritt klicken, um sicherzustellen, dass ich das richtige Ergebnis erhalte, und das muss ich für jeden Browser tun, den wir unterstützen. Das ist sehr zeitaufwändig. Und da die Komplexität der Website ständig zunimmt, sind UI-Tests auf lange Sicht nicht praktikabel.

Mara: UI-Tests werden als funktionale Tests angesehen.

Tim: Im Gegensatz zu nicht funktionalen Tests?

Mara: Genau. Nicht funktionale Tests sind insbesondere für dich wichtig.

Tim: Okay, ich bin etwas verwirrt.

Was sind funktionale und nicht funktionale Tests?

Mara: Mit Funktionstests wird überprüft, ob die Software insgesamt wie gewünscht funktioniert. Wie die Software die einzelnen Funktionen implementiert, ist in diesen Tests ohne Bedeutung. Wichtig ist, dass sich die Software ordnungsgemäß verhält. Es werden Eingaben gemacht und überprüft, ob die Ausgaben den Erwartungen entsprechen. So testet Amita die Benutzeroberfläche. Wenn sie beispielsweise den Topspieler in der Bestenliste auswählt, erwartet sie, dass das Profil dieses Spielers angezeigt wird.

Nicht funktionale Tests überprüfen Merkmale wie Leistung und Zuverlässigkeit. Ein Beispiel für einen nicht funktionalen Test ist zu überprüfen, wie viele Personen sich gleichzeitig bei der App anmelden können. Ein weiteres Beispiel für einen nicht funktionalen Test sind Auslastungstests. Leistung und Zuverlässigkeit sind für dich interessant.

Tim: ja, das stimmt. Ich muss ein wenig darüber nachdenken. Ich möchte die Pipeline auch mehr automatisieren, aber ich bin mir nicht sicher, welche Möglichkeiten ich habe. Welche automatisierten Tests kann ich ausführen?

Mara: Konzentrieren wir uns vorerst auf Funktionstests. Dies sind die Tests, die Amita durchführt. Das erscheint wie ein Bereich, in dem wir Verbesserungen vornehmen möchten.

Welche Funktionstests kann ich durchführen?

Es gibt viele verschiedene Funktionstests. Sie unterscheiden sich je nach Funktionalität, die getestet werden muss, sowie nach Zeit oder Aufwand, der normalerweise für die Durchführung benötigt wird.

In den folgenden Abschnitten werden einige häufig verwendete Funktionstests vorgestellt.

Buildüberprüfungstest

Bei Buildüberprüfungstests wird die grundlegende Funktionalität einer Anwendung oder eines Dienstes überprüft. Diese Tests werden häufig vor vollständigen und umfangreichen Tests ausgeführt. Buildüberprüfungstest müssen schnell ausgeführt werden.

Angenommen, Sie entwickeln eine Website. Der Buildüberprüfungstest verwendet möglicherweise curl, um zu überprüfen, ob die Website erreichbar ist und beim Abrufen der Homepage der HTTP-Status 200 (OK) erzeugt wird. Wenn beim Abrufen der Homepage ein anderer Statuscode erzeugt wird, z. B. 404 (Nicht gefunden) oder 500 (Interner Serverfehler), ist klar, dass die Website nicht funktioniert. Sie wissen außerdem, dass es keinen Sinn macht, weitere Tests auszuführen. Sie müssen stattdessen den Fehler ermitteln, beheben und die Tests erneut durchführen.

Komponententest

Sie haben Komponententests im Modul Ausführen von Qualitätstests in der Buildpipeline mit Azure Pipelines kennen gelernt.

Kurz gesagt, werden bei Komponententests die grundlegendsten Komponenten des Programms oder der Bibliothek überprüft, z. B. eine einzelne Funktion oder Methode. Sie geben die Eingaben zusammen mit den erwarteten Ergebnissen an. Anschließend werden die einzelnen Tests durchgeführt und überprüft, ob die tatsächlichen Ergebnisse mit den erwarteten Ergebnissen übereinstimmen.

Angenommen, Sie verfügen über eine Funktion, die eine arithmetische Operation durchführt, die eine Division enthält. Sie können einige Werte angeben, deren Eingabe von den Benutzern erwartet wird. Sie können auch Grenzfallwerte wie 0 und -1 angeben. Wenn Sie davon ausgehen, dass eine bestimmte Eingabe einen Fehler oder eine Ausnahme erzeugt, können Sie überprüfen, ob die Funktion diesen Fehler auch wirklich erzeugt.

Bei den UI-Tests, die Sie später in diesem Modul ausführen, handelt es sich um Komponententests.

Testen der Integration

Bei Integrationstest wird überprüft, ob mehrere Softwarekomponenten zusammenarbeiten und ein komplettes System bilden. Ein E-Commerce-System kann beispielsweise eine Website, eine Produktdatenbank und ein Zahlungssystem umfassen. Sie können einen Integrationstest erstellen, in dem Artikel zum Warenkorb hinzufügt und dann gekauft werden. Der Test überprüft, ob die Webanwendung eine Verbindung mit der Produktdatenbank herstellen und die Bestellung abwickeln kann.

Sie können Komponententests und Integrationstests kombinieren, um eine mehrstufige Teststrategie zu schaffen. Sie können für die einzelnen Komponenten beispielsweise Komponententests ausführen, bevor Sie die Integrationstests durchführen. Wenn alle Komponententests bestanden werden, können Sie zuversichtlicher zu Integrationstests übergehen.

Regressionstests

Eine Regression tritt auf, wenn sich das bestehende Verhalten ändert oder nicht mehr vorhanden ist, nachdem eine Funktion hinzugefügt oder geändert wurde. Mit Regressionstests können Sie feststellen, ob sich Code, Konfiguration oder andere Änderungen auf das Gesamtverhalten der Software auswirken.

Regressionstests sind wichtig, da sich eine Änderung in einer Komponente auf das Verhalten einer anderen Komponente auswirken kann. Angenommen, Sie optimieren die Schreibleistung für eine Datenbank. Die Leseleistung dieser Datenbank, für die eine andere Komponente verantwortlich ist, sinkt daraufhin möglicherweise unerwartet. Die geringere Leseleistung ist eine Regression.

Es gibt verschiedene Strategien, um Regressionstests durchzuführen. Diese Strategien variieren in der Regel je nach Anzahl der Tests, die Sie ausführen, um festzustellen, ob eine neue Funktion oder Fehlerkorrektur die vorhandene Funktionalität beeinträchtigt. Wenn Sie die Tests automatisieren, können Regressionstests jedoch bewirken, dass bei jeder Änderung der Software alle Komponententests und Integrationstests ausgeführt werden.

Integritätstests

Bei Integritätstests werden alle Hauptkomponenten einer Software getestet, um festzustellen, ob die Software ordnungsgemäß funktioniert und ausführlichere Tests sinnvoll sind. Sie können sich Integritätsprüfungen als weniger gründlich vorstellen als Regressionstests oder Komponententests, aber Integritätsüberprüfungen sind dennoch umfassender als Buildüberprüfungstests.

Obwohl Integritätstests automatisiert werden können, werden sie nach einer Funktionsänderung oder Fehlerkorrektur häufig manuell durchgeführt. Beispielsweise kann ein Softwaretester, der eine Fehlerkorrektur überprüft, durch Eingabe einiger typischer Werte auch überprüfen, ob andere Funktionen funktionieren. Wenn die Software anscheinend wie erwartet funktioniert, kann ein ausführlicherer Testdurchlauf erfolgen.

Testen der Benutzeroberfläche

Mit UI-Tests wird das Verhalten der Benutzeroberfläche einer Anwendung überprüft. Mithilfe von UI-Tests können Sie überprüfen, ob die Sequenz oder Reihenfolge von Benutzerinteraktionen zum erwarteten Ergebnis führt. Mit diesen Tests kann auch überprüft werden, ob Eingabegeräte wie Tastatur oder Maus die Benutzeroberfläche ordnungsgemäß beeinflussen. Sie können UI-Tests ausführen, um das Verhalten einer nativen Windows-, macOS- oder Linux-Anwendung zu überprüfen. Sie mit UI-Tests auch überprüfen, ob die Benutzeroberfläche in Webbrowsern das erwartete Verhalten aufweist.

Mit einem Komponententest oder Integrationstest kann überprüft werden, ob die Benutzeroberfläche Daten richtig erhält. Mithilfe von UI-Tests können Sie jedoch überprüfen, ob die Benutzeroberfläche ordnungsgemäß angezeigt und das vom Benutzer erwartete Ergebnis erzielt wird.

Beispielsweise kann ein UI-Test überprüfen, ob nach dem Klicken auf eine Schaltfläche die richtige Animation angezeigt wird. Mit einem zweiten Test kann überprüft werden, ob dieselbe Animation ordnungsgemäß angezeigt wird, wenn die Größe des Fensters geändert wird.

In diesem Modul verwenden Sie manuell codierte UI-Tests. Sie können UI-Tests aber auch mit einem Capture-and-Replay-System automatisch erstellen.

Benutzerfreundlichkeitstests

Benutzerfreundlichkeitstests sind eine Art manueller Tests, mit denen das Verhalten einer Anwendung aus der Sicht des Benutzers überprüft wird. Benutzerfreundlichkeitstests werden in der Regel von dem Team durchgeführt, das die Software erstellt.

Während mit UI-Tests hauptsächlich festgestellt werden soll, ob sich ein Feature erwartungsgemäß verhält, können Sie mithilfe von Benutzerfreundlichkeitstests überprüfen, ob die Software intuitiv ist und die Anforderungen des Benutzers erfüllt. Mit anderen Worten: mit Benutzerfreundlichkeitstests wird überprüft, ob die Software "brauchbar" ist.

Angenommen, Sie verfügen über eine Website, die einen Link zum Profil des Benutzers enthält. Ein UI-Test kann überprüfen, ob der Link vorhanden ist und das Profil des Benutzers beim Klicken auf den Link angezeigt wird. Wenn dieser Link jedoch nur schwer zu finden ist, werden die Benutzer möglicherweise frustriert, wenn sie auf ihr Profil zugreifen möchten.

Benutzerakzeptanztests

Benutzerakzeptanztests, z. B. Benutzerfreundlichkeitstests, richten sich hauptsächlich auf das Verhalten einer Anwendung aus Sicht des Benutzers. Im Gegensatz zu Benutzerfreundlichkeitstests wird UAT in der Regel von echten Endbenutzern durchgeführt.

Abhängig von der Software können Endbenutzer aufgefordert werden, bestimmte Aufgaben auszuführen. Sie können die Software ggf. auch erkunden, ohne bestimmte Richtlinien befolgen zu müssen. Bei kundenspezifischer Software werden die Benutzerakzeptanztests in der Regel direkt mit dem Kunden durchgeführt. Bei allgemeinerer Software können Teams Beta Tests ausführen. Bei Betatests erhalten Benutzer*innen in verschiedenen geografischen Regionen oder Benutzer*innen mit besonderem Interesse früheren Zugriff auf die Software.

Das Feedback von den Testern kann direkt oder indirekt erfolgen. Ein direktes Feedback kann in Form von verbalen Kommentaren erfolgen. Ein indirektes Feedback kann durch der Messung der Körpersprache der Tester, der Augenbewegungen oder der Zeit, die zum Ausführen bestimmter Aufgaben erforderlich ist, erfolgen.

Wir haben bereits auf die Wichtigkeit der Erstellung von Tests hingewiesen. Um dies zu betonen, erläutert Abel Wang, Cloud Advocate bei Microsoft, in einem kurzen Video, wie Sie die Qualität in Ihrem Azure DevOps-Plan sicherstellen können.

Fragen an Abel

Welche Wahl trifft das Team?

Tim: Alle diese Tests scheinen wichtig zu sein. Welcher soll zuerst gemacht werden?

Andy: Wir verfügen bereits über funktionierende Komponententests. Wir sind noch nicht in der Lage, Benutzerakzeptanztests durchzuführen. Aufgrund dessen, was ich gehört habe, denke ich, dass wir uns auf UI-Tests konzentrieren sollten. Derzeit ist dies der langsamste Teil unseres Prozesses. Amita, stimmst du zu?

Amita: Ja, das ist auch meine Meinung. Wir haben noch etwas Zeit in dieser Besprechung. Andy oder Mara, wollt ihr mir bei der Planung eines automatisierten UI-Tests helfen?

Mara: Natürlich. Lasst uns aber erst mal einige Vorbedingungen klären. Ich möchte wissen, welches Tool wir verwenden sollten und wie wir die Tests ausführen.

Welche Tools kann ich zum Erstellen von UI-Tests verwenden?

Mara: Welche Möglichkeiten haben wir zum Erstellen von UI-Tests? Ich weiß, dass es viele gibt. Einige Tools sind Open-Source-Tools. Andere bieten kostenpflichtigen kommerziellen Support. Einige mögliche Optionen sind:

  • Windows Application Driver (WinAppDriver): WinAppDriver unterstützt die Automatisierung von UI-Tests für Windows-Apps. Diese Apps können in Universelle Windows-Plattform (UWP) oder Windows Forms (WinForms) geschrieben werden. Wir benötigen eine Lösung, die in einem Browser funktioniert.
  • Selenium: Selenium ist ein portables Open-Source-Framework, das Softwaretests für Webanwendungen ermöglicht. Es läuft unter den meisten Betriebssystemen und unterstützt alle modernen Browser. Selenium-Tests können in mehreren Programmiersprachen geschrieben werden, auch in C#. Sie können sogar NuGet-Pakete nutzen, die das Ausführen von Selenium als NUnit-Tests erleichtern. Wir verwenden NUnit bereits für unsere Komponententests.
  • SpecFlow: SpecFlow ist für .NET-Projekte vorgesehen. Es ist von einem Tool namens "Cucumber" inspiriert worden. SpecFlow und Cucumber unterstützen eine verhaltensgesteuerte Entwicklung (BDD). BDD verwendet einen natürlich sprachigen Parser namens "Gherkin", mit dem sowohl technische Teams als auch nicht technische Teams Geschäftsregeln und-Anforderungen definieren können. Sie können SpecFlow oder Cucumber mit Selenium kombinieren, um UI-Tests zu erstellen.

Andy sieht Mara an.

Andy: Ich weiß, dass diese Optionen für dich neu sind. Spricht etwas dagegen, wenn wir Selenium verwenden? Ich habe etwas Erfahrung damit und Selenium unterstützt Sprachen, die ich bereits kenne. Selenium bietet automatische Unterstützung für mehrere Browser.

Amita: Einverstanden. Es ist besser, wenn sich einer bereits etwas auskennt.

Wie werden Funktionstests in der Pipeline ausgeführt?

In Azure Pipelines werden Funktionstests genauso ausgeführt wie jeder andere Prozess oder Test. Stellen Sie sich folgende Fragen:

  • In welcher Phase werden die Tests ausgeführt?
  • Auf welchem System werden die Tests ausgeführt? Werden sie im Agent oder in der Infrastruktur ausgeführt, die die Anwendung hostet?

Lassen Sie uns sehen, wie das Team diese Fragen beantwortet.

Mara: Mich freut am meisten, dass wir die Tests jetzt in einer Umgebung durchführen können, die sich wie die Produktionsumgebung verhält, in der die App tatsächlich ausgeführt wird. Funktionstests, z. B. UI-Tests, machen in diesem Kontext Sinn. Wir können die Tests in der Testphase unserer Pipeline ausführen.

Amita: Ich stimme die zu. Wir können denselben Workflow beibehalten, wenn wir automatisierte UI-Tests in der gleichen Phase ausführen, in der ich manuelle Tests durchführe. Durch automatisierte Tests können wir Zeit sparen, und ich kann mich auf die Benutzerfreundlichkeit konzentrieren.

Tim: Amita testet die Website auf ihrem Windows-Laptop, da die meisten unserer Benutzer die Website ebenfalls so aufsuchen. Wir kompilieren jedoch unter Linux und stellen dann Azure App Service unter Linux bereit. Wie können wir das bewerkstelligen?

Mara: Gute Frage. Wir können auch auswählen, wo wir die Tests ausführen. Wir haben folgende Möglichkeiten:

  • Im Agent: ein Microsoft-Agent oder ein Agent, den wir hosten
  • In der Testinfrastruktur: lokal oder in der Cloud

Unsere derzeitige Testphase umfasst einen Job. Dieser Job stellt die Website in App Service von einem Linux-Agent aus bereit. Wir können einen zweiten Job hinzufügen, der die UI-Tests ausgehend von einem Windows-Agent ausführt. Der von Microsoft gehostete Windows-Agent ist bereits für die Durchführung von Selenium-Tests eingerichtet.

Andy: Halten wir nochmals fest, was wir wissen. Wir verwenden zunächst einen von Microsoft gehosteten Windows-Agent. Später können wir dieselben Tests in Agents unter macOS und Linux ausführen, wenn eine weitergehende Testabdeckung erforderlich ist.

Der Plan

Mara: OK. Wir gehen wie folgt vor:

  • Ausführen von Benutzeroberflächentests mit Selenium über einen von Microsoft gehosteten Windows-Agent
  • Abrufen der Webinhalte von der im App Service ausgeführten App während der Testphase
  • Ausführen der Tests für alle unterstützten Browser

Andy: Ich mache das zusammen mit Amita. Amita, wir treffen uns dann morgen früh. Ich möchte noch einiges recherchieren, bevor wir das treffen.

Amita: Prima! Bis dann.

Erstellen eines Funktionstestplans

Sie haben gesehen, wie das Team entschieden hat, seine ersten Funktionstests zu implementieren. Bedenken Sie, dass immer ein Plan erforderlich ist, wenn das Team erstmals Funktionstests in die Pipeline einbindet – aber auch dann, wenn dies bereits der Fall ist.

Oftmals beantworten Teammitglieder die Frage nach einem Leistungstestplan mit einer Liste von Tools, die sie verwenden. Eine Liste der Tools ist jedoch kein Plan. Sie müssen auch herausfinden, wie die Testumgebungen konfiguriert werden. Außerdem müssen Sie die zu verwendenden Prozesse ermitteln und bestimmen, wann ein Test erfolgreich ist oder nicht.

Der Plan muss folgende Bedingungen erfüllen:

  • Er berücksichtigt die Erwartungen des Unternehmens.
  • Er berücksichtigt die Erwartungen der Zielbenutzer.
  • Er definiert die verwendeten Metriken.
  • Er definiert die verwendeten KPIs.

Leistungstests müssen von Anfang an Bestandteil Ihrer Planung sein. Wenn Sie ein Story- oder Kanban-Board verwenden, sollte ggf. ein Bereich in der Nähe verfügbar sein, in dem Sie Ihre Teststrategie planen können. Im Rahmen der Iterationsplanung sollten Lücken in der Teststrategie hervorgehoben werden. Darüber hinaus muss festgelegt werden, wie Sie die Leistung überwachen, nachdem die Anwendung bereitgestellt wurde. Sie dürfen die Leistung nicht nur vor dem Release messen.

Überprüfen Sie Ihr Wissen

1.

Ihr Kundendienstteam erhält zu viele Rückerstattungsanforderungen von Kunden, die unbeabsichtigt Käufe in Ihrer mobilen Anwendung getätigt haben. Die Kunden berichten, dass die Schaltflächen Kaufen und Abbrechen zu nah beieinander liegen. Welche Art von Funktionstests könnte Ihnen helfen, derartige Probleme zu beheben, bevor Benutzer erreichen?

2.

Das für die Benutzerfreundlichkeit verantwortliche Team hat einige drastische Änderungen an der Homepage Ihrer Website vorgeschlagen. Welche Art von Funktionstests können Sie verwenden, um sicherzustellen, dass die einzelnen Schaltflächen auf der Seite die richtige Funktion durchführen?

3.

Welche Funktionstests werden normalerweise durch Menschen und nicht automatisiert ausgeführt?