Parasoft C/C++test 2022.2 unterstützt das neue MISRA C:2012 Amendment 3 und eine Entwurfsversion von MISRA C++ 202x. Erfahren Sie mehr >>

Warum Menschen Unit Testing hassen und wie man die Liebe zurückbringt

Von Nathan Jakubiak

1. März 2022

5  min lesen

Unit-Tests helfen bei der Bewertung selbst kleinster Komponenten von Anwendungen. Es gab jedoch eine Herausforderung, wie Unit-Tests effizienter gestaltet werden können. Hier zeigen wir, wie Parasoft Jtest Unit Testing Assistant Softwaretestern helfen kann, diese Herausforderung zu meistern.

Wir haben den Parasoft Jtest erstellt Unit-Test-Assistent Unit-Tests effizienter zu gestalten, weil wir wissen, wie wichtig es ist, aber wie zeitaufwändig es sein kann.

Es ist allgemein bekannt, dass Unit-Tests a Best Practice für die Kernentwicklung. Gleichzeitig hören wir hier bei Parasoft viele Geschichten von Kunden über die unzureichende Unit-Test-Abdeckung ihres Codes.

Verbessern Sie Unit-Tests für Java mit Automatisierung

Holen Sie sich den Best Practices-Leitfaden für Java-Entwickler

Warum also die Lücke zwischen Best Practice und Realität?

Schauen wir uns einige der Ursachen für eine geringe Unit-Test-Abdeckung an und wie Sie diese Hindernisse mit Softwareautomatisierung überwinden können.

Warum überhaupt Unit-Tests?

Die meisten Entwicklungsteams werden dem zustimmen Unit-Tests sind wertvoll. Eine gute Unit-Test-Suite bietet ein Sicherheitsnetz für die Anwendungsentwicklung und ermöglicht es Teams, die agile Entwicklung zu beschleunigen und gleichzeitig das Risiko zu mindern, dass Fehler in spätere Phasen der Pipeline gelangen.

Ich würde noch weiter gehen und sagen, dass der Prozess der Erstellung von a Software-Einheitentest ist an und für sich eine nützliche Aktivität, die dem Entwickler hilft, seinen Code durch eine andere Linse zu betrachten, im Wesentlichen eine zusätzliche Codeüberprüfung durchzuführen.

Automatisierte Testpyramide, die Testebenen von unten nach oben zeigt: automatisierte Unit-Tests, automatisierte Komponententests, automatisierte Integrationstests, automatisierte API-Tests, automatisierte GUI-Tests und ein Mensch an der Spitze.

Beim Schreiben eines Komponententests überprüfen Sie die Schnittstelle zur Funktionalität aus externer Sicht und profitieren davon, wenn Sie Fragen wie unten stellen.

  • Wie wird mein Code verwendet? Das Stellen dieser Frage kann zu einer vereinfachten Schnittstelle und geringeren Kosten für die Codepflege führen.
  • Was passiert, wenn ich ungültige Daten erhalte? Diese Frage kann zu robusterem und wiederverwendbarem Code führen.

Unsere Entwicklungsteams bei Parasoft haben beim Schreiben von Einheitentests für diesen Code viele Probleme in Code entdeckt, der sich in der Entwicklung befindet.

Wo die Absichten von Great Unit Testing zusammenbrechen

In der Regel führen Entwicklungsteams nur wenige Einheitentests durch oder überspringen sie ganz. Dies ist häufig auf eine Kombination der folgenden beiden Situationen zurückzuführen.

  1. Der Druck, immer mehr Funktionalität zu liefern.
  2. Die Komplexität und Zeitaufwendigkeit bei der Erstellung wertvoller Unit-Tests.

Gründe für die begrenzte Einführung von Unit-Tests

Dies gliedert sich in einige häufige Gründe, die Entwickler anführen, die die Einführung von Komponententests als zentrale Entwicklungspraxis einschränken.

  • Es ist viel manuelles Codieren erforderlich. Manchmal sogar mehr, als für die Implementierung einer bestimmten Funktion oder Erweiterung erforderlich war.
  • Es ist schwierig, die Abhängigkeiten der zu testenden Einheit zu verstehen, zu initialisieren und/oder zu isolieren.
  • Das Definieren geeigneter Behauptungen ist zeitaufwändig und erfordert häufig Zyklen zum Ausführen und manuellen Anpassen von Tests oder zum Ausführen intelligenter Vermutungen.
  • Es ist einfach nicht so interessant. Entwickler wollen sich nicht wie Tester fühlen, sie wollen Zeit damit verbringen, mehr Funktionalität bereitzustellen.

Tools zur Unterstützung des Unit-Tests

Derzeit sind mehrere Tools verfügbar, die beim Komponententest helfen können.

  • Unit-Testing- und Assertion-Frameworks bieten standardisierte Ausführungsformate wie JUnit für eine nahtlose Integration in die CI-Infrastruktur (Jenkins, Azure DevOps, Bamboo, TeamCity).
  • IDEs helfen bei der Erstellung von Testcode (IntelliJ, Eclipse).
  • Mocking Frameworks isolieren den Code von seinen Abhängigkeiten (Mockito).
  • Code-Coverage-Tools bieten einen gewissen Einblick, welcher Code ausgeführt wurde (JaCoCo, Emma, ​​Cobertura, Clover).
  • Debugger ermöglichen es Entwicklern, die schrittweise Ausführung eines einzelnen Tests zu überwachen und zu überprüfen.

Teure Schmerzpunkte von Unit-Tests

Obwohl diese Tools hilfreich sind, gehen sie nicht auf die Gründe ein, warum Entwickler nicht genügend Unit-Tests durchführen. Entwickler finden immer noch viele Schmerzpunkte, die Unit-Tests teuer machen, wie zum Beispiel die folgenden:

  • Die IDE hilft beim Erstellen eines Skeletts für den Komponententest, aber ohne Inhalt. Der Entwickler muss noch viel Code hinzufügen, um einen ausführbaren Test zu erstellen.

  • Das Verspotten von Frameworks erfordert eine erhebliche Menge an manueller Codierung, um sie zu instanziieren und zu konfigurieren, sowie das Wissen, wie man sie richtig verwendet.
  • Zusicherungen müssen manuell definiert und Tests ausgeführt werden, um festzustellen, ob die richtigen Werte bestätigt wurden.
  • Coverage-Tools bieten einen Einblick in den Code, den ein ausgeführter Test abgedeckt hat, aber keinen Einblick in das Laufzeitverhalten des Tests.
  • Debugger können für einen einzelnen Test verwendet werden, skalieren jedoch nicht, um einen gesamten Testlauf zu überwachen.

Zusammenfassend lässt sich sagen, dass die Erstellung eines Komponententests immer noch viel manuellen, zeitaufwändigen und oft lästigen Aufwand erfordert, bevor Sie überhaupt damit begonnen haben, einem Test Geschäftslogik hinzuzufügen.

Erhöhen Sie die Codeabdeckung und den ROI mit Java Unit Testing

Holen Sie sich den Strategieleitfaden für Manager & Führungskräfte

Die Lösung? Wir haben einen Assistenten erstellt!

Um ein Tool zu entwickeln, das Ihnen hilft, diese Schmerzpunkte zu umgehen, haben wir uns (natürlich) der Automatisierung von Softwaretests zugewandt. Der Unit Test Assistant (UTA) von Parasoft Jtest steht Ihnen zur Verfügung, um Ihnen dabei zu helfen, auf Knopfdruck einen voll funktionsfähigen Unit-Test zu erstellen.

Mit Parasoft Jtest erstellte Tests sind „normale“ JUnits, aber mit all der alltäglichen Arbeit, die für Sie erledigt wird. Parasoft Jtest richtet das Testframework ein, instanziiert Objekte, konfiguriert Mocks für geeignete Objekte und Methodenaufrufe, die von der zu testenden Methode verwendet werden, und fügt Zusicherungen für Werte hinzu, die sich in den getesteten Objekten ändern. Diese JUnits können als Teil Ihres standardmäßigen CI-Workflows genauso ausgeführt werden wie Ihre bestehenden Tests.

Parasoft Jtest unterstützt die folgenden Workflows zur Testerstellung:

  • Toolunterstützte Erstellung von Unit-Tests für neu entwickelten Code.
  • Massengenerierung von Unit-Tests für Legacy-Code.
  • Gezielte Generierung von Unit-Tests zur Abdeckung bestimmter nicht abgedeckter Codeblöcke.

Tool-unterstützte Erstellung von Unit-Tests für neu entwickelten Code

Entwickler können mehrere Testfälle mit Objektinitialisierung und Mocks generieren, die vollständig konfiguriert sind, um alle Zweige in ihrer zu testenden Methode abzudecken. Wenn sie mehr Kontrolle über den generierten Code wünschen, können sie den Test alternativ mit gezielten Parasoft Jtest-Aktionen nach und nach aufbauen.

Unit-Test-Assistent von Parasoft Jtest ist auf einen unterstützten Workflow spezialisiert, indem Aktionen bereitgestellt werden, die Folgendes bewirken:

  • Erstellen Sie Testskelette, die die getestete Methode mit allen initialisierten Objekten aufrufen.
  • Identifizieren Sie Methodenaufrufe, die verspottet werden können, um den zu testenden Code besser zu isolieren, mit schnellen Korrekturen zum Generieren des verspotteten Codes.
  • Erstellen Sie Zusicherungen für Objektwerte, die sich während der Ausführung des Tests ändern und zugesichert werden sollten.
  • Finden Sie Tests, die sich nicht selbst bereinigen, wodurch eine potenziell instabile Testumgebung entsteht (aufgrund der Verwendung von Threads, externen Dateien, statischen Feldern oder Systemeigenschaften).

Generierung von Bulk-Unit-Tests für Legacy-Code

Viele Teams pflegen immer noch Legacy-Codebasen mit viel ungetestetem Code. Dies wird zu einem Geschäftsrisiko, wenn Änderungen an diesem Code vorgenommen werden müssen.

Parasoft Jtest ermöglicht es einem Entwickler, Testsuiten für ganze Projekte, Pakete und Klassen zu generieren, um schnell eine Reihe von Tests zu erstellen, die eine hohe Abdeckung des Legacy-Codes bieten. Die Tests können so optimiert werden, dass sie mit einem minimalen Satz von Testfällen die höchste Abdeckung oder mit einer stabileren und wartbareren Testsuite eine etwas geringere Abdeckung erzielen.

Gezielte Generierung von Einheitentests zur Abdeckung bestimmter nicht abgedeckter Codeblöcke

Oft gibt es einige Tests für eine Codebasis, aber nicht genug Tests, um alle Bedingungen abzudecken. Die Hauptflüsse werden getestet, Randfälle oder Fehlerbedingungen bleiben jedoch ungetestet.

Parasoft Jtest zeigt visuell, welche Codeblöcke getestet werden und welche nicht, und bietet kontextspezifische Aktionen, um einen Testfall zu erstellen, der speziell eine bestimmte nicht abgedeckte Codezeile abdeckt. Diese Aktion erstellt einen Testfall, der alle Objekte und Mocks mit bestimmten Werten initialisiert, die erforderlich sind, um den Test zur Ausführung der angegebenen Codezeile zu zwingen.

Reduzieren Sie die Unit-Testzeit

Wir haben den Unit-Test-Assistenten von Parasoft Jtest entwickelt, um Unit-Tests effizienter zu gestalten, da wir als Unternehmen, das sich auf intelligente Testautomatisierung spezialisiert hat, wissen, dass Unit-Tests ein wesentlicher Schritt bei der Erstellung von Software sind, die sicher, zuverlässig und von hoher Qualität ist.

Seit wir Parasoft Jtest mit dem Unit-Test-Assistenten veröffentlicht haben, haben uns Kunden mitgeteilt, dass Parasoft Jtest den Zeitaufwand für das Erstellen und Verwalten von Unit-Tests um bis zu 50 % reduziert. Ich hoffe, dass Sie es ausprobieren und Ihre Erfahrungen mit Parasoft Jtest teilen, um die Zeit, die zum Erstellen und Verwalten Ihrer Komponententests benötigt wird, erheblich zu verkürzen.

Reduzieren Sie die Zeit, die zum Erstellen und Verwalten von Einheitentests benötigt wird.

Von Nathan Jakubiak

Nathan ist Entwicklungsdirektor bei Parasoft. Er und seine Teams entwickeln Produktfunktionen in den Bereichen UI-Tests (Selenic), API-Tests (SOAtest), Service-Virtualisierung (Virtualize) und Unit-Tests (Jtest). Er ist seit 2000 bei Parasoft.

Erhalten Sie die neuesten Nachrichten und Ressourcen zum Testen von Software sofort.