Ansicht
Dokumentation

ABENTEST_SEAMS - TEST SEAMS

ABENTEST_SEAMS - TEST SEAMS

ABAP Short Reference   rdisp/max_wprun_time - Maximum work process run time  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

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:

  • Testseams beeinflussen die produktive Verwendung von Programmen nicht. Dort findet keine Injection statt, sondern der originale Code wird ausgeführt.
  • Ein Programm kann mehrere Testseams enthalten.
  • Für einen Testseam können mehrere Injections definiert werden.
  • Injections können nur in Testklassen, die in einem Test-Include definiert sind, angelegt werden. Testseams sind in allen ausführbaren Einheiten eines Rahmenprogramms, das ein Test-Include einbindet, möglich. Dies umfasst Methoden lokaler Klassen und Unterprogramme .
  • Modultests können während der Ausführung von Testmethoden oder der setup-Methode Injections vornehmen.
  • Bei wiederholter Injection in den gleichen Testseam wird die letzte Injectin als aktive Injection durchgeführt.

Hinweise

  • 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:
  • Berechtigungsprüfungen

  • Lesen von persistenten Daten

  • Ändern von persistenten Daten

  • Erzeugen von Testattrappen

  • Testseams sollten hauptsächlich für Legacy-Code verwendet werden, der wegen ungenügender Trennung der Belange nicht für Modultests geeignet ist. Neue Programme sollten dagegen so modularisiert werden, dass Testseams weitestgehend unnötig 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.\lbr  AUTHORITY-CHECK OBJECT 'S_CTS_ADMI'\lbr      ID 'CTS_ADMFCT' FIELD 'TABL'.\lbrEND-TEST-SEAM.\lbr\lbrIF sy-subrc = 0.\lbr  is_authorized = abap_true.\lbrENDIF. TEST-INJECTION authorization_seam.\lbr  sy-subrc = 0.\lbrEND-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.\lbr  SELECT *\lbr         FROM sflight\lbr         WHERE  carrid IN @carrid_range AND\lbr fldate EQ @sy-datum\lbr      INTO TABLE @flights.\lbrEND-TEST-SEAM. TEST-INJECTION read_content_seam.\lbr  flights =\lbr    VALUE #( ( carrid = 'LHA'\lbr               connid = 100 )\lbr ( carrid = 'AFR'\lbr               connid = 900 ) ).\lbrEND-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.\lbr  MODIFY sflight\lbr    FROM TABLE @new_flights.\lbrEND-TEST-SEAM. TEST-INJECTION store_content_seam.\lbr  cl_abap_unit_assert=>assert_equals(\lbr act = new_flights\lbr     exp = global_buffer=>exp_flights ).\lbrEND-TEST-INJECTION.

Beispiel für eine Testattrappe

In folgendem Quelltextabschnitt instanziiert 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.\lbr  me->oref = NEW #( ).\lbrEND-TEST-SEAM. TEST-INJECTION instantiation_seam.\lbr me->oref = NEW dummy_class( ).\lbr END-TEST-INJECTION.

Beispiel

Siehe auch die Klasse CL_AU_SAMPLE_TEST_SEAMS im Paket SABP_UNIT_SAMPLE.






Fill RESBD Structure from EBP Component Structure   CPI1466 during Backup  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 8006 Date: 20240523 Time: 111037     sap01-206 ( 84 ms )