In diesem Artikel erfährst Du wie man mit der Programmiersprache ABAP Unit Tests einfach erstellt und damit eine höhere Codequalität gewährleistet. Neben der Programmierung mit ABAP ist das Testen ein zentraler Bestandteil in der Entwicklung und Reife eines ABAP-Programms. Wie man mit ABAP Unit Test einen automatisierten Test entwickelt, wird in den nächsten Abschnitten im Detail beschrieben.
Was ist ein Unit Test?
Ein Unit Test ist ein automatisierter Test einzelner Programmeinheiten. Typischerweise werden damit Methoden und Klassen getestet. Ein Unit Test wird auch als Modultest bezeichnet.
Der Vorteil von Unit Tests ist die Automatisierung. Bei der Erstellung von Unit Tests werden erwartete Ausgaben von Programmeinheiten auf die Richtigkeit getestet. Wenn das erwartete Ergebnis eintritt, so ist der Unit Test erfolgreich. Wenn ein unerwartetes Ergebnis eintritt, deutet das auf einen Fehler in der Programmierung hin.
Sobald man einmal also einen Unit Test entwickelt hat, kann man fehlerhafte Programmänderungen schnell und einfach identifizieren, ohne manuell jede Programmierung noch einmal zu testen.
Durch Unit Tests werden also individuelle Komponenten in einer Isolation getestet.
Eine Methode einer Testklasse kann somit als Beispiel folgendermaßen aussehen:
METHOD sum_2_numbers. DATA: lv_result TYPE int8_lew. CALL METHOD f_cut->sum_2_numbers EXPORTING i_number_1 = 15 i_number_2 = 3 IMPORTING e_result = lv_result. cl_abap_unit_assert=>assert_equals( act = lv_result exp = 18 ). ENDMETHOD.
In diesem Beispiel wird eine Methode getestet, die zwei Zahlen addiert. Das Resultat als Ergebnis wird mit einem erwarteten Wert verglichen.
Was ist eine ABAP Unit Testklasse?
Für einen ABAP Unit Test benötigt man eine ABAP Unit Testklasse. Eine Testklasse testet die Methoden einer anderen ABAP-Klasse.
Eine ABAP-Testklasse erkennt man bei der Definition an dem Zusatz „FOR TESTING„. Zusätzlich hinaus wird Dauerart und die Risikostufe angegeben.
Die eigentlichen ABAP Unit Tests werden in den Methoden der Testklasse ausgeführt. Eine Testklasse kann dabei auch einen Funktionsbaustein testen. Dann muss die Testklasse in einem Include der Funktionsgruppe implementiert werden.
Methoden
Durch den Zusatz „FOR TESTING“ wird die ABAP-Klasse als Testklasse deklariert und verwendet das Unit Test Framework. Dadurch steht der Klasse automatisch folgende Methoden zur Verfügung:
Methode | Beschreibung |
---|---|
CLASS_SETUP | Statische Methode Wird einmal beim Starten des Testlaufs ausgeführt |
SETUP | Instanzmethode Wird beim Aufruf jeder Testmethode ausgeführt |
CLASS_TEARDOWN | Statische Methode Wird einmal beim Beenden des Testlaufs ausgeführt |
TEARDOWN | Instanzmethode Wird beim Beenden jeder Testmethode ausgeführt |
Wenn die Methoden verwendet werden sollen, müssen diese natürlich in der Klassendefinition deklariert werden. Diese Methoden müssen dabei nicht implementiert werden.
Beispiel einer ABAP-Testklasse
In diesem Beispiel möchten wir eine ABAP-Testklasse für eine einfache ABAP-Klasse erstellen. Neben einer Getter- und einer Setter-Methode besitzt diese Klasse eine Methode sum_2_numbers, die zwei Zahlen addiert und das Ergebnis zurückgibt.
METHOD sum_2_numbers. e_result = i_number_1 + i_number_2. ENDMETHOD.
Diese Methode kann nun einfach mit einer ABAP-Testklasse getestet werden. Die Definition und Implementierung der ABAP-Testklasse könnte folgendermaßen aussehen:
*---------------------------------------------------------------------- * Definition zcl_erp_up_test *---------------------------------------------------------------------- CLASS zcl_erp_up_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS . PRIVATE SECTION. DATA: f_cut TYPE REF TO zcl_erp_up. "class under test METHODS: setup, sum_2_numbers FOR TESTING. ENDCLASS. "zcl_Erp_Up_Test *---------------------------------------------------------------------- * Implementation zcl_erp_up_test *---------------------------------------------------------------------- CLASS zcl_erp_up_test IMPLEMENTATION. METHOD setup. f_cut = NEW zcl_erp_up( ). ENDMETHOD. METHOD sum_2_numbers. DATA: lv_result TYPE int8_lew. CALL METHOD f_cut->sum_2_numbers EXPORTING i_number_1 = 15 i_number_2 = 3 IMPORTING e_result = lv_result. cl_abap_unit_assert=>assert_equals( act = lv_result exp = 18 ). ENDMETHOD. ENDCLASS.
In diesem Beispiel wird die Methode sum_2_numbers mit den Eingabewerten 15 und 3 getestet. Der Rückgabewert soll 18 sein.
ABAP-Testklasse anlegen
Es gibt zwei einfache Möglichkeiten, eine ABAP-Testklasse in der ABAP-Workbench (Transaktion SE80) bzw. Class Builder (SE24) anzulegen:
- Testklassengenerierung / Wizard
- Manuell Testklasse anlegen
Testklassengenerierung / Wizard
Die einfachste und schnellste Möglichkeit, eine Testklasse anzulegen, ist mit dem Wizard. Die Testklassengenerierung wird über das Kontextmenü aufgerufen. Hierfür klickt man mit der rechten Maustaste im Objektbaum auf seine zu testende Klasse und wählt „Anlegen > Testklasse generieren“.
![Die einfachste und schnellste Möglichkeit, eine Testklasse anzulegen, ist der Wizard. Die Testklassengenerierung wird über das Kontextmenü aufgerufen. Hierfür klickt man mit der rechten Maustaste im Objektbaum auf seine zu testende Klasse und wählt "Anlegen > Testklasse generieren".](https://erp-up.de/wp-content/uploads/2021/05/Testklasse_generieren_SE80.jpg)
Anschließend öffnet sich ein Fenster, das einen nun Stück für Stück durch die Anlage einer ABAP-Testklasse führt. Die erste Option „Start“ kann man mit dem Weiter-Button bestätigen. Anschließend landet man in der Klassenauswahl. Hier gibt man seine globale oder lokale Klasse an. Dadurch, dass man über die zu testende Klasse den Wizard aufgerufen hat, ist dieser Klassenname schon vorausgefüllt.
![Anschließend öffnet sich ein Fenster, das einen nun Stück für Stück durch die Anlage einer ABAP-Testklasse führt. Die erste Option "Start" kann man mit dem Weiter-Button bestätigen. Anschließend landet man in der Klassenauswahl. Hier gibt man seine globale oder lokale Klasse an. Dadurch, dass man über die zu testende Klasse den Wizard aufgerufen hat, ist dieser Klassenname schon vorausgefüllt.](https://erp-up.de/wp-content/uploads/2021/05/Testklasse_generieren_SE80_Klassenauswahl.jpg)
Nachdem man erneut auf den Weiter-Button gedrückt hat, drückt man auf den Anlegen-Button, gibt seinen Testklassennamen an und wählt die Dauerart und Risikostufe. Bei Bedarf kann eine Oberklasse noch angegeben werden. Achte auf die Namenskonvention, um im Team eine einheitliche ABAP-Programmierung zu gewährleisten.
![Nachdem man erneut auf den Weiter-Button gedrückt hat, drückt man auf den Anlegen-Button, gibt seinen Testklassennamen an und wählt die Dauerart und Risikostufe. Bei Bedarf kann eine Oberklasse noch angegeben werden.](https://erp-up.de/wp-content/uploads/2021/05/Testklasse_generieren_SE80_Testklassenauswahl.jpg)
Als letzte Tätigkeit wählt man die zu testenden Methoden aus. Hier kann man mehrere Methoden auswählen, wodurch automatisch eine Testmethode dafür erstellt wird.
![Als letzte Tätigkeit wählt man die zu testenden Methoden aus. Hier kann man mehrere Methoden auswählen, wodurch automatisch eine Testmethode dafür erstellt wird.](https://erp-up.de/wp-content/uploads/2021/05/Testklasse_generieren_SE80_Methodenauswahl.jpg)
Abschließend bestätigt man die Zusammenfassung und schließt die Testklassengenerierung ab. Sofort wird der ABAP-Code gemäß angegebenen Optionen generiert.
Manuell Testklasse anlegen
Manuell kann man ebenfalls leicht eine ABAP-Testklasse für einen ABAP Unit Test programmieren. Hierfür wählt man im Objektbaum in der ABAP-Workbench „Anlegen > Klassenbibliothek > Klasse“ bzw. in der Kategorie Klasse „Anlegen > Klasse“. Daraufhin kann man im Fenster die Option „Testklasse (ABAP Unit)“ auswählen und auf den Sichern-Button klicken.
![Manuell kann man ebenfalls leicht eine ABAP-Testklasse für einen ABAP Unit Test programmieren. Hierfür wählt man im Objektbaum in der ABAP-Workbench "Anlegen > Klassenbibliothek > Klasse" bzw. in der Kategorie Klasse "Anlegen > Klasse". Daraufhin kann man im Fenster die Option "Testklasse (ABAP Unit)" auswählen und auf den Sichern-Button klicken.](https://erp-up.de/wp-content/uploads/2021/05/Testklasse_anlegen.jpg)
Anschließend kann man genauso die Definition und Implementierung angeben wie es der Wizard für einen abnimmt.
Ich persönlich empfehle die Anlage einer Testklasse über den Wizard, da einem hier viel Schreibarbeit abgenommen wird.
ASSERT_EQUALS – Vergleiche in ABAP Unit Tests
In Testmethoden vergleicht man das tatsächliche Ergebnis mit dem erwarteten Ergebnis. Die notwendige und sehr nützliche Klasse für Vergleiche ist: cl_abap_unit_assert.
Diese Klasse enthält unter anderem die Methode assert_equals, um diese Vergleiche umzusetzen. Neben der wichtigen assert_equals-Methode gibt es noch weitere nützliche Methoden für ABAP Unit Tests.
![Diese Klasse enthält unter anderem die Methode assert_equals, um diese Vergleiche umzusetzen. Neben der wichtigen assert_equals-Methode gibt es noch weitere nützliche Methoden für ABAP Unit Tests.](https://erp-up.de/wp-content/uploads/2021/05/cl_abap_unit_assert.jpg)
In der Testmethode verwendet man solche assert-Methoden, um die Ausgabe der Unit Tests auswerten zu können.
ABAP Unit Test auswerten
Die wichtigste Funktion der ABAP Unit Tests ist die automatisierte Auswertung. Einen ABAP Unit Test kann man einfach über das Kontextmenü auswerten bzw. ausführen. Hierfür klickt man mit der rechten Maustaste auf die zu testende Klasse und wählt „Ausführen > Modultest mit > Abdeckungsmessung“ aus.
![Die wichtigste Funktion der ABAP Unit Tests ist die automatisierte Auswertung. Einen ABAP Unit Test kann man einfach über das Kontextmenü auswerten bzw. ausführen. Hierfür klickt man mit der rechten Maustaste auf die zu testende Klasse und wählt "Ausführen > Modultest mit > Abdeckungsmessung" aus.](https://erp-up.de/wp-content/uploads/2021/05/Modultest_mit_Abdeckungsmessung_ausfuehren.jpg)
Anschließend bekommt man die Ergebnisse der ABAP Unit Tests angezeigt. Man kann sich dabei in der Abdeckungsmetrik anzeigen lassen wie viel Prozent man von der Klasse getestet hat.
![Anschließend bekommt man die Ergebnisse der ABAP Unit Tests angezeigt. Man kann sich dabei in der Abdeckungsmetrik anzeigen lassen wie viel Prozent man von der Klasse getestet hat.](https://erp-up.de/wp-content/uploads/2021/05/ABAP_Unit_Ergebnisanzeige.jpg)
Lokale ABAP Testklasse löschen
Eine lokale Testklasse kannst Du nicht über einen Button löschen, sondern Du musst einfach den Quellcode entfernen und dann die Klasse aktivieren.
Kurs für ABAP Unit Testing
Es gibt auf der Lernplattform openSAP den kostenlosen Kurs „Writing Testable Code for ABAP“, der das Thema ABAP Unit Test sehr gut praktisch erläutert. Dabei lernt man anhand von Videos und Praxiseinheiten ABAP Unit Tests im Detail kennen. Diesen Kurs kann ich sehr empfehlen.
Über den Autor
Mein Name ist Andreas Geiger und ich bin ein erfahrener Senior SAP Berater. Mit mehr als 10 Jahren Berufserfahrung habe ich mehrere SAP-Projekte erfolgreich abgeschlossen und umfangreiche Kenntnisse in verschiedenen Bereichen wie SAP FI, SAP MM und ABAP erworben. Nun möchte ich mein Wissen mit Dir teilen, um Dir einen Mehrwert zu bieten und Dich bei Deiner täglichen Arbeit mit dem SAP-System zu unterstützen.
ERP UP unterstützen
Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.