Suche…
Struktur einer Testklasse
Testklassen werden als lokale Klassen in einem speziellen Unit-Test-Include erstellt.
Dies ist die Grundstruktur einer Testklasse:
CLASS lcl_test DEFINITION
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA:
mo_cut TYPE REF TO zcl_dummy.
METHODS:
setup,
"********* 30 chars *********|
dummy_test for testing.
ENDCLASS.
CLASS lcl_test IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mo_cut.
ENDMETHOD.
METHOD dummy_test.
cl_aunit_assert=>fail( ).
ENDMETHOD.
ENDCLASS.
Jede mit FOR TESTING deklarierte Methode ist ein FOR TESTING . setup ist eine spezielle Methode, die vor jedem Test ausgeführt wird.
Getrennter Datenzugriff von der Logik
Ein wichtiges Prinzip für das Testen von Einheiten besteht darin, den Datenzugriff von der Geschäftslogik zu trennen. Eine effiziente Technik hierfür ist das Definieren von Schnittstellen für den Datenzugriff. Ihre Hauptklasse verwendet immer einen Verweis auf diese Schnittstelle, anstatt direkt Daten zu lesen oder zu schreiben.
Im Produktionscode erhält die Hauptklasse ein Objekt, das den tatsächlichen Datenzugriff umschließt. Dies kann eine select-Anweisung, ein Aufruf von Funktionsmudulen, alles wirklich sein. Der wichtige Teil ist, dass diese Klasse nichts anderes ausführen sollte. Keine Logik.
Wenn Sie die Hauptklasse testen, geben Sie ihr stattdessen ein Objekt, das statischen, gefälschten Daten dient.
Ein Beispiel für den Zugriff auf die SCARR Tabelle
Datenzugriffsschnittstelle ZIF_DB_SCARR :
INTERFACE zif_db_scarr
PUBLIC.
METHODS get_all
RETURNING
VALUE(rt_scarr) TYPE scarr_tab .
ENDINTERFACE.
Gefälschte Datenklasse und Testklasse:
CLASS lcl_db_scarr DEFINITION.
PUBLIC SECTION.
INTERFACES: zif_db_scarr.
ENDCLASS.
CLASS lcl_db_scarr IMPLEMENTATION.
METHOD zif_db_scarr~get_all.
" generate static data here
ENDMETHOD.
ENDCLASS.
CLASS lcl_test DEFINITION
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
DATA:
mo_cut TYPE REF TO zcl_main_class.
METHODS:
setup.
ENDCLASS.
CLASS lcl_test IMPLEMENTATION.
METHOD setup.
DATA: lo_db_scarr TYPE REF TO lcl_db_scarr.
CREATE OBJECT lo_db_scarr.
CREATE OBJECT mo_cut
EXPORTING
io_db_scarr = lo_db_scarr.
ENDMETHOD.
ENDCLASS.
Die Idee hier ist, dass ZCL_MAIN_CLASS im Produktionscode ein ZIF_DB_SCARR Objekt ZIF_DB_SCARR , das ein SELECT ZIF_DB_SCARR und die gesamte Tabelle zurückgibt, während der ZIF_DB_SCARR gegen ein statisches Dataset ausgeführt wird, das genau dort im ZCL_MAIN_CLASS ZIF_DB_SCARR definiert ist.