Ansicht
Dokumentation
ABENTEST_SEAMS - TEST SEAMS
ABAP Short Reference rdisp/max_wprun_time - Maximum work process run timeDiese Dokumentation steht unter dem Copyright der SAP AG.
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 )