ABAP Unit Test durchführen

Nach der Implementierung der Testklasse kann diese nun aufgerufen werden.

Dazu einen Rechtsklick auf die Klasse, die zu testen ist (Z_CL_CONVERSION_TOOLBOX) und dann auf "Ausführen -> Modultest".

Aufruf des Unit Tests
Aufruf des Unit Tests

Das Framework startet nun mit dem Test. Es werden nun nacheinander die Testmethoden (in unserem Beispiel zwei) aufgerufen. Somit wird die SETUP und TEARDOWN Methode ebenfalls zweimal aufgerufen.

Die Aufrufreihenfolge der Testmethoden kann nicht festgelegt werden. Sie werden alphabetisch nacheinander aufgerufen. Auf Abhängigkeiten zwischen den Testmethoden ist also zu verzichten. Wenn mehrere Methoden zu einem Test gehören, müssen die Aufrufe in einer Testmethode zusammengefasst werden.

Das Ergebnis sieht dann wie folgt aus:

Unit Test Ergebnis mit Fehler
Unit Test Ergebnis mit Fehler

Der Test ist fehlgeschlagen. Zum einen sollte das Datum 01.08.2014 konvertiert werden. Wir haben einen Fehlschlag der Konvertierung erwartet (Methode DATE_2_INTERNAL_FORMAT_FAIL), die Konvertierung war aber erfolgreich.

Außerdem sollte das Datum 2014-08-01 konvertiert werden. Das Ergebnis der Konvertierung entspricht aber nicht unserer Erwartung (20140801 statt erwartet 20140802).

Die Fehler resultieren eigentlich nicht aus der Konvertierungsmethode, sondern aus unseren Testdaten (um einen Fehlerfall zu provozieren). Wenn man sich diese genau betrachtet, stellt man fest, dass hier falsche Erwartungen hinterlegt sind.

     ( testdate = '01.08.2014' result = '20140801' test_ok = abap_false ) 
     ( testdate = '2014-08-01' result = '20140802' test_ok = abap_true ) 

Nach Korrektur der beiden Testfälle läuft sowohl der Positiv- als auch der Negativtest erfolgreich durch. Der erfolgreiche Test wird nur durch eine einfache Statusmeldung angezeigt.

ABAP Unit Test Erfolg
ABAP Unit Test Erfolg

Vollständiger Code

Zum Abschluss nochmals der gesamte Quellcode der Testklasse.

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.

    TYPES: BEGIN OF ty_testdata,
      testdate TYPE char10,
      result TYPE d,
      test_ok TYPE boolean,
      END OF ty_testdata.

    TYPES tyt_testdata TYPE STANDARD TABLE OF ty_testdata WITH DEFAULT KEY.

    DATA: lt_testdata TYPE tyt_testdata.

    METHODS: setup.
    METHODS: teardown.
    METHODS: date_2_internal_format_ok FOR TESTING.
    METHODS: date_2_internal_format_fail FOR TESTING.
ENDCLASS.       "z_Cl_Date_2_Internal_Unit_Test


CLASS z_cl_date_2_internal_unit_test IMPLEMENTATION.

  METHOD setup.

    me->lt_testdata = VALUE tyt_testdata(
     ( testdate = '01.08.2014' result = '20140801' test_ok = abap_true )
     ( testdate = '08/01/2014' result = '20140801' test_ok = abap_true )
     ( testdate = '08-01-2014' result = '20140801' test_ok = abap_true )
     ( testdate = '2014.08.01' result = '20140801' test_ok = abap_true )
     ( testdate = '2014/08/01' result = '20140801' test_ok = abap_true )
     ( testdate = '32.08.2014' result = '20140832' test_ok = abap_false )
     ( testdate = '2014-13-01' result = '20141301' test_ok = abap_false )
     ( testdate = '01:08:2014' result = '20140801' test_ok = abap_false )
     ( testdate = '20140801' result = '20140802' test_ok = abap_false )
    ).

  ENDMETHOD.


  METHOD teardown.

    CLEAR lt_testdata.

  ENDMETHOD.


  METHOD date_2_internal_format_ok.

    DATA ev_output TYPE sydatum.

    FIELD-SYMBOLS  TYPE ty_testdata.

    LOOP AT lt_testdata ASSIGNING 
      WHERE test_ok = abap_true.

      z_cl_conversion_toolbox=>date_2_internal_format(
        EXPORTING
          iv_input = -testdate
     IMPORTING
       ev_output = ev_output
      ).

      cl_abap_unit_assert=>assert_equals(
        act   = ev_output
        exp   = -result
       msg   = 'Datum wurde falsch konvertiert' && | | 
               && -testdate && | | && ev_output && | |
               && 'statt' && | | && -result
       quit = if_aunit_constants=>no
      ).

    ENDLOOP.
  ENDMETHOD.

  METHOD date_2_internal_format_fail.

    DATA ev_output TYPE sydatum.

    FIELD-SYMBOLS  TYPE ty_testdata.

    LOOP AT lt_testdata ASSIGNING 
      WHERE test_ok = abap_false.

      z_cl_conversion_toolbox=>date_2_internal_format(
        EXPORTING
          iv_input = -testdate
     IMPORTING
       ev_output = ev_output
     EXCEPTIONS
       invalid_date = 1
      ).

      cl_abap_unit_assert=>assert_subrc(
        act   = sy-subrc
        exp   = 1
       msg   = 'Datum ist falsch wurde dennoch konvertiert' && | |
               && -testdate && | | && ev_output && | |
               && 'statt' && | | && -result
       quit = if_aunit_constants=>no
      ).

    ENDLOOP.
  ENDMETHOD.

ENDCLASS. 

Im nächsten Beitrag erläutere ich, wie mit Datenbankzugriffen innerhalb des Tests umgegangen werden kann.