Folgende Benutzer bedankten sich beim Autor deejey für den Beitrag:
ralf.wenzel
Code: Alles auswählen.
interface ZTESTABLE
public .
methods READ_MATNR
returning
value(R_MATNR) type MATNR .
type-pools ABAP .
methods IS_NUMERIC
importing
!I_MATNR type MATNR
returning
value(R_IS_NUMERIC) type ABAP_BOOL .
endinterface.
Code: Alles auswählen.
class Z2BE_TESTED definition
public
create public .
public section.
interfaces ZTESTABLE .
aliases IS_NUMERIC
for ZTESTABLE~IS_NUMERIC .
aliases READ_MATNR
for ZTESTABLE~READ_MATNR .
protected section.
private section.
ENDCLASS.
CLASS Z2BE_TESTED IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method Z2BE_TESTED->ZTESTABLE~IS_NUMERIC
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_MATNR TYPE MATNR
* | [<-()] R_IS_NUMERIC TYPE ABAP_BOOL
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD ztestable~is_numeric.
IF i_matnr CO '1234567890 '.
r_is_numeric = abap_true.
ENDIF.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method Z2BE_TESTED->ZTESTABLE~READ_MATNR
* +-------------------------------------------------------------------------------------------------+
* | [<-()] R_MATNR TYPE MATNR
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD ztestable~read_matnr.
*** Hier steht eine Logik, die eine Materialnummer oder
*** irgendwas anderes ermittelt.
SELECT SINGLE matnr FROM mara INTO r_matnr.
ENDMETHOD.
ENDCLASS.
Code: Alles auswählen.
*----------------------------------------------------------------------*
* CLASS lth_2be_tested_ok DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lth_2be_tested_ok DEFINITION
INHERITING FROM z2be_tested.
PUBLIC SECTION.
METHODS:
ztestable~read_matnr REDEFINITION.
PRIVATE SECTION.
CLASS-DATA:
instance TYPE REF TO lth_2be_tested_ok.
ENDCLASS. "lth_2be_tested_ok DEFINITION
*----------------------------------------------------------------------*
* CLASS lth_2be_tested_ok IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lth_2be_tested_ok IMPLEMENTATION.
METHOD ztestable~read_matnr.
r_matnr = '123'.
ENDMETHOD. "read_matnr
ENDCLASS. "lth_2be_tested_ok IMPLEMENTATION
Code: Alles auswählen.
*----------------------------------------------------------------------*
* CLASS lth_2be_tested_nok DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lth_2be_tested_nok DEFINITION
INHERITING FROM z2be_tested.
PUBLIC SECTION.
METHODS:
ztestable~read_matnr REDEFINITION.
PRIVATE SECTION.
CLASS-DATA:
instance TYPE REF TO lth_2be_tested_nok.
ENDCLASS. "lth_2be_tested_nok DEFINITION
*----------------------------------------------------------------------*
* CLASS lth_2be_tested_nok IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lth_2be_tested_nok IMPLEMENTATION.
METHOD ztestable~read_matnr.
r_matnr = '12X'.
ENDMETHOD. "read_matnr
ENDCLASS. "lth_2be_tested_nok IMPLEMENTATION
Code: Alles auswählen.
*----------------------------------------------------------------------*
* CLASS ltc_aunit_example DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS ltc_aunit_example DEFINITION FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
* ================
*---------------------------------------------------------------------*
* static attributes
*---------------------------------------------------------------------*
CLASS-DATA:
"! class under test
cut TYPE REF TO ztestable.
*---------------------------------------------------------------------*
* instance attributes
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* class-constructor and -destructor
*---------------------------------------------------------------------*
CLASS-METHODS:
class_setup,
class_teardown.
*---------------------------------------------------------------------*
* constructor and -destructor
*---------------------------------------------------------------------*
METHODS:
setup,
teardown.
*---------------------------------------------------------------------*
* test methods
*---------------------------------------------------------------------*
METHODS:
verification FOR TESTING,
falsification FOR TESTING.
ENDCLASS. "ltc_aunit_example
*----------------------------------------------------------------------*
* CLASS ltc_aunit_example IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS ltc_aunit_example IMPLEMENTATION.
METHOD class_setup.
ENDMETHOD. " class_setup
METHOD setup.
ENDMETHOD. " setup
METHOD verification.
DATA:
cut TYPE REF TO lth_2be_tested_ok.
CREATE OBJECT cut.
cl_aunit_assert=>assert_equals(
exp = abap_true
act = cut->is_numeric( cut->read_matnr( ) )
msg = 'Fehler: MATNR ist nicht (rein) numerisch'
level = cl_aunit_assert=>critical
quit = cl_aunit_assert=>method
).
ENDMETHOD. " verification
METHOD falsification.
DATA:
cut TYPE REF TO lth_2be_tested_nok.
CREATE OBJECT cut.
cl_aunit_assert=>assert_equals(
exp = abap_false
act = cut->is_numeric( cut->read_matnr( ) )
msg = 'Fehler: MATNR ist nicht (rein) numerisch'
level = cl_aunit_assert=>critical
quit = cl_aunit_assert=>method
).
ENDMETHOD. "falsification
METHOD teardown.
ENDMETHOD. " teardown
METHOD class_teardown.
ENDMETHOD. " class_teardown
ENDCLASS. "ltc_aunit_example
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag (Insgesamt 4):
ewx • nickname8 • tm987456 • Romaniac
Code: Alles auswählen.
METHOD test_1234XY.
cl_aunit_assert=>assert_equals(
EXP = abap_false
act = cut->is_numeric( '1234XY' )
msg = 'Fehler: MATNR ist nicht (rein) numerisch' ).
ENDMETHOD.
Code: Alles auswählen.
METHOD test_1234_space.
cl_aunit_assert=>assert_equals(
EXP = abap_false
act = cut->is_numeric( '1234 ' )
msg = 'Fehler: MATNR ist nicht (rein) numerisch' ).
ENDMETHOD.
Den Kurs habe ich mir damals angeschaut und wer die Videos + Präsis davon haben will, melde sich bei mir. Fand den auch gut. Aber leider haben die äußeren Umstände nicht gepasst, dass ich mich da total reingehängt habe (meine Frau war hoch schwanger, da hat man anderes im Kopf... ). Mir fehlt(e) so eine Zusammenfassung wie Ralf sie geliefert hat.Thomas R. hat geschrieben:Hallo,
zum Einstieg in Unit Tests gibt es einen Kurs bei OpenSAP
https://open.sap.com/courses/wtc1
Den Einwand habe ich auch gerade woanders gelesen und kann ihn überhaupt nicht nachvollziehen!Thomas R. hat geschrieben:Wobei sich die Frage stellt wie sinnvoll es ist private Methoden zu testen. Zumindest wenn ich die Public-Methoden per Test-Unit testen kann.
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
ralf.wenzel
Alles, was du nicht testest, funktioniert potentiell nicht (immer). Deshalb sollte man natürlich jede einzelne Methode testen, selbst SETter und GETter, weil potentiell diese Methoden weit mehr tun als ein Attribut zu schreiben oder zu lesen. Darum sind sie ja da: Um das Attribut gegen wildes Beschreiben zu schützen und nur zulässige Werte durchzulassen (und schon habe ich einen Testfall mit Verifikation und Falsifikation). Ich durchdenke gerade, wie ich Testmethoden für SETter und GETter in meine Vorlagen mit aufnehmen kann, damit man solche Prüflogiken nur noch reinschreiben muss, wenn das denn nötig wird. Aber das ist dann schon recht komplex, weil man abgleichen muss, welche SETter und GETter schon im Test sind und welche nicht (und gerade die vom Entwickler angereicherten Tests kann man ja nicht einfach löschen und neu generieren). Da fehlt es mir derzeit schlichtweg an der Zeit.Thomas R. hat geschrieben:Wobei sich die Frage stellt wie sinnvoll es ist private Methoden zu testen. Zumindest wenn ich die Public-Methoden per Test-Unit testen kann.