Halte_Deinen Code mit ABAP Unit Test Framework in Eclipse sauber

HALTE DEINEN CODE MIT DEM ABAP UNIT TEST FRAMEWORK IN ECLIPSE SAUBER – EIN PRAKTISCHES BEISPIEL

Unser heutiger Artikel ist der zweite aus einer zweiteiligen Serie, die sich mit der Nutzung des ABAP Unit Frameworks in Eclipse befasst. Der erste theoretische Teil bietet Dir das notwendige Know-how, um Unit Test Cases für Deinen Code zu erstellen.  In diesem zweiten Teil werden wir Dir das genaue Vorgehen in einem praktischen Beispiel demonstrieren.

Das praktische Beispiel

Nehmen wir als Beispiel eine globale Klasse eines Taschenrechners, die die vier grundlegenden mathematischen Operationen definiert: Addition, Subtraktion, Multiplikation und Division. Dies wird unsere Codebasis sein, für die wir die Unit-Testing-Technik innerhalb der Eclipse-Plattform anwenden werden.

Eclipse verfügt zwar nicht über einen Assistenten zum Erstellen automatisierter Komponententests, aber es enthält einige Vorlagen, die du verwenden kannst. In Anbetracht der Tatsache, dass du vielleicht neu in diesem Bereich bist, ist es viel besser, zuerst Tests von Hand zu schreiben. Also warte nicht mehr auf den richtigen Moment, sondern öffne deine Eclipse-IDE, wechsle in die ABAP-Perspektive und erstelle eine ABAP-Class mit folgendem Quellcode:

creating an ABAP-Class in eclipse

Abbildung 1: Erstellung einer ABAP-Class

Creating an ABAP-Class in Eclipse

Abbildung 2: Erstellung einer ABAP-Class (Fortsetzung)

Intuitiv ist die kleinste Komponente des Codes, die hier getestet werden kann, eine Methode und das wird auch unsere „Unit“ sein. Zum Beispiel werden wir die Methode „divide“ als Testmethode nehmen und verschiedene Fälle und Ausnahmen dafür behandeln.

Wie im theoretischen Teil dargestellt, besteht der erste Schritt bei der Definition der Testfälle darin, eine Testklasse anzulegen. Wähle dazu unten in der Editoransicht die Registerkarte „Test Classes (non existent)„.

first step in defining the test cases

In dem neuen Fenster, das auf dem Bildschirm erscheint, drücke die Schaltfläche „Create Test Classes…“ und eine Editorseite wird im geänderten Modus angezeigt. Du bist nun bereit, mit der Programmierung deiner Testklasse zu beginnen.

start coding a test class

Abbildung 3: Anlage einer Testklasse

Wenn du dir überlegst, welche Fälle abgedeckt werden sollen, solltest du verschiedene Kategorien von Eingangswerten berücksichtigen, die getestet werden müssen: positive Fälle, negative Fälle, Grenzwerte oder Kombinationen von Eingangswerten. Auf jeden Fall wird jeder Fall in einer separaten Testmethode behandelt. Die beste Vorgehensweise besteht darin, mit den einfachsten Szenarien zu beginnen und dann weiterhin komplexere Werte hinzuzufügen, die getestet werden sollen.

Für die Ausführung der Testmethoden können wir die Tastenkombinationen STRG + SHIFT + F10 verwenden oder wir wählen die Dropdown-Taste „Run as“ und wählen die Option „ABAP Unit Test“ aus der Liste. Der Status und die Dauer jedes Testfalls werden in der Ansicht „ABAP Unit“ angezeigt.

Im Falle eines Fehlers weist die fehlgeschlagene Testmethode ein anderes Symbol auf, das leicht zu erkennen ist, und – was noch wichtiger ist – die Fehlermeldungen werden dem Abschnitt „Failure trace“ hinzugefügt. Wenn wir auf den Pfad unter dem Knoten „Stack“ doppelklicken, zeigt er uns direkt den Codeblock, der tatsächlich falsch gelaufen ist. Unit-Tests ermöglichen Änderungen, und das macht unsere Tests sicher.

Abbildung 4: Fehlermeldung

Nach den notwendigen Anpassungen des Codes müssen wir nur noch einmal die Tests durchführen und prüfen, ob sich ihr Status geändert hat und tatsächlich keine Fehler mehr vorliegen.

failure coding test class abap

Abbildung 5: Statusprüfung der erneut durchgeführten Tests

Fügen wir also noch ein paar Testfälle hinzu und behandeln auch eine Ausnahme von der Funktiondivide„, der bekannten Division durch Null. Anschließend sollte unsere Testklasse wie folgt aussehen:

exception divide function coding ABAP

Abbildung 6: Ausnahme von der Funktion „divide„

abap codinng exception divide function

Abbildung 7: Ausnahme von der Funktion „divide„ (Fortsetzung)

ABAP coding divide function exception

Abbildung 8: Division durch Null

Bitte beachte, dass Tests in unbestimmter Reihenfolge und nicht in der Reihenfolge durchgeführt werden, in der sie in der Testklasse definiert wurden:

tests executed in an indefinite sequence ABAP

Abbildung 9: Unbestimmte Durchführung der Tests

Zu Lernzwecken und um das ABAP Unit Test Framework in Eclipse besser zu verstehen, solltest du dir nun noch einige eigene Testfälle erstellen.

Wie auch immer, wir sind noch nicht am Ende. Unser Testcode ist funktionsfähig, aber ist er sauber und optimiert?

Mit anderen Worten, nachdem alle Tests grün sind, sind wir nun bereit, einiges an Refactoring auf den Code anzuwenden. Andererseits, was ist Refactoring?

Refactoring ist der Prozess der Veränderung und Verbesserung der internen Struktur des bestehenden Codes durch Reduzierung der Komplexität, ohne das externe Verhalten zu verändern. Auf diese Weise werden die nächsten Tests schneller umzusetzen sein, aufgrund der Wiederverwendbarkeit und Lesbarkeit des Codes.

Darüber hinaus werden wir die speziellen Methoden des Unit-Frameworks nutzen und mit der „SETUP“-Methode den in unseren Testmethoden definierten „gegebenen“ Teil implementieren. Diese Methode wird vor jedem Testfall ausgeführt und dient letztlich dazu, auf den zu testenden Code zu verweisen. In Anbetracht der Überlegung, dass das Schreiben von Tests effizient sein sollte, sollten wir auch „Hilfsmethodenverwenden, um den Testcode lesbar, sauber und klein zu halten.

Alles in allem hat die Testklasse nach dem Refactoring folgendes Design:

 

refactoring a test class abap

Abbildung 10: Design der Testklasse

Abbildung 11: Design der Testklasse (Fortsetzung)

Unsere Testklasse hat nun eine bessere Code-Struktur, Effizienz, Übersichtlichkeit und Qualität. Zeit für einen Schluck Kaffee.

Du denkst, es ist unrealistisch, dass dein Produktcode und deine Tests gleichzeitig fertig sind? Ist es nicht….

Testgetriebene Entwicklung – Test Driven Development (TDE)

Wenn es um Unit Testing geht, ist es jedoch wichtig, die Technik der Testgetriebenen Entwicklung (TDE) zu beachten. Das auch als „Test First„-Verfahren bezeichnete Verfahren bedeutet, mit kleinen Anforderungen zu beginnen und erst einmal die Komponententests zu erstellen. Genauer gesagt, sollten wir das Verhalten der Anwendung, und was sie aus Benutzersicht tun sollte, skizzieren und die kleinen Features in ein Textdokument oder sogar als Kommentare in den Testklassen schreiben, die in der Entwicklung weiter verwendet werden sollen. Diese Anforderungen werden anschließend in konkrete Testfälle umgesetzt.

Mit der TDE-Technik erhälst du immer eine Antwort auf die Frage „Welchen Code soll ich als nächstes schreiben„. So wird beispielsweise jedes neue Merkmal hinzugefügt, indem zunächst ein Test für ein einzelnes Merkmal erstellt wird und nicht für mehrere auf einmal. Die Durchführung dieses Tests zeigt natürlich einen Fehler, der auf das Fehlen oder den Mangel des zu testenden Codes zurückzuführen ist. Zu diesem Zeitpunkt sollte man dann gerade genug Code anpassen, um den fehlgeschlagen Komponententest zu bestehen. Wenn der Test nicht bestanden wird, muss der Code bis dahin angepasst werden.

Da es sich bei dieser Technik um einen Entwicklungszyklus handelt, sollten wir die oben genannten Schritte für alle erforderlichen Funktionalitäten wiederholen, um eine größere Codeabdeckung zu erreichen. Der nächste Test wird den nächsten Schritt vorantreiben, d.h. die Testentwicklung treibt die Featureentwicklung voran. Am Ende des Zykluses, wenn alle Tests grün sind, sind der Produktionscode und der Testcode bereit für das Refactoring. Diese Phase ist von grundlegender Bedeutung, um die Lesbarkeit zu verbessern, Duplikate zu reduzieren und einen sauberen Code zu erhalten. Für weitere Informationen über Unit Testing und Test Driven Development empfehlen wir, sich für den OpenSAP-Kurs „Writing Testable Code for ABAP“ anzumelden, der auch die Grundlage des heutigen Artikels bildet.

Zusammenfassung

Darüber hinaus ist der Unit-Test in der Regel automatisiert. Eclipse bietet ein Unit-Test-Framework, das in das Plugin der ABAP Development Tools eingebettet ist und den Prozess der Definition und Ausführung automatisierter Unit-Tests erleichtert. Komponententests sind einfach, stabil und bieten eine große Codeabdeckung, wenn man ein geeignetes Setup hat. Tests können während des Entwicklungsprozesses erstellt und sogar zusammen mit dem Quellcode transportiert werden. Unit-Tests sind eigenständig und werden in zufälliger Reihenfolge durchgeführt. Achte beim Schreiben von Tests darauf, dass sie nicht über ihre Klassengrenzen hinausgehen und nicht mit anderen Komponenten interagieren sollten. Du solltest nur das Verhalten dieser Klasse oder der kleinen Komponente des zu testenden Codes testen.

Wie du vielleicht schon weisst, bestehen viele typische Softwareprojekte aus mehreren Modulen, die oft von verschiedenen Entwicklern programmiert werden. Die einzelnen Module werden zunächst isoliert getestet, und hier kommt die ABAP Unit zum Einsatz, als erste Stufe des Testens unseres Codes. Nachdem alle diese Einheiten entwickelt und getestet wurden, können wir die „unit tested“-Komponenten bündeln und ihr Verhalten mit der Integrationstechnik testen. Aber darüber unterhalten wir uns ein ander Mal…

Du möchtest noch mehr Wissenswertes aus der SAP Welt erfahren? Wir würden uns sehr freuen, dich wieder auf unserem Inspiricon-Blog zu sehen. Bis dahin kannst du dich gerne mit dem ABAP Unit Framework in Eclipse vertraut machen. Und nicht vergessen…. „Die Wahrheit kann nur an einem Ort gefunden werden: dem Code“. Viel Spaß beim Programmieren! 😊

 

Autor dieses Beitrags
Andra Atanasoaie Associate
Tel.: +49 (0) 7031 714 660 0
E-Mail: cluj@inspiricon.de