This is a test message to test the length of the message box.
Login
ABAP Unit Grundlagen
Erstellt von Software-Heroes

ABAP Unit - Grundlagen

In diesem Artikel geht es um die Grundlagen zur Implementierung von Unit Tests mit ABAP. An dieser Stelle wollen wir dir einen kurzen Überblick geben.

Werbung

Im letzte Artikel zu ABAP Unit ging es um die allgemeine Einführung in das Thema Unit Tests und wie du sie für dich am effektivsten nutzen kannst. Wie ist ein ABAP Unit Test nun also aufgebaut und wie funktioniert es im Allgemeinen mit der Ausführung, dies wollen wir dir in diesem Artikel etwas näherbringen.

 

Begriffe

In den folgenden Artikeln werden wir immer wieder Abkürzungen verwenden, die auf Objekte verweisen: 

  • CUT - Code under Test oder Class under Test, ist unser Objekt, welches wir im aktuellen Unit Test testen wollen
  • DOC - Dependent on Component beschreibt eine abhängige Komponente, die unseren Test beeinflussen kann und die wir eigentlich gar nicht Testen wollen
  • TDF - Test Double Framework stellt Tools zur Verfügung, um abhängige Komponenten zu kontrollieren

 

Vorbereitung

Um eine Testklasse zu erzeugen, bedarf es nur sehr wenig Aufwand und sehr weniger Zeilen Code. In unseren weiteren Beispielen werden wird dir vor allem die Arbeit mit Eclipse etwas näherbringen und wie du damit die Tests implementierst. Im ersten Schritt legen wir eine globale Klasse an, da diese sich am besten zur Implementierung von Testklassen eignet.

 

Im unteren Bereich des Fensters hast du mehrere Reiter, hier wählst du den Reiter “Test Classes” und befindest dich damit im Test-Include der Klasse, hier kannst du deine Tests implementieren. Für eine Vorlage einer Testklasse kannst du das Muster “testclass” aus Eclipse verwenden und erhältst das folgende Ergebnis.

 

Aufbau

Eine Testklasse sieht im ersten Vergleich aus, wie eine normale Klasse, doch einige Unterschiede gibt es dabei. Schauen wir uns dazu erst einmal eine weitere Beispielimplementierung an:

CLASS ltc_basic_test DEFINITION FINAL 
  FOR TESTING
  DURATION SHORT
  RISK LEVEL HARMLESS.
  
  PRIVATE SECTION.
    METHODS:
      my_first_unit_test FOR TESTING.
ENDCLASS.

CLASS ltc_basic_test IMPLEMENTATION.
  METHOD my_first_unit_test.

  ENDMETHOD.
ENDCLASS.

 

Dabei ist die Klasse mit dem Zusatz FOR TESTING ausgestattet, was signalisiert, dass es sich um eine Testklasse handelt und diese nicht direkt instanziiert werden kann. Ebenso sind alle Testmethoden ebenfalls mit diesem Zusatz ausgestattet. Eine Testklasse kann deshalb auch noch mehr Methoden und Daten enthalten, die als Hilfe für die Ausführung der Testfälle genutzt werden können.

 

Dauer

Das Element DURATION an der Klasse gibt dem ABAP Unit Runner Hinweise, wie lange die Ausführung dieser Testklasse in Anspruch nimmt. Wird die Laufzeit überschritten, kommt es bei der Ausführung zu einer Meldung und es sollte noch einmal geprüft werden, ob die Testfälle nicht eine andere Klassifizierung benötigen. Weiterhin wird diese Einschränkung herangezogen, um bei globalen Läufen abzugrenzen, was gestartet werden soll.

Die einstellbaren Elemente sind:

  • SHORT - Ausführung kleiner als eine Minute
  • MEDIUM - Ausführung zwischen einer und fünf Minuten
  • LONG - Ausführung größer als 5 Minuten

 

Risikolevel

Das Risikolevel bestimmt die Kritikalität der Unit Tests für das System. Sollten die Tests Daten verändern oder können zu Inkonsistenzen im Datenbestand führen, wird ihr Risikolevel entsprechend anders eingestellt. Es besteht die Möglichkeit über einen Systemparameter zu definieren, was für Tests im aktuellen System maximal ausgeführt werden können. Weiterhin spielt die Einstellung eine Rolle bei globalen Testläufen.

Die Risikolevel sind:

  • HARMLESS - Es werden keine Systemeinstellungen oder persistente Daten durch die Tests beeinflusst
  • CRITICAL - Es werden persistente Daten geändert
  • DANGEROUS - Es werden mindestens Systemeinstellungen geändert

 

Implementierung

Die Implementierung eines Tests ist nicht besonders schwer, hierzu muss in der Methode lediglich die Instanz der globalen Klasse erzeugt und von dieser dann die zu testende Methode aufgerufen werden. Das Ergebnis wird gegen eine Methode der Klasse CL_ABAP_UNIT_ASSERT verglichen. Hier einmal eine Testmethode für die vorhin implementierte Klasse:

METHOD select_data_from_db.
  DATA(lo_cut) = NEW zcl_demo_test( ).

  DATA(ls_result) = lo_cut->select_some_data( ).

  cl_abap_unit_assert=>assert_not_initial( ls_result ).
ENDMETHOD.

 

Der Vergleich ermöglicht das Setzen des Endergebnisses für den gesamten Test und muss in jeder Methode erfolgen. Welche der Methoden du verwendest bleibt dir überlassen und hängt schließlich vom Vergleich und den Daten ab. Hier einmal eine kurze Übersicht der Methoden die in der Klasse vorhanden und relevant sind:

 

In den häufigsten Fällen wirst du wahrscheinlich auf die Methode ASSERT_EQUALS zurückgreifen, um das Ergebnis direkt zu vergleichen.

 

Reihenfolge

Die Ausführungsreihenfolge der Testmethoden in einer Testklasse ist nicht von vornherein bekannt und diese kann variieren. Testfälle sollten von daher nicht auf anderen Testmethoden aufbauen, sondern immer für sich separat betrachtet werden. Die Ausführung der ABAP Unit Tests geschieht über den Testrunner, der von der Testklasse eine Instanz erzeugt und die einzelnen Testmethoden aufruft.

 

Hilfsmethoden

Hierbei gibt es noch zu beachten, dass es noch vier weitere Methoden in einer Testklasse geben kann, die ausgeführt werden, wenn sie vorhanden sind:

  • CLASS_SETUP - Wird einmalig vor der Instanziierung der Testklasse aufgerufen und kann statische Attribute initialisieren
  • SETUP - Wird vor dem Aufruf einer Testmethode aufgerufen
  • TEARDOWN - Wird nach dem Aufruf einer Testmethode aufgerufen
  • CLASS_TEARDOWN - Wird am Ende des Tests aufgerufen, wenn alle Testmethoden verarbeitet wurden

 

Für die Ausführung gibt es daher einen Ausführungsplan, den wir dir hier noch einmal zeigen wollen:

 

Am Ende der Verarbeitung erfolgt ein Rollback Work, sodass alle Änderungen an der Datenbank wieder zurückgenommen werden können. Wenn während der Verarbeitung ein Commit Work erfolgt ist, werden diese Änderungen nicht mehr rückgängig gemacht, da diese schon auf die Datenbank geschrieben wurden.

Dafür haben wir die folgende Testklasse aufgebaut, die die einzelnen Methoden einmal implementiert und aufruft. Dabei wird in der Klasse die gesamte Ausgabe der einzelnen Methoden in eine interne Tabelle geloggt.

CLASS ltc_basic_test DEFINITION FINAL FOR TESTING
  DURATION SHORT
  RISK LEVEL HARMLESS.

  PRIVATE SECTION.
    CLASS-DATA:
      gt_steps TYPE string_table.

    CLASS-METHODS:
      class_setup,
      class_teardown.

    METHODS:
      setup,
      teardown,
      method_number_one FOR TESTING,
      method_number_two FOR TESTING.
ENDCLASS.

CLASS ltc_basic_test IMPLEMENTATION.
  METHOD class_setup.
    INSERT `Class Setup` INTO TABLE gt_steps.
  ENDMETHOD.


  METHOD class_teardown.
    INSERT `Class Teardown` INTO TABLE gt_steps.
    BREAK-POINT.
  ENDMETHOD.


  METHOD method_number_one.
    INSERT `Test No. 1` INTO TABLE gt_steps.
  ENDMETHOD.


  METHOD method_number_two.
    INSERT `Test No. 2` INTO TABLE gt_steps.
  ENDMETHOD.


  METHOD setup.
    INSERT `Setup` INTO TABLE gt_steps.
  ENDMETHOD.


  METHOD teardown.
    INSERT `Teardown` INTO TABLE gt_steps.
  ENDMETHOD.
ENDCLASS.

 

Im CLASS_TEARDOWN ist auch zusätzlich ein Breakpoint gesetzt, damit hast du die Möglichkeit dir den Inhalt der Tabelle einmal etwas näher anzuschauen. Wie du siehst wurden die Methoden in der entsprechenden Reihenfolge aufgerufen.

 

Ausführung

Die Ausführung der Testklasse geschieht über das eigentliche Hauptobjekt und nicht über die Testklasse selbst. Dazu stehen dir in Eclipse mehrere Wege zur Verfügung.

 

Menü

Über das Menü unter dem Punkt “Run -> Run As -> ABAP Unit Test” befindet sich eine Option.

 

Oder auch in der Aktionsleiste, direkt über das Run Icon.

 

Ebenso befindet sich im Kontextmenü eine Aktion, wenn du auf das Objekt einen Rechts-Klick ausführst.

 

Fazit

Mit den ersten Grundlagen von Heute kannst du bereits kleine Unit Tests schreiben und deine Anwendungen testen. Doch zum Testen gehört noch viel mehr dazu, vor allem in Hinwischt auf Tools und Methoden. Doch keine Angst, diese Informationen wirst du mit den nächsten Artikeln erhalten.


Enthaltene Themen:
ABAP UnitABAPUnit TestsGrundlagen
Kommentare (0)

ABAP Unit - Tipps

Kategorie - ABAP

Zum Abschluss der Serie noch ein paar Tipps die wir dir mit auf den Weg geben wollen. Hier geht es um Shortcuts und allgemeine Hinweise zu den Tests.

12.11.2021

ABAP Unit - Software-Architektur

Kategorie - ABAP

Wie könnte die Ziel Architektur in einem SAP System aussehen, wenn wir uns die eigenen Software Komponenten anschauen? Dies wollen wir in diesem Artikel klären.

05.11.2021

ABAP Unit - Testbarer Code (Teil 3)

Kategorie - ABAP

Hier schauen wir uns die Möglichkeiten etwas genauer an, wie man abhängige Komponenten im eigenen Coding zur Testlaufzeit deaktivieren können.

29.10.2021

ABAP Unit - Testbarer Code (Teil 2)

Kategorie - ABAP

In diesem Artikel geht es um das Thema Test Isolation und wie es unseren Code testbarer macht.

22.10.2021

ABAP Unit - Testbarer Code (Teil 1)

Kategorie - ABAP

In diesem Artikel schauen wir uns an, wie du auch in älterem Code sauber neue Funktionen implementieren und du diese im Anschluss auch testen kannst.

08.10.2021