Was ist Modultest? Definition, Beispiele

โšก Intelligente Zusammenfassung

Beim Modultest werden einzelne Unterprogramme, Unterroutinen, Klassen und Prozeduren geprรผft, anstatt des gesamten Programms. Dadurch treten Fehler in einem kleinen, gut verstรคndlichen Codeblock zutage, wo sie kostengรผnstig zu finden und zu beheben sind.

  • ๐ŸŽฏ Ziel: Ziel ist es, Fehler in einem Modul aufzudecken, nicht zu beweisen, dass das Modul funktioniert.
  • โšช Orientierung: Die Technik ist im Wesentlichen eine White-Box-Methode, ergรคnzt durch Black-Box-Fรคlle, die aus der Spezifikation abgeleitet werden.
  • โฉ Parallelitรคt: Es kรถnnen mehrere Module gleichzeitig getestet werden, was den gesamten Testzeitraum verkรผrzt.
  • ๐Ÿ”— Zwei Methoden: Die Module werden entweder schrittweise, inkrementell, oder nicht-inkrementell in einem Durchgang kombiniert.
  • ๐Ÿงฐ Gerรผst: Treiber liefern Testdaten an ein Modul, wรคhrend Stubs als Ersatz fรผr die von ihnen aufgerufenen Module dienen.
  • ๐Ÿ†š Eigentรผmer: Tester schreiben Modultests nach der Codierung, wรคhrend Entwickler Unit-Tests wรคhrend der Codierung schreiben.
  • โš ๏ธ Challenges: Nicht-inkrementelles Arbeiten, missverstandene Test-Doubles und hรคufiges Debuggen beanspruchen den grรถรŸten Teil des Aufwands.

Modultests erklรคrt mit Methoden, Treibern, Stubs und Vergleichen

Was ist Modultest?

Modulprรผfung Modultests sind eine Art von Softwaretests, die einzelne Unterprogramme, Unterroutinen, Klassen oder Prozeduren eines Programms รผberprรผfen. Anstatt das gesamte Softwareprogramm auf einmal zu testen, empfiehlt der Modultest, die kleineren Bausteine โ€‹โ€‹des Programms zu prรผfen.

Modultests sind grรถรŸtenteils White-Box-orientiert. Ziel von Modultests ist nicht der Nachweis der korrekten Funktion des Moduls, sondern das Aufdecken eines Fehlers. Diese Umkehrung ist wichtig: Ein Testlauf, der nichts findet, hat wenig bestรคtigt, wohingegen ein Testlauf, der einen Fehler aufdeckt, seinen Zweck erfรผllt hat.

Durch das Testen auf Modulebene wird auch die Parallelisierung des Testprozesses ermรถglicht, da so die Mรถglichkeit geschaffen wird, mehrere Module gleichzeitig zu testen, anstatt auf einen vollstรคndigen Build zu warten.

Warum Modultests durchfรผhren?

Modultests werden empfohlen, da sie die Wirtschaftlichkeit der Fehlererkennung verรคndern.

  • Die Wahrscheinlichkeit, Fehler oder Bugs in kleineren Programmteilen zu identifizieren, steigt.
  • Mehrere Module kรถnnen gleichzeitig getestet werden, daher unterstรผtzt der Ansatz parallele Tests.
  • Die Komplexitรคt der Tests lรคsst sich leicht bewรคltigen, da jedes Modul fรผr sich betrachtet wird.
  • Ein Defekt, der in einem Modul gefunden wurde, ist tracEs ist auf eine kleine Menge Code beschrรคnkt, wodurch sich die Debugging-Zeit drastisch reduziert.

Wie fรผhrt man Modultests durch?

Designing a Testfall ist ein wichtiger Bestandteil des Modultests. Beim Entwurf von Testfรคllen fรผr einen Modultest muss der Tester zwei Dinge berรผcksichtigen.

  • Spezifikation fรผr das Modul
  • Der Quellcode des Moduls

Analysieren Sie die Logik des Moduls mithilfe einer oder mehrerer der folgenden Methoden: weiรŸe Kiste Methoden anwenden und diese Testfรคlle anschlieรŸend durch die Anwendung ergรคnzen. Flugschreiber Methoden zur Modulspezifikation. Realistische Werte sind ebenso wichtig wie die gewรคhlten Pfade, also bereiten Sie die Testdaten parallel zu den Fรคllen und nicht im Nachhinein.

Sobald die Testfรคlle entworfen sind, besteht der nรคchste Schritt darin, die Module fรผr die Tests zu kombinieren. Die verwendete Methode ist entweder eine inkremental oder die nicht-inkrementell Methode.

  • Nichtinkrementelles Verfahren โ€” Alle Module werden einzeln getestet. Zuerst werden alle Module kombiniert und dann das gesamte Programm getestet.
  • Inkrementelle Methode โ€” Jedes Modul wird zunรคchst getestet und dann schrittweise der Testsammlung hinzugefรผgt. Es wird ein schrittweiser Wiederholungstest durchgefรผhrt.
  • Beim inkrementellen Testen gibt es zwei Ansรคtze. von oben nach unten und von unten nach oben Testen.
  • Um das Modul mit den ausgewรคhlten Daten auszufรผhren, wird ein Treiber benรถtigt, der die Testdaten bereitstellt, die Ausfรผhrung รผberwacht und die Ergebnisse erfasst.

Die Wahl zwischen den beiden Methoden ist ein Kompromiss zwischen Einrichtungsaufwand und Diagnostizierbarkeit.

Aspekt Inkrementelle Methode Nichtinkrementelles Verfahren
Kombination Ein Modul nach dem anderen, hinzugefรผgt zu einer getesteten Sammlung Alle Module kombiniert und anschlieรŸend gemeinsam getestet
Gerรผst erforderlich Mehr Fahrer und Stubs, schrittweise geschrieben Weniger Test-Doubles, da reale Module vorhanden sind
Fehleranalyse Stark โ€“ ein Fehlerpunkt liegt an dem gerade hinzugefรผgten Modul. Schwach โ€“ ein Fehler kann รผberall auftreten
am besten geeignet fรผr GroรŸe Systeme mit vielen interagierenden Modulen Kleine Programme mit wenigen Modulen und geringer Kopplung

Treiber und Stubs im Modultest

Der oben erwรคhnte Treiber ist die eine Hรคlfte eines Paares. Da sich ein zu testendes Modul selten am Anfang oder Ende der Aufrufkette befindet, ersetzen Tester fehlenden Code auf beiden Seiten durch Dummy-Code.

  • LED Treiber โ€” ersetzt das aufrufende Modul รผber dem zu testenden Modul. Es liefert die Testdaten, ruft das Modul auf, รผberwacht die Ausfรผhrung und erfasst die Ergebnisse. Bottom-up-Tests sind von Treibern abhรคngig, da die unteren Module vor den hรถheren bereit sind.
  • Stummel โ€” ersetzt ein aufgerufenes Modul unterhalb des zu testenden Moduls. Es nimmt den Aufruf entgegen und gibt eine festgelegte, bekannte Antwort zurรผck, damit das zu testende Modul seinen Ablauf abschlieรŸen kann. Top-Down-Tests sind auf Stubs angewiesen, da die รผbergeordneten Module zuerst bereit sind.

Ein ausgearbeitetes Beispiel verdeutlicht die Zuordnung. Wenn ein Modul zur Zahlungsberechnung fertig ist, die zugehรถrige Checkout-Seite aber noch nicht, รผbergibt ein Treiber dem Modul die Bestellsummen und protokolliert die Rรผckgabewerte. Ist der vom Modul aufgerufene Steuerabfragedienst ebenfalls noch nicht fertig, gibt ein Stub einen festen Steuersatz zurรผck, damit die Berechnung trotzdem ausgefรผhrt werden kann. Beide Gerรผstbausteine โ€‹โ€‹werden nicht mitgeliefert; sie werden verworfen, sobald die eigentlichen Module verfรผgbar sind. Daher wird das Missverstรคndnis von Test-Doubles spรคter als wiederkehrende Herausforderung aufgefรผhrt.

Beispieltipps fรผr Modultests

Hier sind ein paar Tipps, die Sie vor dem Testen von Modulen beachten sollten.

  • RevSehen Sie sich die Testfรคlle an, bevor Sie sie verwenden.
  • Vermeiden Sie Verwirrung รผber die Ursache von Abweichungen.
  • Nutzen Sie automatisierte Testwerkzeuge.
  • Untersuchen Sie die Variablen, die unverรคndert bleiben sollten.
  • Um Selbsttests zu vermeiden, sollten die Module zwischen den Testern getauscht werden.
  • Die Testfรคlle wiederverwenden.

Der fรผnfte Tipp ist wichtiger, als seine Kรผrze vermuten lรคsst. Ein Entwickler, der nur das gerade geschriebene Modul testet, wiederholt dieselben Annahmen, die den Fehler verursacht haben. Daher ist der Austausch von Modulen zwischen verschiedenen Personen eine der kostengรผnstigsten Mรถglichkeiten zur Qualitรคtsverbesserung.

Unit-Tests vs. Modultests

Die beiden Begriffe werden in vielen Teams synonym verwendet, doch Urheberschaft und Geltungsbereich unterscheiden sich.

Modultests Unit Tests
Modultests sind eine Sammlung von Tests, die von einem Tester geschrieben werden, nachdem ein Entwickler Code geschrieben hat Unit-Tests sind eine Sammlung von Tests, die von einem Entwickler wรคhrend des Softwareentwicklungsprozesses geschrieben wurden.
Modultests kรถnnen die Kombination der Unit-Tests umfassen. Komponententests kรถnnen Komponenten isoliert testen

Modultests vs. Komponententests vs. Integrationstests

Die Modulprรผfung liegt zudem neben zwei benachbarten Ebenen, die leicht mit ihr verwechselt werden kรถnnen. Die Tabelle unterscheidet sie danach, was geprรผft wird und wer die Prรผfung รผblicherweise durchfรผhrt.

Aspekt Modulprรผfung Bauteilprรผfung Integrationstests
Im Test Ein Unterprogramm, eine Klasse oder ein Verfahren Eine in sich geschlossene Komponente mit ihren unmittelbaren Abhรคngigkeiten Die Schnittstellen zwischen kombinierten Modulen
รœblicher Eigentรผmer Tester, nachdem der Code geschrieben wurde Tester Integrationstester
Gerรผst Treiber und Stubs Platzhalter fรผr externe Abhรคngigkeiten Immer weniger Testdoubles
Defekt aufgedeckt Logikfehler im Modul Verhaltensfehler in der Komponente Schnittstellen- und Datenรผbergabefehler

Im alltรคglichen Gebrauch Komponententests und Modultests werden hรคufig als ein und dieselbe Aktivitรคt behandelt, Integrationstests beginnt erst, wenn jedes einzelne Modul nacheinander erfolgreich abgeschlossen wurde.

Herausforderungen beim Modultesten

Dies sind die Herausforderungen, denen Teams am hรคufigsten begegnen, wenn Modultests eingefรผhrt werden.

  • Nicht-inkrementelle Tests erfordern mehr Arbeit โ€” Wenn man zuerst alles kombiniert, bedeutet das, dass ein einziger Fehler dazu fรผhren kann, dass die Tester das gesamte Programm erneut durchlaufen mรผssen.
  • Missverstรคndnisse beim Test verdoppeln โ€” Ein Stub, der einen unrealistischen Wert zurรผckgibt, erzeugt einen grรผnen Lauf, der nichts beweist.
  • Debugging-Tests oft โ€” Gerรผstcode birgt seine eigenen Mรคngel, und Zeit, die mit der Behebung eines Treiberfehlers verbracht wird, ist Zeit, die nicht mit dem Testen des Moduls verbracht werden kann.
  • Muss den Code verstehen โ€” Die Ausrichtung nach dem White-Box-Prinzip bedeutet, dass ein Tester, der das Modul nicht lesen kann, auch keine sinnvollen Testfรคlle dafรผr entwerfen kann.

Hรคufig gestellte Fragen

Die xUnit-Familie deckt die meisten Sprachen ab. Mocking-Bibliotheken liefern die Stubs, und ein Coverage-Tool zeigt an, welche Pfade erreicht wurden. Die Wahl der Sprache richtet sich nach der Sprache des Moduls, nicht nach dem Testniveau.

Ein Modell liest den Modulquellcode, zรคhlt die Zweige auf und schlรคgt fรผr jeden Zweig einen Fall vor, einschlieรŸlich Grenzwerten, die bei einem manuellen Durchlauf oft รผbersehen werden. RevEin Blick bleibt notwendig, da generierte Fรคlle aussagen, was der Code tut, anstatt das, was die Spezifikation vorschreibt.

Ja, und beim Scaffolding leisten solche Assistenten ihre besten Dienste, da ein Treiber oder Stub repetitiver Code mit bekannter Struktur ist. Die zurรผckgegebenen Werte erfordern jedoch weiterhin eine menschliche Entscheidung, denn ein plausibel aussehender Stub kann genau den Fehler verschleiern, nach dem gesucht wird.

Es genรผgt, dass jeder Zweig und jede Grenze im Modul mindestens einmal durchlaufen wurde. Ein prozentuales Ziel allein ist irrefรผhrend, da selbst bei hoher Anweisungsabdeckung ganze Entscheidungskonstellationen ungetestet bleiben kรถnnen.

Dies ist die erste Teststufe, die nach der Kompilierung eines Moduls und vor der gemeinsamen Ausfรผhrung seiner Schnittstellen auf den ausgelieferten Code angewendet wird. Aus diesem Grund erreichen hier erkannte Fehler niemals die Integrations- oder Systemphase.

Folgen Sie dem vorhandenen Code. Top-Down eignet sich fรผr Projekte, bei denen die Steuerlogik zuerst geschrieben und die unteren Module anschlieรŸend mit Platzhaltern versehen werden; Bottom-Up eignet sich fรผr Projekte, bei denen die Hilfsmodule zuerst implementiert und von den Treibern aufgerufen werden.

Das Modul lรคsst sich problemlos kompilieren, seine Spezifikation ist verfรผgbar, seine Abhรคngigkeiten sind entweder vorhanden oder als Platzhalter implementiert, und die Testdaten sind bereit. Beginnt man ohne Spezifikation, reduziert sich die รœbung auf eine Beschreibung des Codes.

Tests kรถnnen niemals beweisen, dass ein Modul fehlerfrei ist, sondern nur, dass es die getesteten Fรคlle รผberstanden hat. Daher liefern Tests, die darauf abzielen, das Modul zum Absturz zu bringen, mehr Informationen als Tests, die voraussichtlich erfolgreich verlaufen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: