ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Programmbearbeitung →  Programme testen und prüfen →  ABAP Unit → 

Testseams

Testseams sind speziell für Modultests vorgesehene Sprachkonstrukte, die durch die folgenden Anweisungen verwirklicht werden:

Definition eines Testseams als austauschbaren Bereich im produktiven Code eines Programms.
Ersetzen der ausführbaren Anweisungen eines Testseams durch die Anweisungen einer Injection in einer Testklasse des gleichen Programms.

Testseams haben folgende Eigenschaften:

Hinweis

Testseams erlauben es, auf einfache Art zu Testzwecken Quelltext im produktiven Teil des Programms auszutauschen oder zu ergänzen. Behindert z.B. das Verhalten einzelner Anweisungen die Testdurchführung, kann der Modultest diese durch geeignete Alternativen ersetzen. Typische Szenarien sind:

Beispiel für Berechtigungsprüfungen

Um die Abhängigkeit eines Modultests von den Berechtigungen des aktuellen Benutzers zu umgehen, kann eine Injection die Anweisung AUTHORITY-CHECK durch das Setzen eines geeigneten Rückgabewerts ersetzen.

Testseam Injection
TEST-SEAM authorization_seam.
  AUTHORITY-CHECK OBJECT 'S_CTS_ADMI'
     ID 'CTS_ADMFCT' FIELD 'TABL'.
END-TEST-SEAM.

IF sy-subrc = 0.
  is_authorized = abap_true.
ENDIF.
TEST-INJECTION authorization_seam.
  sy-subrc = 0.
END-TEST-INJECTION.

Beispiel für das Lesen von persistenten Daten

In Modultests kann oft keine Annahme über den Inhalt von Datenbanktabellen oder sonstigen Ablagen gemacht werden. Mit Testseams können Modultests Abhängigkeiten von persistenten Daten durch den Austausch mit selbst konstruierten Daten umgehen.

Testseam Injection
TEST-SEAM read_content_seam.
  SELECT *
         FROM sflight
         WHERE  carrid IN @carrid_range AND
               fldate EQ @sy-datum
      INTO TABLE @flights.
END-TEST-SEAM.
TEST-INJECTION read_content_seam.
  flights =
    VALUE #( ( carrid = 'LHA'
               connid = 100 )
             ( carrid = 'AFR'
              connid = 900 ) ).
END-TEST-INJECTION.

Beispiel für das Ändern von persistenten Daten

Die Ausführung von Modultest darf keinen produktiv genutzten Inhalt von Datenbanktabellen oder sonstigen Ablagen ändern. Mit Testseams können Modultests die Operanden ändernder Datenbankoperationen aufzeichnen oder anstelle der tatsächlichen Änderung mit der Erwartung vergleichen. In dem folgenden Quelltextabschnitt vergleicht die Injection die Änderungswerte mit einem öffentlichen statischen Attribut.

Testseam Injection
TEST-SEAM store_content_seam.
  MODIFY sflight
    FROM TABLE @new_flights.
END-TEST-SEAM.
TEST-INJECTION store_content_seam.
  cl_abap_unit_assert=>assert_equals(
    act = new_flights
     exp = global_buffer=>exp_flights ).
END-TEST-INJECTION.

Beispiel für eine Testattrappe

In folgendem Quelltextabschnitt instanziert der produktive Quelltext eine Klasse, die von Datenbankinhalt abhängt. Der Modultest injiziert die Instanzierung einer Testattrappe an Stelle des produktiven Objekts.

Testseam Injection
TEST-SEAM instantiation_seam.
  me->oref = NEW #( ).
END-TEST-SEAM.
TEST-INJECTION instantiation_seam.
  me->oref = NEW dummy_class( ).
END-TEST-INJECTION.

Beispiel

Siehe auch die Klasse CL_AU_SAMPLE_TEST_SEAMS im Paket SABP_UNIT_SAMPLE.



Weiterlesen
TEST-SEAM
TEST-INJECTION