Wie kann man SAP ABAP Unit-Tests generieren?

Der Einsatz von automatisierten Quellcode- und Modultests bildet die Grundlage moderner Software-Entwicklung. In SAP Netweaver können wie in anderen Entwicklungsumgebungen ABAP OO  Unit-Tests implementiert und eingesetzt werden. Diese Modultests können anhand zwei verschiedener Klassentypen ausgeprägt werden, globale und lokale Test-Klassen.

Je nach Bedarf kann beispielsweise eine  globale Klasse abstrakt implementiert werden. Dies bedeutet diese Klasse kann als Schema für andere Klassen dienen, denn sie enthält mindestens eine Methode die nur als Signatur (kein Methoden-Rumpf) implementiert ist. Die zweite Methode Testklassen in ABAP  zu implementieren stellen lokale Klassen dar. Diese können einerseits nach dem Schema einer globalen Klasse implementiert werden und dieser erben oder anderseits allein als lokale Klasse stehen. Durch die Vererbung von einer globalen Klasse können Methoden, Konstanten und andere Komponenten in der globalen Klasse definiert und an alle entsprechenden lokalen Klassen vererbt werden.

In dem folgenden Beispiel wird der SAP Testklassengenerator der Workbench genutzt um zu einer produktiven Klasse mit ein paar Beispielmethoden eine entsprechende Unit-Testklasse zu erzeugen.
Wir gehen von einer Klasse mit folgender Struktur aus:

Methoden-Übersicht der Klassen

Methoden-Übersicht der Klassen

Die aufgeführten Methoden sind in diesem Beispiel nicht ausgeprägt, lediglich definiert. Dieser Umstand führt dazu, dass der SAP Testklassengenerator keine Rückgabewerte der Methoden erkennt und somit auch keine entsprechende Prüfung hierzu generiert.
Nun wird aufgrund dieser Struktur die Testklasse generiert. Hierzu die Klasse in den Bearbeitungsmodus versetzen, anschließend unter „Hilfsmittel“ > „Testklassengenerierung“ den Generator aufrufen:

Testklassengenerierung 1

Testklassengenerierung 1

Nun erhält man die Übersicht der Methoden zu denen ein Unit-Test erzeugt werden kann:

Testklassengenerierung 2
Testklassengenerierung 2

Mit den aufgeführten Optionen „Methodenaufrufe generieren“ und „‘Assert Equal‘ generieren“ kann dem Tester auch die Erstellung der einzelnen Assert-Anweisungen abgenommen werden. Methoden die entsprechende Rückgabeparameter liefern, wird auf diese Weise für jeden einzelnen Parameter eine „Assert Equals“-Anweisung erzeugt. Mit diesen Assert-Anweisungen können die Erwartungswerte der einzelnen Parameter mit dem aktuellen Rückgabewert verglichen werden. Die „Equals“-Anweisung geht von Übereinstimmung von Erwartungs- und Rückgabewert aus. Sollte diese Überprüfung fehlschlagen, wird die in der „Assert-Equals“-Anweisung definierte Nachricht (MSG) ausgegeben.

Hier ein Beispiel einer solchen Ergebniswertüberprüfung:

 cl_aunit_assert=>assert_equals(
    act = ls_beleg-vorgaenger_beleg_id
    exp = '0001000199'
    msg = 'Der Test zum Suchen aller verwandten Belege schlug fehl!'
 ).

„Act“ entspricht dem Rückgabeparameter (Actual), „Exp“ stellt den Erwartungswert dar und „MSG“ beinhaltet die Meldung, die im Fehlerfall ausgegeben werden soll.

Wir wollen die benötigten Methodenaufrufe und entsprechende Assert-Anweisungen für alle Methoden generieren lassen. Hierfür wählen wir alle entsprechenden Optionen aus:

Testklassengenerierung 3

Testklassengenerierung 3

Der Generator erzeugt eine komplette Klasse mit den gewünschten Methoden. Zusätzlich zu den durch den Nutzerdefinierte Methoden werden auch noch eine Setup- und eine Teardown-Methode erzeugt.

Testklassengenerierung 4

Testklassengenerierung 4

In der Setup-Methode können für die lokale Klasse beispielsweise Initialwerte gesetzt, Datenbankeinträge gelesen / gesetzt und andere Aufgaben durchgeführt werden, die für die Teststellung notwendig sind.  Die Teardown-Methode „räumt“ hinter dem Tester  auf, sie kann beispielsweise zur Datenbankbereinigung, oder Speicherfreigabe  genutzt werden.

Testklassengenerierung 5

Testklassengenerierung 5

In der Setup-Methode kann (muss aber nicht) die komplette Testklasse instanziiert werden. Die reinen Unit-Testmethoden werden selbstverständlich auch erzeugt:

Testklassengenerierung 6

Testklassengenerierung 6

Aufgrund der fehlenden Ausprägung mit Rückgabewerten in den Beispielmethoden wurden hier kein „Assert“-Anweisungen mit erzeugt, lediglich ein Aufruf der Methode wurde generiert. Diese lokalen Klassen können wir eingangs erwähnt von globalen Testklassen erben und diese einbinden. Für einfache Methodentests ist dies jedoch nicht notwendig.

Comments are closed.