Im dritten Blogbeitrag der Reihe Unit-Tests zeigen unsere Entwickler Max und Basti anhand eines Beispiel-Tutorials die Implementierung von Unit-Tests. Dabei verwenden sie die Entwicklungsumgebung Eclipse und verfolgen den Ansatz des Test-Driven-Developments. 

Der erste Schritt, um Unit-Tests in ABAP zu implementieren, ist das Anlegen einer Globalen Klasse. Hier implementieren wir später die Logik. Anschließend wird zu dieser Klasse eine Testklasse angelegt. Dort müssen die einzelnen Unit-Tests in Form von Methoden implementiert werden, um die Logik zu testen. In diesem Tutorial nutzen wir dafür Eclipse, da es vieles vereinfacht und sehr gute Funktionen zur Erstellung von Unit-Tests bietet. Außerdem schreiben wir in diesem Tutorial test-driven. Das bedeutet, dass wir den Test vor der Logik schreiben.

  1. Das erklären wir am besten an einer Beispielaufgabe:

Die Aufgabe lautet, wie folgt: Erstellen Sie eine Klasse mit einer Methode, die überprüft, welche Art von Verfügbarkeitsprüfung anfällt, wenn folgender Eingabeparameter einen vordefinierten Wert erfüllt (Im „realen“ Fall sind es sicherlich mehr Eingabeparameter, für dieses Tutorial kürzen wir das aber etwas ab, um erstmals ein Grundverständnis für Unit Tests zu erlangen):

  • MTART

Mögliche Eingabewerte sind:

  • Für MTART:
    • HALB
    • FERT
    • PROD

Mögliche Rückgabeparameter:

  • Ergebnis:
    • N : Keine Prüfung
    • V : Vollständige Prüfung
    • S : Schnelle Prüfung

Verhalten:

Sofern nichts anderes durch die Methode ermittelt wird, soll immer eine schnelle Prüfung durchgeführt werden. Im Falle, dass etwas anderes ermittelt wird, gelten folgende Regeln:

  • MTART PROD = Vollständige Prüfung (V)
  • MTART HALB = Vollständige Prüfung (V)
  • MTART FERT = Keine Prüfung (N)
    # Implementierung ## 1. Anlegen einer Globalen Klasse in Eclipse ![Neue Klasse anlegen](./assets/gif/new-class.gif)

Diese Klasse bleibt erst einmal leer. Wir implementieren die Logik zu einem späteren Zeitpunkt.

  1. Anlegen der Testklasse

test-class

Um eine Testklasse anzulegen nutzen wir die Registerkarte „Test Classes“.

test-template 1 How to Unittest

Nach der Eingabe von test wird von Eclipse ein Template zur Implementierung einer Testklasse angezeigt.

  1. Implementieren der ersten Test-Methode

Implementieren der ersten Testmethode

An dieser Stelle werden wir jetzt unsere erste Testmethode schreiben. Erst danach implementieren wir die dazugehörige Logik in die eigentliche Methode. Nach der Regel MTART = HALB sollte das Ergebnis „V“ sein, deshalb sollte darauf geachtet werden auch nur diese zu testen. Jegliche Logik gehört nicht in die Testmethode.

Um einen einfachen Unit-Test zu implementieren, benötigen wir die Klasse cl_abap_unit_assert und in diesem Fall dessen Methode assert_equals.
Mithilfe dieser Methode können wir den Rückgabewert der getesteten Methode auf einen von uns vordefinierten Wert prüfen und unseren Unit-Test durchführen.

An dieser Stelle legen wir auch schon die eigentliche Methode an, in die wir im weiteren Verlauf des Tutorials die Logik implementieren werden. Wir nennen diese Methode check_all und definieren direkt die Eingabeparameter sowie einen Rückgabeparameter.

Eingabeparameter:

  • iv_mtart type mtart

Rückgabeparameter:

  • r_result type string

Die Testmethode sollte dann folgendermaßen aussehen:

Testmethode How to Unittest
  1. Der erste Test

Wir sind soweit und können nun den ersten Test durchführen. Dazu verwenden wir in Eclipse die Tastenkombination STRG + SHIFT + F10. Die Testmethode wird an dieser Stelle jedoch leider noch nicht erfolgreich sein, da noch nichts in die getestete Globale Klasse implementiert wurde. Dennoch führen wir den Test zur besseren Veranschaulichung des Beispiels durch:

passed test how to unittest

Im Failure Trace lässt sich jetzt gut ablesen, was als Testergebnis erwartet wurde und was die überprüfte Methode tatsächlich zurückgibt:

passed test how to unittest
  1. Fehlerbehebung

Wie wir in Abschnitt 4 bereits festgestellt haben, ist unser Test fehlgeschlagen. Also ergreifen wir die Gelegenheit: Let’s fix the BUG!
Es geht also zur ersten Logik unserer eigentlichen Klasse, die wir unten in der Registerkarte Global Class wiederfinden.

In Schritt 3 haben wir hier schon die Methode check_all angelegt. In diese implementieren wir nun unsere Logik, um den Test zu bestehen:

passed test how to unittest

Ein paar Zeilen Code und der Test sollte bestanden sein:

passed test how to unittest

Prinzipiell ist es wichtig zu beachten, dass der Test die gesamte Methode abdeckt (100 % Testabdeckung). Das wird in Eclipse gut ersichtlich durch die farblichen Markierungen des Codes.
Auf dieser Basis kann man jetzt arbeiten und weitere Tests für MTART PROD und MTART FERT implementieren, bis sich eine Logik in der Globalen Klasse entwickelt.

Max & Basti