ABAP Unit Test Wizard

In diesem Beitrag zeige ich, wie eine Testklasse bequem per Wizard erstellt werden kann. Es soll eine Methode getestet werden, welche Datumskonvertierungen vornimmt. Ich werde dieses Beispiel auch bei den restlichen Beiträgen verwenden.

Die zu testende Methode heißt DATE_2_INTERNAL_FORMAT. Sie ist eine statische Methode der Klasse Z_CL_CONVERSION_TOOLBOX

Der Vollständigkeit halber hier der Code der Methode. Dieser Code soll geprüft werden.

METHOD date_2_internal_format.

DATA: lv_output TYPE sydatum.

* DD.MM.YYYY
IF iv_input+2(1) = '.'.
CONCATENATE iv_input+6(4) iv_input+3(2) iv_input(2) INTO lv_output.
ENDIF.

* MM/DD/YYYY
IF iv_input+2(1) = '/'.
CONCATENATE iv_input+6(4) iv_input(2) iv_input+3(2) INTO lv_output.
ENDIF.

* MM-DD-YYYY
IF iv_input+2(1) = '-'.
CONCATENATE iv_input+6(4) iv_input(2) iv_input+3(2) INTO lv_output.
ENDIF.

* YYYY.MM.DD
IF iv_input+4(1) = '.'.
CONCATENATE iv_input(4) iv_input+5(2) iv_input+8(2)  INTO lv_output.

ENDIF.
* YYYY/MM/DD
IF iv_input+4(1) = '/'.
CONCATENATE iv_input(4) iv_input+5(2) iv_input+8(2)  INTO lv_output.
ENDIF.
* YYYY-MM-DD
IF iv_input+4(1) = '-'.
CONCATENATE iv_input(4) iv_input+5(2) iv_input+8(2)  INTO lv_output.
ENDIF.

* Prüfen ob Datum gültig ist.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date                      = lv_output
EXCEPTIONS
plausibility_check_failed = 1
OTHERS                    = 2.

* Prüfen ob Datum ermittelt wurde und ok ist, sonst Ausnahme.
IF lv_output IS INITIAL OR sy-subrc <> 0.
RAISE invalid_date.
ELSE.
ev_output = lv_output.
ENDIF.

ENDMETHOD.

Aufruf des Wizard

Der Wizard kann aus der SE80 per Rechtsklick auf den Klassennamen -> "Anlegen -> Testklasse generieren" aufgerufen werden.

ABAP Unit Test Wizard 1
ABAP Unit Test Wizard 1

ABAP Unit Test Wizard 2
ABAP Unit Test Wizard 2

Der Wizard erfragt nun, was getestet werden soll. Die Felder unterscheiden sich je nach Testobjekt, also ob es eine Klasse oder Funktionsbaustein etc. ist. In unserem Falle müssen wir angeben, dass wir eine globale Klasse testen wollen.

ABAP Unit Test Wizard 3
ABAP Unit Test Wizard 3

Nun erfolgt die Angabe des Testklassennamens. Über den "Neu" Button können wir eine neue Testklasse erstellen. Dann werden auch die Optionsfelder eingabebereit.

ABAP Unit Test Wizard 4
ABAP Unit Test Wizard 4

Bei den Optionen wählen wir alle aus. Damit werden bereits alle SETUP und TEARDOWN Methoden erstellt sowie ein Rumpf der Testmethode inklusive des Aufrufs der zu testenden Methode (method under test) und der Auswertung des Ergebnisses.

Anschließend werden alle Methoden ausgewählt, die getestet werden sollen. Da die Beispielklasse nur über eine Methode verfügt, wird nur diese im Grid angezeigt.

ABAP Unit Test Wizard Methodenauswahl
ABAP Unit Test Wizard Methodenauswahl

Pro ausgewählte Methode wird eine eigene Testmethode erstellt.

Abschließend wird noch eine Zusammenfassung angezeigt.

ABAP Unit Test Wizard Summary
ABAP Unit Test Wizard Summary

Nun ist der Wizard mit seiner Arbeit fertig. Wie im Objektbaum zu sehen, wurde innerhalb der Klasse Z_CL_CONVERSION_TOOLBOX eine lokale Klasse Z_CL_DATE_2_INTERLA_UNIT_TEST angelegt.

Objektbaum mit Testklasse
Objektbaum mit Testklasse

Der Quellcode der Klasse sieht so aus

class z_Cl_Date_2_Internal_Unit_Test definition for testing
  duration short
  risk level harmless
.
*?
*?
*?
*?z_Cl_Date_2_Internal_Unit_Test
*?
*?f_Cut
*?
*?Z_CL_CONVERSION_TOOLBOX
*?
*?
*?X
*?
*?X
*?
*?X
*?
*?X
*?
*?
*?
*?

  private section.
    data:
      f_Cut type ref to z_Cl_Conversion_Toolbox.  "class under test

    class-methods: class_Setup.
    class-methods: class_Teardown.
    methods: setup.
    methods: teardown.
    methods: date_2_Internal_Format for testing.
endclass.       "z_Cl_Date_2_Internal_Unit_Test


class z_Cl_Date_2_Internal_Unit_Test implementation.

  method class_Setup.
  endmethod.

  method class_Teardown.
  endmethod.

  method setup.
    create object f_Cut.
  endmethod.

  method teardown.
  endmethod.

  method date_2_Internal_Format.

    data iv_Input type char10.
    data ev_Output type sydatum.

    z_Cl_Conversion_Toolbox=>date_2_Internal_Format(
      EXPORTING
        IV_INPUT = iv_Input
*     IMPORTING
*       EV_OUTPUT = ev_Output
    ).

    cl_Abap_Unit_Assert=>assert_Equals(
      act   = ev_Output
      exp   = ev_Output          "<--- please adapt expected value
      msg   = 'Testing value ev_Output'
*     level =
    ).
  endmethod.

endclass.

Wird die lokale Klasse gespeichert und aktiviert, fragt das System nach einem Transportauftrag. Wie in den Grundlagen zum Unit Test beschrieben, werden die lokalen Testklassen auch ins produktive System übertragen. Hier können sie aber nicht gestartet werden.

Im nächsten Beitrag zeige ich, wie Testdaten angelegt werden können.