Qualitätssicherung von ABAP-Coding 2. ABAP-Unit-Tests

Um die Qualität von kundeneigenen ABAP-Entwicklungen zu sichern, gibt es viele verschiedene Wege.

Bisher habe ich in der dreiteiligen Blogreihe das ABAP Test Cockpit (ATC) vorgestellt. Dieses ermöglicht eine statische Code-Analyse, allerdings erkennt es keine Programmierfehler. Um diese kümmern sich die im nachfolgenden beschriebenen ABAP-Unit-Tests.

Was sind ABAP-Unit-Tests?

Unit Tests sind kleine Codeschnipsel, welche eine einzelne Einheit (Unit) auf ihre Funktionalität testen sollen.

Aber wozu das Ganze? Ich weiß doch dass mein Code funktioniert…

Die Frage nach dem „Warum“ und ob sich Unit-Tests denn lohnen, kann man mit dem Flugzeugbau vergleichen.

Wenn man ein Flugzeug nur nachdem man es zusammengesetzt hat, testet ohne die einzelnen Komponenten zu testen, wird es vermutlich abstürzen, vermutlich nicht mal starten.

Mit Unit-Tests verhindert man dieses Verhalten. Man stellt sicher, dass die einzelnen Komponenten der Software, die man entwickelt, funktionieren. Daneben bieten Unit-Tests noch weitere Vorteile:

  • Man erkennt Programmierfehler schneller.
  • Erhöhen die Qualität des Codings (Stichwort Clean-Coding).
  • Reduzierung von manuellen Test-Aktivitäten.
  • Regression-Tests werden einfacher.
  • Unit-Tests dienen als Dokumentation.

Wie schreibe ich ABAP-Unit-Tests?

Die Entwicklungsumgebungen für ABAP bieten unterschiedliche Möglichkeiten. In den ABAP Development Tools (ADT) für Eclipse hat man für Klassen folgende Reiter.

Ort zum implementieren in ABAP for Eclipse

Dabei werden die Unit-Tests im Reiter „Test Classes“ einer globalen Klasse geschrieben.

In der SE80 nimmt man den folgenden Pfad:

  1. Springen
  2. Lokale Definitionen / Implementierungen
  3. Lokale Testklassen

Damit kommt man in den generierten Include für die ABAP-Unit Testklassen. Das Entwickeln von Testklassen ist ähnlich dem Programmieren von lokalen Klassen. Es gibt jedoch kleinere Unterschiede.

Definition

Hier ein Beispiel, wie die Definition einer Testklasse aussehen könnte.

Aufbau einer Unit-Test Testklasse

Zusätze

Die Definition der Klasse hat 3 Zusätze bekommen:

  1. „FOR TESTING“: Dieser Zusatz markiert die Klasse als Testklasse und kann somit nur im Rahmen von ABAP-Unit Tests aufgerufen werden.
  2. „DURATION SHORT/MEDIUM/LONG“: Hier wird die Laufzeit der Tests angegeben. Unit Tests sollten immer schnell durchlaufen, da sie häufig aufgerufen werden, daher sollte man immer „SHORT“ verwenden. Falls man aber doch eine längere Laufzeit hat, kann es passieren, dass die Ausführung vom System blockiert wird.
  3. „RISK LEVEL HARMLESS/DANGEROUS/CRITICAL“: Hiermit wird angegeben, welche Auswirkungen die Ausführung des Unit-Tests auf das System haben kann. Im Regelfall sollte immer das Risk Level „HARMLESS“ gewählt werden. Wie auch bei der Dauer, kann das System die Ausführung blockieren, falls das Risk-Level zu hoch angegeben wurde.

Neben der Klasse haben auch die Methoden den Zusatz „FOR TESTING“ erhalten. Jede Methode, welche diesen Zusatz trägt, wird vom ABAP-UNIT-Framework als einzelner Testfall gesehen und daher ausgeführt. Wichtig zu beachten, alle Methoden mit dem „FOR TESTING“-Zusatz werden unabhängig voneinander ausgeführt. Das heißt, dass man die Testklasse möglichst so entwickeln sollte, dass keine Abhängigkeiten zwischen den Methoden existieren.

Fixture Methoden in ABAP-Unit-Tests

Für viele Tests gibt es bestimmte Verhaltensweisen, welche jedes Mal gleich sind.

  1. Erstellen des Objektes, welches getestet werden soll.
  2. Setzen von bestimmten Daten (beispielweise einer Personalnummer).
  3. Etc.

Damit man den Code nicht immer neu schreiben muss, gibt es 4 sogenannte „Fixture Methoden“.

  • SETUP: Eine Instanz-Methode, welche funktioniert wie der CONSTRUCTOR und wird vor jedem Test aufgerufen.
  • CLASS_SETUP: Funktioniert wie der CLASS_CONSTRUCTOR und wird vor dem ersten SETUP aufgerufen.
  • TEARDOWN: Wird nach jedem Test aufgerufen, funktioniert wie eine Art Destruktor.
  • CLASS_TEARDOWN: Wird nach dem letztem Teardown aufgerufen.

Beispiel für Fixture Methoden (Setup)

Angenommen, wir haben in der Klassendefinition noch das Attribut „LV_PERNR“ definiert. Um dies zu initialisieren – ohne Fixture Methoden – müssten wir folgendes tun:

Bad-Practice ABAP-Unit-Tests Methode

Mit Fixture Methoden können wir uns das doppelte Coding sparen uns folgendes machen:

Beispiel setup-Methode

Implementierung von ABAP-Unit-Tests

Es wurde bereits die Implementierung von den speziellen Methoden im ABAP-Unit-Test-Framework behandelt, nun folgt die Implementierung der eigentlichen Testfälle.

Normalerweise werden Test-Methoden in der folgenden Struktur implementiert.

Struktur einer ABAP-Unit-Test Methode

  1. Given: Bereitet den Test vor. Dieser Part kann in einigen Test-Fällen übersprungen werden, da die Vorbereitungen häufig in der Setup-Methode behandelt werden
  2. When: Führt die Methode, welche getestet werden soll, aus und das Ergebnis der Methode wird hier gespeichert
  3. Then: Validierung des Testergebnisses mit dem erwarteten Ergebnis

Beispielimplementierung

Beispielimplementierung einer ABAP-Unit-Tests Methode

In der Struktur „LS_EXP_P0001“ haben wir das erwartete Ergebnis, in diesem Fall eine leere Struktur. Im When-Part lesen wir den Infotyp 0001 vom Objekt „employee_object“, welches in der Setup-Methode initialisiert wurde. Zum Schluss validieren wir das Ergebnis und prüfen, ob es den Erwartungen entspricht. Für die Validierung nehmen wir „ASSERT“-Methoden zur Hilfe.

Validierung

Wie man in der Beispielimplementierung sehen kann, nutzen wir die Klasse CL_ABAP_UNIT_ASSERT und deren Methoden zum Validieren der Testergebnisse.

Damit man nicht nur auf Gleichheit, sondern auch auf andere Zustände oder auf Boolean-Werte prüfen kann, bietet die Klasse noch weitere Assert-Methoden. Die zwei wichtigsten Parameter der Methoden sind „ACT“ für Actual und „EXP“ für Expected. Für einige Methoden wird einer der beiden Parameter vorbelegt. Beispielsweise in „ASSERT_TRUE“ wird der „EXP“-Parameter vorbelegt, da man diese Methode immer verwendet, wenn man den Wert ABAP_TRUE erwartet.

Fazit

ABAP-Unit-Tests sind eine sehr gute Möglichkeit, um die Funktionalität einer Methode oder Klasse sicherzustellen. Hier habe ich nur einen kleinen Einblick über die Möglichkeit, Qualitätssicherung durch ABAP-Unit-Tests zu betreiben gegeben. Man kann und sollte noch einiges darüber hinaus beachten. Eine gute Möglichkeit mehr über ABAP-Unit zu lernen und die Konzepte zu verinnerlichen bietet der Open SAP Kurs: Writing Testable Code for ABAP (englisch).

Qualitätssicherung von ABAP-Coding: SCI & ATC

Ein Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.