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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow