ABAP
Enhetstestning
Sök…
Strukturen för en testklass
Testklasser skapas som lokala klasser i ett speciellt enhetstest inkluderar.
Detta är den grundläggande strukturen i en testklass:
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.
Alla metoder som deklareras med FOR TESTING kommer att vara ett enhetstest. setup är en speciell metod som utförs före varje test.
Separera datatillgång från logik
En viktig princip för enhetstestning är att separera datatillgång från affärslogik. En effektiv teknik för detta är att definiera gränssnitt för datatillgång. Din huvudklass använder alltid en referens till det gränssnittet istället för direkt läsning eller skrivning av data.
i produktionskod kommer huvudklassen att ges ett objekt som slår in faktisk datatillgång. Detta kan vara valda uttalanden, funktionsmudulsamtal, vad som helst. Den viktiga delen är att den här klassen inte ska utföra något annat. Ingen logik.
När du testar huvudklassen ger du det ett objekt som serverar statiska, falska data istället.
Ett exempel för åtkomst till SCARR tabellen
ZIF_DB_SCARR :
INTERFACE zif_db_scarr
PUBLIC.
METHODS get_all
RETURNING
VALUE(rt_scarr) TYPE scarr_tab .
ENDINTERFACE.
Fake data class och test class:
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.
Tanken här är att i produktionskod kommer ZCL_MAIN_CLASS att få ett ZIF_DB_SCARR objekt som gör ett SELECT och returnerar hela tabellen medan enhetstestet körs mot ett statiskt dataset definierat där i enhetstestet inkluderar.