Code Inspector: new feature run adhoc unit tests

This commit refactors the logic from zcl_abapgit_syntax_check to the new class zcl_abapgit_adhoc_code_insp. Which can be used to run arbitrary code inspections adhoc. zcl_abapgit_syntax_check delegates to zcl_abapgit_adhoc_code_insp.

Additionally the new class zcl_abapgit_abap_unit_tests is introduced to run ABAP unit tests for a particular package (hierarchy). It can be acessed via zcl_abapgit_factory%3D>get_abap_unit_tests.
This commit is contained in:
Christian Guenter 2018-11-06 12:04:40 +01:00 committed by Lars Hvam
parent 0883054b24
commit 8189d27b80
7 changed files with 280 additions and 90 deletions

View File

@ -0,0 +1,51 @@
CLASS zcl_abapgit_abap_unit_tests DEFINITION
CREATE PRIVATE
PUBLIC
GLOBAL FRIENDS zcl_abapgit_factory.
PUBLIC SECTION.
INTERFACES:
zif_abapgit_code_inspector.
METHODS:
constructor
IMPORTING
iv_package TYPE devclass
RAISING
zcx_abapgit_exception.
PRIVATE SECTION.
DATA:
mo_adhoc_code_inspector TYPE REF TO zif_abapgit_code_inspector.
ENDCLASS.
CLASS zcl_abapgit_abap_unit_tests IMPLEMENTATION.
METHOD constructor.
mo_adhoc_code_inspector = zcl_abapgit_factory=>get_adhoc_code_inspector(
iv_package = iv_package
iv_test_name = 'CL_SAUNIT_LEGACY_CI_CHECK' ).
ENDMETHOD.
METHOD zif_abapgit_code_inspector~get_inspection.
ro_inspection = mo_adhoc_code_inspector->get_inspection( ).
ENDMETHOD.
METHOD zif_abapgit_code_inspector~run.
rt_list = mo_adhoc_code_inspector->run( ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_ABAP_UNIT_TESTS</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Syntax check</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,132 @@
CLASS zcl_abapgit_adhoc_code_insp DEFINITION
CREATE PRIVATE
PUBLIC
INHERITING FROM zcl_abapgit_code_inspector
GLOBAL FRIENDS zcl_abapgit_factory.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING
iv_package TYPE devclass
iv_test_name TYPE sci_tstval-testname
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
METHODS:
create_variant REDEFINITION,
cleanup REDEFINITION.
PRIVATE SECTION.
DATA:
mo_variant TYPE REF TO cl_ci_checkvariant,
mv_test_name TYPE sci_tstval-testname.
ENDCLASS.
CLASS zcl_abapgit_adhoc_code_insp IMPLEMENTATION.
METHOD cleanup.
super->cleanup( io_set ).
IF mo_variant IS BOUND.
mo_variant->delete(
EXCEPTIONS
exists_in_insp = 1
locked = 2
error_in_enqueue = 3
not_authorized = 4
transport_error = 5
OTHERS = 6 ).
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Couldn't delete variant. Subrc = { sy-subrc }| ).
ENDIF.
ENDIF.
ENDMETHOD.
METHOD constructor.
DATA: lv_check_variant_name TYPE sci_chkv.
IF iv_test_name IS INITIAL.
zcx_abapgit_exception=>raise( |Please supply a test name| ).
ENDIF.
" we supply a dummy name for the check variant,
" because we have to persists it to be able to run in parallel.
" Afterwards it's deleted.
lv_check_variant_name = |{ sy-uname }_{ sy-datum }_{ sy-uzeit }|.
super->constructor( iv_package = iv_package
iv_check_variant_name = lv_check_variant_name ).
mv_test_name = iv_test_name.
ENDMETHOD.
METHOD create_variant.
DATA: lt_variant TYPE sci_tstvar,
ls_variant LIKE LINE OF lt_variant.
cl_ci_checkvariant=>create(
EXPORTING
p_user = sy-uname
p_name = mv_check_variant_name
RECEIVING
p_ref = mo_variant
EXCEPTIONS
chkv_already_exists = 1
locked = 2
error_in_enqueue = 3
not_authorized = 4
OTHERS = 5 ).
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Couldn't create variant. Subrc = { sy-subrc }| ).
ENDIF.
ls_variant-testname = mv_test_name.
INSERT ls_variant INTO TABLE lt_variant.
mo_variant->set_variant(
EXPORTING
p_variant = lt_variant
EXCEPTIONS
not_enqueued = 1
OTHERS = 2 ).
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Couldn't set variant. Subrc = { sy-subrc }| ).
ENDIF.
mo_variant->save(
EXPORTING
p_variant = mo_variant->variant
EXCEPTIONS
empty_variant = 1
transport_error = 2
not_authorized = 3
OTHERS = 4 ).
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Couldn't save variant. Subrc = { sy-subrc }| ).
ENDIF.
ro_variant = mo_variant.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_ADHOC_CODE_INSP</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Syntax check</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -29,6 +29,21 @@ CLASS zcl_abapgit_factory DEFINITION
VALUE(ri_syntax_check) TYPE REF TO zif_abapgit_code_inspector
RAISING
zcx_abapgit_exception .
CLASS-METHODS get_adhoc_code_inspector
IMPORTING
!iv_package TYPE devclass
iv_test_name TYPE sci_tstval-testname
RETURNING
VALUE(ri_adhoc_code_inspector) TYPE REF TO zif_abapgit_code_inspector
RAISING
zcx_abapgit_exception .
CLASS-METHODS get_abap_unit_tests
IMPORTING
!iv_package TYPE devclass
RETURNING
VALUE(ri_abap_unit_tests) TYPE REF TO zif_abapgit_code_inspector
RAISING
zcx_abapgit_exception .
CLASS-METHODS get_branch_overview
IMPORTING
!io_repo TYPE REF TO zcl_abapgit_repo_online
@ -81,11 +96,12 @@ CLASS zcl_abapgit_factory DEFINITION
CLASS-DATA gt_syntax_check TYPE tty_syntax_check .
CLASS-DATA gi_branch_overview TYPE REF TO zif_abapgit_branch_overview .
CLASS-DATA gi_stage_logic TYPE REF TO zif_abapgit_stage_logic .
CLASS-DATA gi_adhoc_code_inspector TYPE REF TO zif_abapgit_code_inspector.
ENDCLASS.
CLASS ZCL_ABAPGIT_FACTORY IMPLEMENTATION.
CLASS zcl_abapgit_factory IMPLEMENTATION.
METHOD get_branch_overview.
@ -201,4 +217,35 @@ CLASS ZCL_ABAPGIT_FACTORY IMPLEMENTATION.
ri_tadir = gi_tadir.
ENDMETHOD.
METHOD get_adhoc_code_inspector.
IF gi_adhoc_code_inspector IS BOUND.
ri_adhoc_code_inspector = gi_adhoc_code_inspector.
ELSE.
CREATE OBJECT ri_adhoc_code_inspector
TYPE zcl_abapgit_adhoc_code_insp
EXPORTING
iv_package = iv_package
iv_test_name = iv_test_name.
ENDIF.
ENDMETHOD.
METHOD get_abap_unit_tests.
IF gi_adhoc_code_inspector IS BOUND.
ri_abap_unit_tests = gi_adhoc_code_inspector.
ELSE.
CREATE OBJECT ri_abap_unit_tests
TYPE zcl_abapgit_abap_unit_tests
EXPORTING
iv_package = iv_package.
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -1,26 +1,23 @@
CLASS zcl_abapgit_syntax_check DEFINITION
CREATE PRIVATE
PUBLIC
INHERITING FROM zcl_abapgit_code_inspector
GLOBAL FRIENDS zcl_abapgit_factory.
PUBLIC SECTION.
INTERFACES:
zif_abapgit_code_inspector.
METHODS:
constructor
IMPORTING
iv_package TYPE devclass
iv_check_variant_name TYPE sci_chkv OPTIONAL
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
METHODS:
create_variant REDEFINITION,
cleanup REDEFINITION.
PRIVATE SECTION.
DATA:
mo_variant TYPE REF TO cl_ci_checkvariant.
mo_adhoc_code_inspector TYPE REF TO zif_abapgit_code_inspector.
ENDCLASS.
@ -28,96 +25,26 @@ ENDCLASS.
CLASS zcl_abapgit_syntax_check IMPLEMENTATION.
METHOD constructor.
DATA: lv_check_variant_name TYPE sci_chkv.
" we supply a dummy name for the check variant,
" because we have to persists it to be able to run in parallel.
" Afterwards it's deleted.
lv_check_variant_name = |{ sy-uname }_{ sy-datum }_{ sy-uzeit }|.
super->constructor( iv_package = iv_package
iv_check_variant_name = lv_check_variant_name ).
mo_adhoc_code_inspector = zcl_abapgit_factory=>get_adhoc_code_inspector(
iv_package = iv_package
iv_test_name = 'CL_CI_TEST_SYNTAX_CHECK' ).
ENDMETHOD.
METHOD create_variant.
METHOD zif_abapgit_code_inspector~get_inspection.
DATA: lt_variant TYPE sci_tstvar,
ls_variant LIKE LINE OF lt_variant.
cl_ci_checkvariant=>create(
EXPORTING
p_user = sy-uname
p_name = mv_check_variant_name
RECEIVING
p_ref = mo_variant
EXCEPTIONS
chkv_already_exists = 1
locked = 2
error_in_enqueue = 3
not_authorized = 4
OTHERS = 5 ).
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Couldn't create variant. Subrc = { sy-subrc }| ).
ENDIF.
ls_variant-testname = 'CL_CI_TEST_SYNTAX_CHECK'.
INSERT ls_variant INTO TABLE lt_variant.
mo_variant->set_variant(
EXPORTING
p_variant = lt_variant
EXCEPTIONS
not_enqueued = 1
OTHERS = 2 ).
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Couldn't set variant. Subrc = { sy-subrc }| ).
ENDIF.
mo_variant->save(
EXPORTING
p_variant = mo_variant->variant
EXCEPTIONS
empty_variant = 1
transport_error = 2
not_authorized = 3
OTHERS = 4 ).
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Couldn't save variant. Subrc = { sy-subrc }| ).
ENDIF.
ro_variant = mo_variant.
ro_inspection = mo_adhoc_code_inspector->get_inspection( ).
ENDMETHOD.
METHOD cleanup.
super->cleanup( io_set ).
METHOD zif_abapgit_code_inspector~run.
IF mo_variant IS BOUND.
mo_variant->delete(
EXCEPTIONS
exists_in_insp = 1
locked = 2
error_in_enqueue = 3
not_authorized = 4
transport_error = 5
OTHERS = 6 ).
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( |Couldn't delete variant. Subrc = { sy-subrc }| ).
ENDIF.
ENDIF.
rt_list = mo_adhoc_code_inspector->run( ).
ENDMETHOD.
ENDCLASS.

View File

@ -7,7 +7,6 @@
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Syntax check</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>