Was sind Unit-Tests?

Unit-Tests sind der Prozess, bei dem Sie die kleinste funktionale Codeeinheit testen. Softwaretests tragen zur Sicherstellung der Codequalität bei und sind ein integraler Bestandteil der Softwareentwicklung. Es ist eine bewährte Methode der Softwareentwicklung, Software als kleine, funktionale Einheiten zu schreiben und dann für jede Codeeinheit einen Unit-Test zu schreiben. Sie können Unit-Tests zunächst als Code schreiben. Führen Sie diesen Testcode dann jedes Mal automatisch aus, wenn Sie Änderungen am Softwarecode vornehmen. Auf diese Weise können Sie, falls ein Test fehlschlägt, schnell den Bereich des Codes isolieren, der den Bug oder Fehler enthält. Unit-Tests setzen modulare Denkparadigmen durch und verbessern die Testabdeckung und -qualität. Automatisierte Unit-Tests sorgen dafür, dass Sie oder Ihre Entwickler mehr Zeit haben, sich auf das Programmieren zu konzentrieren.

Was ist ein Unit-Test?

Ein Unit-Test ist ein Codeblock, der die Genauigkeit eines kleineren, isolierten Blocks von Anwendungscode, typischerweise einer Funktion oder Methode, überprüft. Der Unit-Test soll überprüfen, ob der Codeblock gemäß der theoretischen Logik des Entwicklers erwartungsgemäß ausgeführt wird. Der Unit-Test ist nur in der Lage, mit dem Codeblock über Eingaben und erfasste bestätigte (wahr oder falsch) Ausgaben zu interagieren. 

Ein einzelner Codeblock kann auch eine Reihe von Unit-Tests enthalten, die als Testfälle bezeichnet werden. Ein vollständiger Satz von Testfällen deckt das gesamte erwartete Verhalten des Codeblocks ab, es ist jedoch nicht immer erforderlich, den vollständigen Satz von Testfällen zu definieren.

Wenn für einen Codeblock andere Teile des Systems ausgeführt werden müssen, können Sie keinen Unit-Test mit diesen externen Daten durchführen. Der Unit-Test muss isoliert ausgeführt werden. Andere Systemdaten, wie Datenbanken, Objekte oder Netzwerkkommunikation, können für die Funktionalität des Codes erforderlich sein. In diesem Fall sollten Sie stattdessen Datenstubs verwenden. Es ist am einfachsten, Unit-Tests für kleine und logisch einfache Codeblöcke zu schreiben.

Strategien für Unit-Tests

Um Unit-Tests zu erstellen, können Sie einige grundlegende Techniken anwenden, um sicherzustellen, dass alle Testfälle abgedeckt werden.

Logikprüfungen

Führt das System bei einer korrekten, erwarteten Eingabe die richtigen Berechnungen durch und folgt es dem richtigen Pfad durch den Code? Werden alle Pfade durch den Code durch die angegebenen Eingaben abgedeckt?

Grenzkontrollen

Wie reagiert das System auf die angegebenen Eingaben? Wie reagiert es auf typische Eingaben, Sonderfälle oder ungültige Eingaben?

Nehmen wir an, Sie erwarten eine Ganzzahleingabe zwischen 3 und 7. Wie reagiert das System, wenn Sie eine 5 (typische Eingabe), eine 3 (Sonderfall) oder eine 9 (ungültige Eingabe) verwenden?

Fehlerbehebung

Wie reagiert das System, wenn Eingabefehler auftreten? Wird der Benutzer zu einer weiteren Eingabe aufgefordert? Stürzt die Software ab?

Objektorientierte Prüfungen

Wenn der Status persistenter Objekte durch die Ausführung des Codes geändert wird, wird das Objekt dann korrekt aktualisiert?

Beispiel für einen Unit-Test

Hier ist ein Beispiel für eine sehr einfache Methode in Python und einige Testfälle mit entsprechendem Unit-Test-Code.

Python-Methode

def add_two_numbers (x, y):

    return x + y

Entsprechende Unit-Tests

def test_add_positives():

    result = add_two_numbers(5, 40)

    assert result == 45

def test_add_negatives():

    result = add_two_numbers(-4, -50)

    assert result == -54

def test_add_mixed():

    result = add_two_numbers(5, -5)

    assert result == 0  

Was sind die Vorteile von Unit-Tests?

Unit-Tests kommen Softwareentwicklungsprojekten in vielerlei Hinsicht zugute.

Effiziente Bug-Entdeckung

Wenn innerhalb eines Codeblocks Eingabe-, Ausgabe- oder Logikfehler auftreten, helfen Ihnen Ihre Unit-Tests dabei, diese zu erkennen, bevor die Fehler in die Produktion gelangen. Wenn sich der Code ändert, führen Sie denselben Satz von Unit-Tests aus - neben anderen Tests wie Integrationstests - und erwarten dieselben Ergebnisse. Wenn Tests fehlschlagen (auch als defekte Tests bezeichnet), deutet dies auf regressionsbedingte Fehler hin. 

Unit-Tests helfen auch dabei, Fehler im Code schneller zu finden. Ihre Entwickler verbringen nicht viel Zeit mit Debugging-Aktivitäten. Sie können schnell den genauen Teil des Codes lokalisieren, der einen Fehler aufweist.

Dokumentation

Es ist wichtig, den Code zu dokumentieren, um genau zu wissen, was der Code tun soll. Abgesehen davon dienen Unit-Tests auch als eine Form der Dokumentation.

Andere Entwickler lesen die Tests, um zu sehen, welches Verhalten der Code voraussichtlich zeigen wird, wenn er ausgeführt wird. Sie verwenden die Informationen, um den Code zu ändern oder umzugestalten. Das Refactoring von Code macht ihn leistungsfähiger und kompakter. Sie können den Unit-Test erneut ausführen, um zu überprüfen, ob der Code nach Änderungen wie erwartet funktioniert.

Wie verwenden Entwickler Unit-Tests?

Entwickler verwenden Unit-Tests in verschiedenen Phasen des Softwareentwicklungszyklus. 

Testgetriebene Entwicklung

Bei testgetriebener Entwicklung (TDD) erstellen Entwickler Tests, um die funktionalen Anforderungen einer Software zu überprüfen, bevor sie den vollständigen Code selbst erstellen. Wenn die Tests zuerst geschrieben werden, kann der Code sofort anhand der Anforderungen verifiziert werden, sobald die Codierung abgeschlossen und die Tests ausgeführt wurden.

Nach Fertigstellung eines Codeblocks

Sobald ein Codeblock als vollständig betrachtet wird, sollten Unit-Tests entwickelt werden, sofern dies nicht bereits dank TDD geschehen ist. Anschließend können Sie sofort Unit-Tests ausführen, um die Ergebnisse zu überprüfen. Unit-Tests werden auch als Teil der gesamten Suite anderer Softwaretests während des Systemtests ausgeführt. Sie sind in der Regel die ersten Tests, die während des vollständigen Systemsoftwaretests ausgeführt werden.

DevOps-Effizienz

Eine der wichtigsten Aktivitäten bei der Anwendung von DevOps auf Softwareentwicklungspraktiken ist die kontinuierliche Integration und kontinuierliche Bereitstellung (CI/CD). Alle Änderungen am Code werden automatisch in die breitere Codebasis integriert, automatisierten Tests unterzogen und dann bereitgestellt, wenn die Tests erfolgreich sind.

Unit-Tests sind neben Integrationstests Teil der Testsuite. Sie werden automatisch in der CI/CD-Pipeline ausgeführt, um die Codequalität sicherzustellen, wenn sie aktualisiert und im Laufe der Zeit geändert wird.

Wann sind Unit-Tests weniger vorteilhaft?

Unit-Tests sind nicht immer für jeden einzelnen Testfall in jedem einzelnen Codeblock in jedem einzelnen Projekt erforderlich. Hier sind einige Beispiele dafür, wann Unit-Tests möglicherweise weggelassen werden können. 

Wenn die Zeit begrenzt ist

Selbst bei generativen Unit-Test-Frameworks nimmt das Schreiben neuer Unit-Tests einen erheblichen Teil der Zeit Ihrer Entwickler in Anspruch. Während eingabe- und ausgabebasierte Unit-Tests leicht zu erstellen sind, sind logikbasierte Prüfungen schwieriger.

Sobald Ihre Entwickler mit dem Schreiben von Tests beginnen, sehen sie auch Faktorwechsel-Möglichkeiten in den Codeblöcken und werden von deren Fertigstellung abgelenkt. Dies kann zu längeren Entwicklungszeiten und Budgetproblemen führen.

UI/UX-Anwendungen

Wenn sich das Hauptsystem eher mit dem Aussehen und der Handhabung als mit der Logik befasst, gibt es möglicherweise nicht viele Unit-Tests, die durchgeführt werden müssen. Andere Testarten, wie z. B. manuelles Testen, sind in diesen Fällen eine bessere Strategie als Unit-Tests.

Ältere Codebasen

Das Schreiben von Tests, um bestehenden Legacy-Code zu umschließen, kann sich je nach Stil des geschriebenen Codes als nahezu unmöglich erweisen. Da für Unit-Tests Dummy-Daten erforderlich sind, kann es auch zu zeitaufwändig sein, Unit-Tests für stark vernetzte Systeme zu schreiben, bei denen viele Daten analysiert werden müssen.

Sich schnell entwickelnde Anforderungen

Je nach Projekt kann die Software in einem bestimmten Arbeitssprint wachsen, die Richtung ändern oder ganze Teile davon über Bord werfen. Wenn sich die Anforderungen wahrscheinlich häufig ändern werden, gibt es keinen Grund, jedes Mal, wenn ein Codeblock entwickelt wird, Unit-Tests zu schreiben.

Was sind bewährte Methoden für Unit-Tests?

Wir geben Ihnen einige bewährte Methoden für Unit-Tests an die Hand, damit Sie das Beste aus Ihrem Prozess herausholen können.

Verwenden eines Unit-Test-Frameworks

Es ist Zeitverschwendung, explizite, vollständig angepasste Unit-Tests für jeden einzelnen Codeblock zu schreiben. Es gibt automatisierte Test-Frameworks für jede gängige Programmiersprache.

Python hat beispielsweise pytest und unittest als zwei verschiedene Frameworks für Unit-Tests. Test-Frameworks werden in Software-Entwicklungsprojekten aller Größenordnungen in großem Umfang eingesetzt.

Automatisieren von Unit-Tests

Unit-Tests sollten bei verschiedenen Ereignissen innerhalb der Softwareentwicklung ausgelöst werden. Sie können sie z. B. verwenden, bevor Sie mit Hilfe von Versionskontrollsoftware Änderungen an einem Zweig vornehmen oder ein Software-Update bereitstellen.

Unit-Tests können auch für ein vollständiges Projekt ausgeführt werden, das nach einem Zeitplan festgelegt wird. Automatisierte Unit-Tests stellen sicher, dass Tests während des gesamten Entwicklungszyklus in allen geeigneten Ereignissen und Fällen ausgeführt werden.

Einmalige Bestätigung

Für jeden Unit-Test sollte es nur ein wahres oder falsches Ergebnis geben. Stellen Sie sicher, dass Ihr Test nur eine Assert-Aussage enthält. Eine fehlgeschlagene Assert-Anweisung in einem Block von mehreren Aussagen kann zu Verwirrung darüber führen, welche Anweisung das Problem verursacht hat.

Implementieren von Unit-Tests

Unit-Tests sind ein wichtiger Teil der Softwareentwicklung, aber viele Projekte stellen dafür keine Ressourcen bereit. Wenn Projekte als Prototypen beginnen, kleine Community-Projekte sind oder einfach schnell codiert werden, können Unit-Tests aus Zeitgründen schon mal weggelassen werden.

Wenn Sie jedoch von Anfang an Projekte mit Unit-Tests als Standardverfahren erstellen, ist der Prozess viel einfacher nachzuvollziehen und zu wiederholen.

Was ist der Unterschied zwischen Unit-Tests und anderen Testarten?

Neben Unit-Tests gibt es viele andere Arten von Softwaretestmethoden. Sie alle spielen spezifische Rollen im Lebenszyklus der Softwareentwicklung:

  • Integrationstests überprüfen, ob verschiedene Teile des Softwaresystems, die für die Interaktion konzipiert sind, dies korrekt tun.
  • Funktionstests prüfen, ob das Softwaresystem die vor der Erstellung festgelegten Softwareanforderungen erfüllt.
  • Bei Leistungstests wird geprüft, ob die Software die erwarteten Leistungsanforderungen wie Geschwindigkeit und Speichergröße erfüllt.
  • Bei Akzeptanztests wird die Software manuell von Stakeholdern oder Benutzergruppen getestet, um zu überprüfen, ob sie erwartungsgemäß funktioniert.
  • Sicherheitstests überprüfen die Software auf bekannte Sicherheitslücken und Bedrohungen. Dazu gehört die Analyse der Bedrohungsfläche, einschließlich der Zugangspunkte Dritter zur Software.

Diese Testmethoden erfordern in der Regel spezielle Tools und unabhängige Prozesse zur Überprüfung der Software. Viele von ihnen werden auch ausgeführt, nachdem grundlegende Anwendungsfunktionen entwickelt wurden. 

Im Gegensatz dazu werden Komponententests jedes Mal ausgeführt, wenn der Code erstellt wird. Sie können geschrieben werden, sobald ein Code geschrieben ist, und erfordern keine speziellen Tools, um ausgeführt zu werden. Unit-Tests gelten als eine der grundlegendsten Arten von Softwaretests.

Wie kann AWS Ihnen bei Ihren Anforderungen an Unit-Tests helfen?

Amazon Web Services (AWS) bietet Entwicklern eine Vielzahl von Vorteilen. Sie können Code entwickeln und ausführen und Software testen, z. B. durch Komponententests und Integrationstests. Sie können auch DevOps-Pipelines ausführen und viele Entwicklungsmöglichkeiten nutzen.

AWS-Entwicklertools bieten integrierte Entwicklungsumgebungen (IDEs), Plugins und SDKs für verschiedene Programmiersprachen und Anwendungsfälle. Neben anderen Vorteilen machen diese Tools Unit-Tests effizienter.

AWS Fargate ist eine nutzungsbasierte Serverless-Datenverarbeitungs-Engine, mit der Sie sich auf die Entwicklung von Anwendungen konzentrieren können, ohne Server verwalten zu müssen. Sie können auf Fargate ganz einfach automatisierte Unit-Test-Software ausführen, um Ihre Anwendungsentwicklung zu optimieren. 

Unit-Test-Software von Drittanbietern finden Sie auch auf dem AWS Marketplace. Sie können Software schnell und mit den benötigten Steuerungen implementieren. AWS-Marketplace-Verkäufer bieten flexible Preisoptionen, sodass Sie für das bezahlen können, was Sie benötigen, wenn Sie es benötigen.

Beginnen Sie mit dem Web-Hosting in AWS,indem Sie noch heute ein Konto erstellen.

Nächste Schritte in AWS

Zusätzliche produktbezogene Ressourcen ansehen
Entwickler-Tools-Services ausprobieren 
Registrieren Sie sich und erhalten Sie ein kostenloses Konto

Sie erhalten sofort Zugriff auf das kostenlose Kontingent von AWS.

Registrieren 
Mit der Entwicklung in der Konsole starten

Starten Sie mit der Entwicklung in der AWS-Managementkonsole.

Anmelden