This package brings the famous node-tap testing library to ABAP.
Stop writing long cl_abap_unit_assert
statements. Use short tap
methods that you can chain as well!
The package also supports creating and testing snapshots.
NO WARRANTIES, MIT License
Important
All features described below are implemented. The test class validates the core features, but is lacking full test coverage. Any help in implementing additional tests is greatly appreciated.
Here's how you use tap
in your test classes:
METHOD setup.
tap = NEW /apmg/cl_tap( ).
ENDMETHOD.
METHOD test.
DATA(i) = 42.
tap->act( i )->equal( 42 ).
ENDMETHOD.
For convenience, several methods are available with shorter names compared to the TAP original. For example, you could shorten the above assertion to t->_( i )->eq( 42 ).
You set the actual value using act( )
or short _( )
. At this time, the values of sy-subrc
, sy-index
, sy-tabix
, and sy-fdpos
will be recorded as well.
The following list includes the available assertion methods:
Method | Description |
---|---|
abort |
cl_abap_unit_assert=>abort |
initial |
cl_abap_unit_assert=>assert_initial |
not_initial |
cl_abap_unit_assert=>assert_not_initial |
bound |
cl_abap_unit_assert=>assert_bound |
not_bound |
cl_abap_unit_assert=>assert_not_bound |
true or ok |
cl_abap_unit_assert=>assert_true |
false or not_ok |
cl_abap_unit_assert=>assert_false |
equals or eq |
cl_abap_unit_assert=>assert_equals |
equals_float or eq_f |
cl_abap_unit_assert=>assert_equals_float |
differs or ne |
cl_abap_unit_assert=>assert_differs (different types passes the test!) |
cp |
cl_abap_unit_assert=>assert_char_cp |
np |
cl_abap_unit_assert=>assert_char_np |
cs |
cl_abap_unit_assert=>assert_true( xsdbool( act CS exp ) ) |
ns |
cl_abap_unit_assert=>assert_true( xsdbool( act NS exp ) ) |
contains |
cl_abap_unit_assert=>assert_table_contains |
not_contains |
cl_abap_unit_assert=>assert_table_not_contains |
error |
IF act IS INSTANCE OF cx_root. cl_abap_unit_assert=>fail( ). ENDIF. |
matches or re |
cl_abap_unit_assert=>assert_text_matches (regex) |
return_code or rc |
cl_abap_unit_assert=>assert_return_code |
subrc |
cl_abap_unit_assert=>assert_subrc (default 0) |
index |
cl_abap_unit_assert=>assert_equals( act = sy-index ) |
tabix |
cl_abap_unit_assert=>assert_equals( act = sy-tabix ) |
fdpos |
cl_abap_unit_assert=>assert_equals( act = sy-fdpos ) |
throws |
cl_abap_unit_assert=>fail |
does_not_throw |
If we get here, there was no exception. Therefore, pass the test |
type |
Returns the internal ABAP type of act (cl_abap_typedescr=>typekind_... ) |
kind |
Returns the internal ABAP type category of act (cl_abap_typedescr=>kind_... ) |
You can chain tests as well:
READ TABLE itab INTO str.
tap->act( str )->subrc( 0 )->tabix( 2 )->eq( 'hasso' ).
You can process test and record test results like TAP Protocol:
METHOD setup.
DATA(tap) = NEW /apmg/cl_tap( logging = abap_true ).
ENDMETHOD.
METHOD test.
tap->plan( 1 ).
"Your tests ...
testplan = tap->end( ). " TAP protocol output
ENDMETHOD.
Additional methods: bailout
, passing
, comment
, pass
, fail
, skip
, todo
.
To record snapshots, set snapshot
to abap_true
:
DATA(tap) = NEW /apmg/cl_tap( snapshot = abap_true ).
In your test methods, you create snapshots as follows:
tap->snap_begin( 'SNAPSHOT_TEST' ).
DO 10 TIMES.
tap->snap_write( |{ sy-index }| ).
ENDDO.
tap->snap_end( 'SNAPSHOT_TEST' ).
You can create multiple snapshots by providing a unique ID for each.
Subtests are created using tap->test_begin( )
and tap->test_end( )
.
By default, the snapshots are stored in the "macro" include of the class.
* TAP_SNAPSHOT
*
* IMPORTANT
* This snapshot file is auto-generated, but designed for humans.
* It should be checked into source control and tracked carefully.
* Re-generate by setting SNAPSHOT = ABAP_TRUE and running tests.
* Make sure to inspect the output below. Do not ignore changes!
*
* TAP_SNAPSHOT: BEGIN OF SNAPSHOT_TEST
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* TAP_SNAPSHOT: END OF SNAPSHOT_TEST
To match snapshots, set snapshot
to abap_false
(which is the default):
DATA(tap) = NEW /apmg/cl_tap( snapshot = abap_false ).
If a test does not match the snapshot, an exception will be raised, failing the test.
Alternatively, you can use a custom include for storing the snapshots:
DATA(tap) = NEW /apmg/cl_tap(
snapshot = abap_true
snap_include = 'ZSNAP_INCLUDE'
snap_package = 'ZPROJECT'
snap_title = 'Snapshots for Project' ).
You can set the default tolerance for comparison of floats (type f
) in the constructor:
DATA(tap) = NEW /apmg/cl_tap( tolerance = '1.E-14' ).
SAP Basis 7.50 or higher
Install tap
as a global module in your system using apm.
or
Specify the tap
module as a dependency in your project and import it to your namespace using apm.
All contributions are welcome! Read our Contribution Guidelines, fork this repo, and create a pull request.
You can install the developer version of ABAP TAP using abapGit by creating a new online repository for https://github.com/abapPM/ABAP-Tap
.
Default SAP package: /APMG/TAP
Made with ❤ in Canada
Copyright 2025 apm.to Inc. https://apm.to