├── .abapgit.xml ├── .gitignore ├── LICENSE ├── README.md ├── abaplint.json └── src ├── abapgit ├── package.devc.xml ├── zcl_agci_abapgit_utils.clas.abap └── zcl_agci_abapgit_utils.clas.xml ├── package.devc.xml ├── recipes ├── package.devc.xml ├── zagci_run_unit_tests.prog.abap └── zagci_run_unit_tests.prog.xml └── unit_tests ├── package.devc.xml ├── zagci_style.ssst.xml ├── zagci_unit_test_report.ssfo.xml ├── zcl_agci_unit_test_pdf.clas.abap ├── zcl_agci_unit_test_pdf.clas.xml ├── zcl_agci_unit_tests.clas.abap └── zcl_agci_unit_tests.clas.xml /.abapgit.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | E 6 | /src/ 7 | PREFIX 8 | 9 | /.gitignore 10 | /LICENSE 11 | /README.md 12 | /package.json 13 | /.travis.yml 14 | /.gitlab-ci.yml 15 | /abaplint.json 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | deps1 2 | 3 | deps2 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 abapGit 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ci_tools 2 | Continuous Integration tools for use with abapGit 3 | 4 | + Limit external dependencies 5 | + 740sp08 required 6 | + full installation of objects from https://github.com/larshp/abapGit required 7 | 8 | Work in progress 9 | 10 | ## Recipes 11 | todo 12 | 13 | ## Features 14 | 15 | ### Run unit tests 16 | todo 17 | 18 | ### Run code coverage 19 | todo 20 | 21 | ### REST endpoint 22 | todo 23 | -------------------------------------------------------------------------------- /abaplint.json: -------------------------------------------------------------------------------- 1 | { 2 | "global": { 3 | "files": "/src/**/*.*", 4 | "skipGeneratedGatewayClasses": true, 5 | "skipGeneratedPersistentClasses": true, 6 | "skipGeneratedFunctionGroups": true 7 | }, 8 | "dependencies": [ 9 | { 10 | "url": "https://github.com/abaplint/deps", 11 | "folder": "/deps1", 12 | "files": "/src/**/*.*" 13 | }, 14 | { 15 | "url": "https://github.com/abapGit/abapGit", 16 | "folder": "/deps2", 17 | "files": "/src/**/*.*" 18 | } 19 | ], 20 | "syntax": { 21 | "version": "v740sp08", 22 | "errorNamespace": "^(Z|Y)", 23 | "globalConstants": ["icon_green_light", "icon_red_light"] 24 | }, 25 | "rules": { 26 | "use_class_based_exceptions": true, 27 | "begin_single_include": true, 28 | "call_transaction_authority_check": true, 29 | "check_subrc": true, 30 | "cyclomatic_complexity": true, 31 | "downport": true, 32 | "forbidden_identifier": true, 33 | "forbidden_pseudo_and_pragma": true, 34 | "forbidden_void_type": true, 35 | "function_module_recommendations": true, 36 | "identical_conditions": false, 37 | "identical_contents": true, 38 | "intf_referencing_clas": true, 39 | "line_break_multiple_parameters": true, 40 | "line_break_style": false, 41 | "method_implemented_twice": true, 42 | "method_overwrites_builtin": true, 43 | "names_no_dash": true, 44 | "omit_parameter_name": true, 45 | "omit_receiving": true, 46 | "parser_702_chaining": true, 47 | "parser_missing_space": true, 48 | "prefer_inline": true, 49 | "prefer_is_not": false, 50 | "prefer_xsdbool": false, 51 | "reduce_string_templates": true, 52 | "sy_modification": true, 53 | "uncaught_exception": true, 54 | "unknown_types": true, 55 | "unused_methods": true, 56 | "unused_types": true, 57 | "use_bool_expression": true, 58 | "use_line_exists": true, 59 | "fully_type_constants": true, 60 | "keep_single_parameter_on_one_line": true, 61 | "keyword_case": true, 62 | "newline_between_methods": false, 63 | "prefer_returning_to_exporting": true, 64 | "prefix_is_current_class": true, 65 | "selection_screen_naming": true, 66 | "sicf_consistency": true, 67 | "sql_escape_host_variables": true, 68 | "try_without_catch": true, 69 | "unused_variables": false, 70 | "xml_consistency": true, 71 | "allowed_object_naming": true, 72 | "check_comments": false, 73 | "abapdoc": false, 74 | "chain_mainly_declarations": true, 75 | "check_abstract": true, 76 | "check_ddic": true, 77 | "check_include": true, 78 | "check_text_elements": true, 79 | "types_naming": true, 80 | "7bit_ascii": true, 81 | "allowed_object_types": true, 82 | "ambiguous_statement": true, 83 | "avoid_use": true, 84 | "begin_end_names": true, 85 | "check_transformation_exists": true, 86 | "check_syntax": true, 87 | "class_attribute_names": true, 88 | "cloud_types": true, 89 | "colon_missing_space": true, 90 | "commented_code": true, 91 | "constructor_visibility_public": true, 92 | "contains_tab": true, 93 | "definitions_top": true, 94 | "description_empty": true, 95 | "double_space": true, 96 | "empty_line_in_statement": true, 97 | "empty_statement": true, 98 | "empty_structure": true, 99 | "exit_or_check": true, 100 | "exporting": true, 101 | "form_tables_obsolete": true, 102 | "functional_writing": true, 103 | "global_class": true, 104 | "identical_form_names": true, 105 | "if_in_if": true, 106 | "implement_methods": true, 107 | "in_statement_indentation": true, 108 | "indentation": true, 109 | "inline_data_old_versions": true, 110 | "line_length": true, 111 | "line_only_punc": true, 112 | "local_class_naming": true, 113 | "local_variable_names": true, 114 | "main_file_contents": true, 115 | "max_one_statement": true, 116 | "message_exists": true, 117 | "method_length": true, 118 | "method_parameter_names": true, 119 | "mix_returning": true, 120 | "msag_consistency": true, 121 | "nesting": true, 122 | "no_public_attributes": true, 123 | "object_naming": true, 124 | "obsolete_statement": true, 125 | "parser_error": true, 126 | "preferred_compare_operator": true, 127 | "release_idoc": true, 128 | "remove_descriptions": true, 129 | "rfc_error_handling": true, 130 | "sequential_blank": true, 131 | "short_case": true, 132 | "space_before_colon": true, 133 | "space_before_dot": true, 134 | "start_at_tab": true, 135 | "superclass_final": true, 136 | "tabl_enhancement_category": true, 137 | "type_form_parameters": true, 138 | "unreachable_code": true, 139 | "use_new": true, 140 | "when_others_last": true, 141 | "whitespace_end": true 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /src/abapgit/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | abapGit 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/abapgit/zcl_agci_abapgit_utils.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_agci_abapgit_utils DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | 8 | METHODS find_repo_by_package 9 | IMPORTING 10 | !iv_package TYPE devclass 11 | RETURNING 12 | VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_online 13 | RAISING 14 | zcx_abapgit_exception . 15 | METHODS find_repo_by_url 16 | IMPORTING 17 | !iv_url1 TYPE string 18 | !iv_url2 TYPE string OPTIONAL 19 | RETURNING 20 | VALUE(ro_repo) TYPE REF TO zcl_abapgit_repo_online 21 | RAISING 22 | zcx_abapgit_exception . 23 | METHODS list_branches 24 | IMPORTING 25 | !io_repo TYPE REF TO zcl_abapgit_repo_online 26 | RETURNING 27 | VALUE(rt_branches) TYPE zif_abapgit_git_definitions=>ty_git_branch_list_tt 28 | RAISING 29 | zcx_abapgit_exception . 30 | METHODS pull_branch 31 | IMPORTING 32 | !io_repo TYPE REF TO zcl_abapgit_repo_online 33 | !iv_name TYPE string 34 | RAISING 35 | zcx_abapgit_exception . 36 | METHODS pull_by_sha1 37 | IMPORTING 38 | !io_repo TYPE REF TO zcl_abapgit_repo_online 39 | !iv_sha1 TYPE string 40 | RAISING 41 | zcx_abapgit_exception . 42 | PROTECTED SECTION. 43 | 44 | METHODS overwrite_all 45 | IMPORTING 46 | !is_checks TYPE zif_abapgit_definitions=>ty_deserialize_checks 47 | RETURNING 48 | VALUE(rs_checks) TYPE zif_abapgit_definitions=>ty_deserialize_checks . 49 | PRIVATE SECTION. 50 | ENDCLASS. 51 | 52 | 53 | 54 | CLASS zcl_agci_abapgit_utils IMPLEMENTATION. 55 | 56 | 57 | METHOD find_repo_by_package. 58 | 59 | DATA(lt_list) = zcl_abapgit_repo_srv=>get_instance( )->list( ). 60 | 61 | LOOP AT lt_list INTO DATA(lo_repo). 62 | IF lo_repo->is_offline( ) = abap_false. 63 | DATA(lo_online) = CAST zcl_abapgit_repo_online( lo_repo ). 64 | IF lo_online->get_package( ) = iv_package. 65 | ro_repo = lo_online. 66 | RETURN. 67 | ENDIF. 68 | ENDIF. 69 | ENDLOOP. 70 | 71 | ENDMETHOD. 72 | 73 | 74 | METHOD find_repo_by_url. 75 | 76 | DATA(lt_list) = zcl_abapgit_repo_srv=>get_instance( )->list( ). 77 | 78 | LOOP AT lt_list INTO DATA(lo_repo). 79 | IF lo_repo->is_offline( ) = abap_false. 80 | DATA(lo_online) = CAST zcl_abapgit_repo_online( lo_repo ). 81 | IF lo_online->get_url( ) = iv_url1 OR lo_online->get_url( ) = iv_url2. 82 | ro_repo = lo_online. 83 | RETURN. 84 | ENDIF. 85 | ENDIF. 86 | ENDLOOP. 87 | 88 | ENDMETHOD. 89 | 90 | 91 | METHOD list_branches. 92 | 93 | DATA(lo_branch_list) = zcl_abapgit_git_transport=>branches( io_repo->get_url( ) ). 94 | 95 | rt_branches = lo_branch_list->get_all( ). 96 | 97 | ENDMETHOD. 98 | 99 | 100 | METHOD overwrite_all. 101 | 102 | rs_checks = is_checks. 103 | 104 | LOOP AT rs_checks-overwrite ASSIGNING FIELD-SYMBOL(). 105 | -decision = 'Y'. 106 | ENDLOOP. 107 | 108 | LOOP AT rs_checks-warning_package ASSIGNING FIELD-SYMBOL(). 109 | -decision = 'Y'. 110 | ENDLOOP. 111 | 112 | IF rs_checks-requirements-met = 'N'. 113 | rs_checks-requirements-decision = 'Y'. 114 | ENDIF. 115 | 116 | ASSERT rs_checks-transport-required = abap_false. 117 | * todo, set rs_checks-transport-transport to transport number if required. 118 | 119 | ENDMETHOD. 120 | 121 | 122 | METHOD pull_branch. 123 | 124 | io_repo->select_branch( iv_name ). 125 | 126 | DATA(ls_checks) = overwrite_all( io_repo->deserialize_checks( ) ). 127 | 128 | DATA(lo_log) = NEW zcl_abapgit_log( ). 129 | 130 | io_repo->deserialize( 131 | is_checks = ls_checks 132 | ii_log = lo_log ). 133 | 134 | DATA(lt_status) = zcl_abapgit_repo_status=>calculate( io_repo ). 135 | 136 | * todo, check log and status 137 | 138 | ENDMETHOD. 139 | 140 | 141 | METHOD pull_by_sha1. 142 | 143 | DATA(lt_branches) = list_branches( io_repo ). 144 | 145 | READ TABLE lt_branches INTO DATA(ls_branch) WITH KEY sha1 = iv_sha1. 146 | IF sy-subrc = 0. 147 | pull_branch( io_repo = io_repo 148 | iv_name = ls_branch-name ). 149 | ELSE. 150 | zcx_abapgit_exception=>raise( |Branch for SHA1 not found| ). 151 | ENDIF. 152 | 153 | ENDMETHOD. 154 | ENDCLASS. 155 | -------------------------------------------------------------------------------- /src/abapgit/zcl_agci_abapgit_utils.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_AGCI_ABAPGIT_UTILS 7 | E 8 | abapGit - Utils 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | abapGit - CI Tools 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/recipes/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Recipes / Templates 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/recipes/zagci_run_unit_tests.prog.abap: -------------------------------------------------------------------------------- 1 | REPORT zagci_run_unit_tests. 2 | 3 | PARAMETERS: p_devc TYPE tdevc-devclass OBLIGATORY, 4 | p_unit RADIOBUTTON GROUP grp1 DEFAULT 'X', 5 | p_cov RADIOBUTTON GROUP grp1, 6 | p_pdf RADIOBUTTON GROUP grp1. 7 | 8 | START-OF-SELECTION. 9 | PERFORM run. 10 | 11 | FORM run RAISING zcx_abapgit_exception. 12 | 13 | CASE abap_true. 14 | WHEN p_unit. 15 | PERFORM unit. 16 | WHEN p_cov. 17 | PERFORM coverage. 18 | WHEN p_pdf. 19 | PERFORM pdf. 20 | WHEN OTHERS. 21 | ASSERT 0 = 1. 22 | ENDCASE. 23 | 24 | ENDFORM. 25 | 26 | FORM unit RAISING zcx_abapgit_exception. 27 | 28 | DATA(lt_results) = NEW zcl_agci_unit_tests( )->run( p_devc ). 29 | 30 | LOOP AT lt_results INTO DATA(ls_result). 31 | WRITE: / ls_result-tadir-obj_name, ls_result-tadir-devclass, ls_result-has_skipped. 32 | 33 | LOOP AT ls_result-tests INTO DATA(ls_test). 34 | IF ls_test-kind IS INITIAL. 35 | WRITE: / icon_green_light, ls_test-class_name, ls_test-method_name, ls_test-kind. 36 | ELSE. 37 | WRITE: / icon_red_light, ls_test-class_name, ls_test-method_name, ls_test-kind. 38 | ENDIF. 39 | WRITE: /. 40 | ENDLOOP. 41 | 42 | WRITE: /. 43 | ENDLOOP. 44 | 45 | ENDFORM. 46 | 47 | FORM coverage RAISING zcx_abapgit_exception. 48 | 49 | DATA(ls_cov_result) = NEW zcl_agci_unit_tests( )->run_with_coverage( p_devc ). 50 | DATA(lt_results) = ls_cov_result-results. 51 | 52 | WRITE: / `Branch Executed : `, ls_cov_result-coverage-branch_percentage, `%`. 53 | WRITE: / `Processing block Executed :`, ls_cov_result-coverage-block_percentage, `%`. 54 | WRITE: / `Statement Executed : `, ls_cov_result-coverage-statement_percentage, `%`. 55 | 56 | ENDFORM. 57 | 58 | FORM pdf RAISING zcx_abapgit_exception. 59 | 60 | NEW zcl_agci_unit_test_pdf( )->output( p_devc ). 61 | 62 | ENDFORM. 63 | -------------------------------------------------------------------------------- /src/recipes/zagci_run_unit_tests.prog.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZAGCI_RUN_UNIT_TESTS 7 | 1 8 | E 9 | X 10 | X 11 | 12 | 13 | 14 | R 15 | abapGit CI - Run unit tests for package 16 | 39 17 | 18 | 19 | S 20 | P_COV 21 | Test incl. coverage 22 | 27 23 | 24 | 25 | S 26 | P_DEVC 27 | . 28 | 15 29 | D 30 | 31 | 32 | S 33 | P_PDF 34 | PDF 35 | 11 36 | 37 | 38 | S 39 | P_UNIT 40 | Test unit tests 41 | 23 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/unit_tests/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Unit tests 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/unit_tests/zagci_style.ssst.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 |
6 | ZAGCI_STYLE 7 | E 8 | E 9 | Style ZAGCI_STYLE 10 | Style ZAGCI_STYLE 11 | L 12 | 10.0 13 | 6.0 14 | 1.0 15 | CM 16 | A 17 | HELVE 18 | 120 19 |
20 | 21 | 22 | A 23 | ZAGCI_STYLE 24 | L 25 | LEFT 26 | 1.0 27 | LN 28 | CM 29 | CM 30 | CM 31 | CM 32 | CM 33 | * 34 | * 35 | * 36 | E 37 | Left aligned 38 | 39 | 40 | 41 | 42 | A 43 | ZAGCI_STYLE 44 | FF 45 | * 46 | * 47 | * 48 | * 49 | COURIER 50 | * 51 | * 52 | * 53 | E 54 | Fixed Font 55 | 56 | 57 | A 58 | ZAGCI_STYLE 59 | H 60 | * 61 | * 62 | * 63 | * 64 | HELVE 65 | 240 66 | X 67 | * 68 | * 69 | E 70 | Heading 71 | 72 | 73 | A 74 | ZAGCI_STYLE 75 | U 76 | * 77 | * 78 | * 79 | * 80 | * 81 | * 82 | X 83 | E 84 | Underline 85 | 86 | 87 |
88 |
89 |
90 | -------------------------------------------------------------------------------- /src/unit_tests/zagci_unit_test_report.ssfo.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 |
5 | ZAGCI_UNIT_TEST_REPORT 6 | abapGit CI - Unit Test Report 7 | E 8 | * 9 | 10 | 00001 11 | DUMMY 12 | 2020-03-27 13 | 11:05:18 14 | DUMMY 15 | 16 | 17 |
18 | 19 | 20 | E 21 | DOCUMENT_OUTPUT_INFO 22 | TYPE 23 | SSFCRESPD 24 | X 25 | X 26 | 27 | 28 | E 29 | JOB_OUTPUT_INFO 30 | TYPE 31 | SSFCRESCL 32 | X 33 | X 34 | 35 | 36 | E 37 | JOB_OUTPUT_OPTIONS 38 | TYPE 39 | SSFCRESOP 40 | X 41 | X 42 | 43 | 44 | I 45 | ARCHIVE_INDEX 46 | TYPE 47 | TOA_DARA 48 | X 49 | X 50 | X 51 | 52 | 53 | I 54 | ARCHIVE_INDEX_TAB 55 | TYPE 56 | TSFDARA 57 | X 58 | X 59 | X 60 | 61 | 62 | I 63 | ARCHIVE_PARAMETERS 64 | TYPE 65 | ARC_PARAMS 66 | X 67 | X 68 | X 69 | 70 | 71 | I 72 | CONTROL_PARAMETERS 73 | TYPE 74 | SSFCTRLOP 75 | X 76 | X 77 | X 78 | 79 | 80 | I 81 | MAIL_APPL_OBJ 82 | TYPE 83 | SWOTOBJID 84 | X 85 | X 86 | X 87 | 88 | 89 | I 90 | MAIL_RECIPIENT 91 | TYPE 92 | SWOTOBJID 93 | X 94 | X 95 | X 96 | 97 | 98 | I 99 | MAIL_SENDER 100 | TYPE 101 | SWOTOBJID 102 | X 103 | X 104 | X 105 | 106 | 107 | I 108 | OUTPUT_OPTIONS 109 | TYPE 110 | SSFCOMPOP 111 | X 112 | X 113 | X 114 | 115 | 116 | I 117 | USER_SETTINGS 118 | TYPE 119 | TDBOOL 120 | X 121 | X 122 | 'X' 123 | X 124 | 125 | 126 | I 127 | IS_COVERAGE 128 | TYPE 129 | ZCL_AGCI_UNIT_TESTS=>TY_COV_RESULT 130 | 131 | 132 | I 133 | IS_INFO 134 | TYPE 135 | ZCL_AGCI_UNIT_TEST_PDF=>TY_INFO 136 | 137 | 138 | X 139 | FORMATTING_ERROR 140 | X 141 | 142 | 143 | X 144 | INTERNAL_ERROR 145 | X 146 | 147 | 148 | X 149 | SEND_ERROR 150 | X 151 | 152 | 153 | X 154 | USER_CANCELED 155 | X 156 | 157 | 158 | 159 | 160 | GS_RESULT 161 | TYPE 162 | ZCL_AGCI_UNIT_TESTS=>TY_RESULT 163 | 164 | 165 | GS_TEST 166 | TYPE 167 | ZCL_AGCI_UNIT_TESTS=>TY_TEST 168 | 169 | 170 | 171 | 172 | GS_RESULT 173 | I 174 | 175 | 176 | GS_TEST 177 | I 178 | 179 | 180 | 181 | CLEAR gs_result. 182 | CLEAR gs_test. 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | DINA4 209 | 10.00 210 | 6.00 211 | ZAGCI_STYLE 212 | 213 | 214 | RP 215 | 216 | 217 | 218 | PA 219 | 220 | 221 | 222 | %PAGE1 223 | 224 | New Page 225 | 226 | %PAGE1 227 | 228 | I 229 | A 230 | P 231 | 232 | 233 | E 234 | ZAGCI_UNIT_TEST_REPORT 235 | PA 236 | %PAGE1 237 | New Page 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | WI 246 | 247 | 248 | 249 | MAIN 250 | 251 | Main Window 252 | M 253 | 254 | 255 | E 256 | ZAGCI_UNIT_TEST_REPORT 257 | WI 258 | MAIN 259 | Main Window 260 | 261 | 262 | 263 | 264 | RC 265 | 266 | 267 | 268 | TI 269 | 270 | 271 | 272 | %TEXT1 273 | 274 | Headings 275 | P 276 | 277 | 278 | * 279 | <H>Unit Test Report</> 280 | 281 | 282 | * 283 | 284 | 285 | * 286 | System:,,<FF>&IS_INFO-SYSID&</> 287 | 288 | 289 | * 290 | Package:,,<FF>&IS_INFO-DEVCLASS&</> 291 | 292 | 293 | * 294 | URL:,,,,&IS_INFO-URL& 295 | 296 | 297 | * 298 | Branch:,,&IS_INFO-BRANCH& 299 | 300 | 301 | * 302 | Time:,,&IS_INFO-TIME& 303 | 304 | 305 | * 306 | 307 | 308 | * 309 | Branch:,,,,&IS_COVERAGE-COVERAGE-BRANCH_PERCENTAGE&% 310 | 311 | 312 | * 313 | Block:,,,,&IS_COVERAGE-COVERAGE-BLOCK_PERCENTAGE&% 314 | 315 | 316 | * 317 | Statement:,,&IS_COVERAGE-COVERAGE-STATEMENT_PERCENTAGE&% 318 | 319 | 320 | * 321 | 322 | 323 | ZAGCI_STYLE 324 | 325 | F 326 | 0 327 | 0 328 | 329 | 330 | 331 | E 332 | ZAGCI_UNIT_TEST_REPORT 333 | TI 334 | %TEXT1 335 | Headings 336 | 337 | 338 | 339 | 340 | E 341 | F 342 | ZAGCI_UNIT_TEST_REPORT 343 | %TEXT1 344 | 000001 345 | * 346 | <H>Unit Test Report</> 347 | 348 | 349 | E 350 | F 351 | ZAGCI_UNIT_TEST_REPORT 352 | %TEXT1 353 | 000002 354 | * 355 | 356 | 357 | E 358 | F 359 | ZAGCI_UNIT_TEST_REPORT 360 | %TEXT1 361 | 000003 362 | * 363 | System:,,<FF>&IS_INFO-SYSID&</> 364 | 365 | 366 | E 367 | F 368 | ZAGCI_UNIT_TEST_REPORT 369 | %TEXT1 370 | 000004 371 | * 372 | Package:,,<FF>&IS_INFO-DEVCLASS&</> 373 | 374 | 375 | E 376 | F 377 | ZAGCI_UNIT_TEST_REPORT 378 | %TEXT1 379 | 000005 380 | * 381 | URL:,,,,&IS_INFO-URL& 382 | 383 | 384 | E 385 | F 386 | ZAGCI_UNIT_TEST_REPORT 387 | %TEXT1 388 | 000006 389 | * 390 | Branch:,,&IS_INFO-BRANCH& 391 | 392 | 393 | E 394 | F 395 | ZAGCI_UNIT_TEST_REPORT 396 | %TEXT1 397 | 000007 398 | * 399 | Time:,,&IS_INFO-TIME& 400 | 401 | 402 | E 403 | F 404 | ZAGCI_UNIT_TEST_REPORT 405 | %TEXT1 406 | 000008 407 | * 408 | 409 | 410 | E 411 | F 412 | ZAGCI_UNIT_TEST_REPORT 413 | %TEXT1 414 | 000009 415 | * 416 | Branch:,,,,&IS_COVERAGE-COVERAGE-BRANCH_PERCENTAGE&% 417 | 418 | 419 | E 420 | F 421 | ZAGCI_UNIT_TEST_REPORT 422 | %TEXT1 423 | 000010 424 | * 425 | Block:,,,,&IS_COVERAGE-COVERAGE-BLOCK_PERCENTAGE&% 426 | 427 | 428 | E 429 | F 430 | ZAGCI_UNIT_TEST_REPORT 431 | %TEXT1 432 | 000011 433 | * 434 | Statement:,,&IS_COVERAGE-COVERAGE-STATEMENT_PERCENTAGE&% 435 | 436 | 437 | E 438 | F 439 | ZAGCI_UNIT_TEST_REPORT 440 | %TEXT1 441 | 000012 442 | * 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | SE 453 | 454 | 455 | 456 | %LOOP1 457 | 458 | Loop: Objects 459 | L 460 | L 461 | IS_COVERAGE-RESULTS 462 | I 463 | GS_RESULT 464 | CM 465 | 466 | 0000 467 | 0.00 468 | PT 469 | 470 | CM 471 | CM 472 | CM 473 | CM 474 | CM 475 | 476 | 477 | E 478 | ZAGCI_UNIT_TEST_REPORT 479 | SE 480 | %LOOP1 481 | Loop: Objects 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | TI 490 | 491 | 492 | 493 | %TEXT2 494 | 495 | Object Information 496 | X 497 | P 498 | 499 | 500 | * 501 | <U>&GS_RESULT-TADIR-OBJ_NAME& &GS_RESULT-TADIR-DEVCLASS&</> 502 | 503 | 504 | ZAGCI_STYLE 505 | 506 | F 507 | 0 508 | 0 509 | 510 | 511 | 512 | E 513 | ZAGCI_UNIT_TEST_REPORT 514 | TI 515 | %TEXT2 516 | Object Information 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | SE 527 | 528 | 529 | 530 | %LOOP2 531 | 532 | Loop: Tests 533 | L 534 | L 535 | GS_RESULT-TESTS 536 | I 537 | GS_TEST 538 | CM 539 | 540 | 0000 541 | 0.00 542 | PT 543 | 544 | CM 545 | CM 546 | CM 547 | CM 548 | CM 549 | 550 | 551 | E 552 | ZAGCI_UNIT_TEST_REPORT 553 | SE 554 | %LOOP2 555 | Loop: Tests 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | CD 564 | 565 | 566 | 567 | %CONDITION2 568 | 569 | Check Success 570 | 571 | 572 | EQ 573 | GS_TEST-KIND 574 | '' 575 | @20\QSelect: Equal to@ 576 | 577 | 578 | 579 | 580 | E 581 | ZAGCI_UNIT_TEST_REPORT 582 | CD 583 | %CONDITION2 584 | Check Success 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | EV 593 | 594 | 595 | 596 | %EVENT1 597 | 598 | TRUE 599 | + 600 | 601 | 602 | E 603 | ZAGCI_UNIT_TEST_REPORT 604 | EV 605 | %EVENT1 606 | TRUE 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | TI 615 | 616 | 617 | 618 | %TEXT3 619 | 620 | Test Information, Green 621 | X 622 | P 623 | 624 | 625 | * 626 | &GS_TEST-CLASS_NAME&,,&GS_TEST-METHOD_NAME& 627 | 628 | 629 | ZAGCI_STYLE 630 | 631 | F 632 | 0 633 | 0 634 | 635 | 636 | 637 | E 638 | ZAGCI_UNIT_TEST_REPORT 639 | TI 640 | %TEXT3 641 | Test Information, Green 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | %OUTATTRIB2 650 | 651 | PT 652 | CM 653 | CM 654 | 100 655 | 656 | 000 657 | 255 658 | 000 659 | 000 660 | 661 | CM 662 | CM 663 | CM 664 | CM 665 | 666 | 667 | 0.00 668 | PT 669 | 0.00 670 | CM 671 | 672 | 000 673 | 000 674 | 000 675 | 000 676 | 677 | 678 | 679 | 0.00 680 | PT 681 | 0.00 682 | CM 683 | 684 | 000 685 | 000 686 | 000 687 | 000 688 | 689 | 690 | 691 | 0.00 692 | PT 693 | 0.00 694 | CM 695 | 696 | 000 697 | 000 698 | 000 699 | 000 700 | 701 | 702 | 703 | 0.00 704 | PT 705 | 0.00 706 | CM 707 | 708 | 000 709 | 000 710 | 000 711 | 000 712 | 713 | 714 | 715 | 716 | 717 | E 718 | ZAGCI_UNIT_TEST_REPORT 719 | OA 720 | %OUTATTRIB2 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | EV 734 | 735 | 736 | 737 | %EVENT2 738 | 739 | FALSE 740 | - 741 | 742 | 743 | E 744 | ZAGCI_UNIT_TEST_REPORT 745 | EV 746 | %EVENT2 747 | FALSE 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | TI 756 | 757 | 758 | 759 | %TEXT4 760 | 761 | Test Information, Red 762 | X 763 | P 764 | 765 | 766 | * 767 | &GS_TEST-CLASS_NAME&,,&GS_TEST-METHOD_NAME& 768 | 769 | 770 | ZAGCI_STYLE 771 | 772 | F 773 | 0 774 | 0 775 | 776 | 777 | 778 | E 779 | ZAGCI_UNIT_TEST_REPORT 780 | TI 781 | %TEXT4 782 | Test Information, Red 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | %OUTATTRIB3 791 | 792 | PT 793 | CM 794 | CM 795 | 100 796 | 797 | 255 798 | 000 799 | 000 800 | 000 801 | 802 | CM 803 | CM 804 | CM 805 | CM 806 | 807 | 808 | 0.00 809 | PT 810 | 0.00 811 | CM 812 | 813 | 000 814 | 000 815 | 000 816 | 000 817 | 818 | 819 | 820 | 0.00 821 | PT 822 | 0.00 823 | CM 824 | 825 | 000 826 | 000 827 | 000 828 | 000 829 | 830 | 831 | 832 | 0.00 833 | PT 834 | 0.00 835 | CM 836 | 837 | 000 838 | 000 839 | 000 840 | 000 841 | 842 | 843 | 844 | 0.00 845 | PT 846 | 0.00 847 | CM 848 | 849 | 000 850 | 000 851 | 000 852 | 000 853 | 854 | 855 | 856 | 857 | 858 | E 859 | ZAGCI_UNIT_TEST_REPORT 860 | OA 861 | %OUTATTRIB3 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | %OUTATTRIB1 890 | 891 | New Display Option 892 | PT 893 | CM 894 | CM 895 | 2.50 896 | CM 897 | 16.00 898 | CM 899 | 2.50 900 | CM 901 | 25.20 902 | CM 903 | 904 | 905 | 0.00 906 | PT 907 | 0.00 908 | CM 909 | 910 | 000 911 | 000 912 | 000 913 | 000 914 | 915 | 916 | 917 | 0.00 918 | PT 919 | 0.00 920 | CM 921 | 922 | 000 923 | 000 924 | 000 925 | 000 926 | 927 | 928 | 929 | 0.00 930 | PT 931 | 0.00 932 | CM 933 | 934 | 000 935 | 000 936 | 000 937 | 000 938 | 939 | 940 | 941 | 0.00 942 | PT 943 | 0.00 944 | CM 945 | 946 | 000 947 | 000 948 | 000 949 | 000 950 | 951 | 952 | 953 | 954 | 955 | E 956 | ZAGCI_UNIT_TEST_REPORT 957 | OA 958 | %OUTATTRIB1 959 | New Display Option 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 |
976 |
977 | -------------------------------------------------------------------------------- /src/unit_tests/zcl_agci_unit_test_pdf.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_agci_unit_test_pdf DEFINITION 2 | PUBLIC 3 | CREATE PUBLIC . 4 | 5 | PUBLIC SECTION. 6 | 7 | TYPES: BEGIN OF ty_info, 8 | sysid LIKE sy-sysid, 9 | devclass TYPE devclass, 10 | url TYPE string, 11 | branch TYPE string, 12 | time TYPE string, 13 | END OF ty_info. 14 | 15 | METHODS output 16 | IMPORTING 17 | !iv_devclass TYPE devclass 18 | RAISING 19 | zcx_abapgit_exception . 20 | PROTECTED SECTION. 21 | 22 | METHODS call_smartform 23 | IMPORTING 24 | !is_coverage TYPE zcl_agci_unit_tests=>ty_cov_result 25 | !is_info TYPE ty_info . 26 | PRIVATE SECTION. 27 | ENDCLASS. 28 | 29 | 30 | 31 | CLASS ZCL_AGCI_UNIT_TEST_PDF IMPLEMENTATION. 32 | 33 | 34 | METHOD call_smartform. 35 | 36 | DATA: lv_fm TYPE rs38l_fnam. 37 | 38 | CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' 39 | EXPORTING 40 | formname = 'ZAGCI_UNIT_TEST_REPORT' 41 | IMPORTING 42 | fm_name = lv_fm. 43 | 44 | CALL FUNCTION lv_fm 45 | EXPORTING 46 | * ARCHIVE_INDEX = 47 | * ARCHIVE_INDEX_TAB = 48 | * ARCHIVE_PARAMETERS = 49 | * CONTROL_PARAMETERS = 50 | * MAIL_APPL_OBJ = 51 | * MAIL_RECIPIENT = 52 | * MAIL_SENDER = 53 | * OUTPUT_OPTIONS = 54 | * USER_SETTINGS = 'X' 55 | is_coverage = is_coverage 56 | is_info = is_info 57 | * IMPORTING 58 | * DOCUMENT_OUTPUT_INFO = 59 | * JOB_OUTPUT_INFO = 60 | * JOB_OUTPUT_OPTIONS = 61 | EXCEPTIONS 62 | formatting_error = 1 63 | internal_error = 2 64 | send_error = 3 65 | user_canceled = 4 66 | OTHERS = 5. 67 | ASSERT sy-subrc <> 0 AND sy-subrc <> 0. 68 | 69 | ENDMETHOD. 70 | 71 | 72 | METHOD output. 73 | 74 | DATA(ls_coverage) = NEW zcl_agci_unit_tests( )->run_with_coverage( iv_devclass ). 75 | 76 | DATA(ls_info) = VALUE ty_info( 77 | sysid = sy-sysid 78 | devclass = iv_devclass 79 | time = |{ sy-datlo DATE = ENVIRONMENT } { sy-timlo TIME = ENVIRONMENT } { sy-zonlo }| ). 80 | 81 | DATA(lo_repo) = NEW zcl_agci_abapgit_utils( )->find_repo_by_package( iv_devclass ). 82 | IF lo_repo IS BOUND. 83 | ls_info-url = lo_repo->get_url( ). 84 | ls_info-branch = lo_repo->get_selected_branch( ). 85 | ENDIF. 86 | 87 | call_smartform( 88 | is_coverage = ls_coverage 89 | is_info = ls_info ). 90 | 91 | ENDMETHOD. 92 | ENDCLASS. 93 | -------------------------------------------------------------------------------- /src/unit_tests/zcl_agci_unit_test_pdf.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_AGCI_UNIT_TEST_PDF 7 | E 8 | abapGit CI - Output PDF with results 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/unit_tests/zcl_agci_unit_tests.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_agci_unit_tests DEFINITION 2 | PUBLIC 3 | CREATE PUBLIC . 4 | 5 | PUBLIC SECTION. 6 | 7 | TYPES: 8 | BEGIN OF ty_test, 9 | program_name TYPE objname, 10 | class_name TYPE objname, 11 | method_name TYPE objname, 12 | kind TYPE c LENGTH 1, 13 | END OF ty_test . 14 | TYPES: 15 | ty_tests TYPE STANDARD TABLE OF ty_test WITH EMPTY KEY . 16 | TYPES: 17 | BEGIN OF ty_coverage_st, 18 | object TYPE sobj_name, 19 | executed TYPE i, 20 | not_executed TYPE i, 21 | percentage TYPE decfloat16, 22 | type TYPE string, 23 | END OF ty_coverage_st . 24 | TYPES: 25 | ty_coverage_tt TYPE STANDARD TABLE OF ty_coverage_st WITH EMPTY KEY . 26 | TYPES: 27 | BEGIN OF ty_coverage_pct_st, 28 | branch_percentage TYPE p LENGTH 5 DECIMALS 2, 29 | block_percentage TYPE p LENGTH 5 DECIMALS 2, 30 | statement_percentage TYPE p LENGTH 5 DECIMALS 2, 31 | END OF ty_coverage_pct_st. 32 | 33 | TYPES: 34 | BEGIN OF ty_result, 35 | tadir TYPE tadir, 36 | has_skipped TYPE abap_bool, 37 | tests TYPE ty_tests, 38 | coverages TYPE ty_coverage_tt, 39 | END OF ty_result . 40 | TYPES: 41 | ty_results TYPE STANDARD TABLE OF ty_result WITH EMPTY KEY . 42 | 43 | TYPES: 44 | BEGIN OF ty_cov_result, 45 | coverage TYPE ty_coverage_pct_st, 46 | results TYPE ty_results, 47 | END OF ty_cov_result. 48 | 49 | METHODS run 50 | IMPORTING 51 | !iv_devclass TYPE devclass 52 | RETURNING 53 | VALUE(rt_results) TYPE ty_results 54 | RAISING 55 | zcx_abapgit_exception . 56 | METHODS run_with_coverage 57 | IMPORTING 58 | !iv_devclass TYPE devclass 59 | RETURNING 60 | VALUE(rs_cov_result) TYPE ty_cov_result 61 | RAISING 62 | zcx_abapgit_exception . 63 | PROTECTED SECTION. 64 | 65 | METHODS calc_coverage_pct 66 | IMPORTING 67 | !it_results TYPE ty_results 68 | RETURNING 69 | VALUE(rs_coverage_pct) TYPE ty_coverage_pct_st . 70 | METHODS analyze_result 71 | IMPORTING 72 | !io_result TYPE REF TO cl_saunit_internal_result 73 | RETURNING 74 | VALUE(rt_tests) TYPE ty_tests . 75 | METHODS get_runner 76 | IMPORTING 77 | !iv_coverage TYPE abap_bool DEFAULT abap_false 78 | RETURNING 79 | VALUE(ro_runner) TYPE REF TO cl_aucv_test_runner_abstract . 80 | METHODS run_coverage 81 | IMPORTING 82 | !is_tadir TYPE tadir 83 | EXPORTING 84 | !et_tests TYPE ty_tests 85 | !ev_has_skipped_tests TYPE abap_bool 86 | !et_coverages TYPE ty_coverage_tt 87 | RAISING 88 | cx_scv_execution_error 89 | cx_scv_call_error . 90 | METHODS run_normal 91 | IMPORTING 92 | !is_tadir TYPE tadir 93 | EXPORTING 94 | !et_tests TYPE ty_tests 95 | !ev_has_skipped_tests TYPE abap_bool . 96 | METHODS has_tests 97 | IMPORTING 98 | !is_tadir TYPE tadir 99 | RETURNING 100 | VALUE(rv_has_tests) TYPE abap_bool . 101 | PRIVATE SECTION. 102 | ENDCLASS. 103 | 104 | 105 | 106 | CLASS zcl_agci_unit_tests IMPLEMENTATION. 107 | 108 | 109 | METHOD analyze_result. 110 | 111 | LOOP AT io_result->f_task_data-programs INTO DATA(ls_program). 112 | DATA(lv_program_index) = sy-tabix. 113 | LOOP AT ls_program-classes INTO DATA(ls_class). 114 | DATA(lv_class_index) = sy-tabix. 115 | LOOP AT ls_class-methods INTO DATA(ls_method). 116 | DATA(lv_method_index) = sy-tabix. 117 | 118 | READ TABLE io_result->f_task_data-alerts_by_indicies WITH KEY 119 | program_ndx = lv_program_index 120 | class_ndx = lv_class_index 121 | method_ndx = lv_method_index 122 | INTO DATA(ls_alert). 123 | IF sy-subrc = 0. 124 | DATA(lv_kind) = ls_alert-alerts[ 1 ]-kind. 125 | ELSE. 126 | CLEAR lv_kind. 127 | ENDIF. 128 | 129 | APPEND VALUE #( 130 | program_name = ls_program-info-name 131 | class_name = ls_class-info-name 132 | method_name = ls_method-info-name 133 | kind = lv_kind ) TO rt_tests. 134 | 135 | ENDLOOP. 136 | ENDLOOP. 137 | ENDLOOP. 138 | 139 | ENDMETHOD. 140 | 141 | 142 | METHOD calc_coverage_pct. 143 | 144 | DATA: lv_branch_exe TYPE i, 145 | lv_branch_total TYPE i, 146 | lv_block_exe TYPE i, 147 | lv_block_total TYPE i, 148 | lv_statement_exe TYPE i, 149 | lv_statement_total TYPE i. 150 | 151 | LOOP AT it_results INTO DATA(ls_result). 152 | LOOP AT ls_result-coverages INTO DATA(ls_coverage). 153 | CASE ls_coverage-type. 154 | WHEN 'Branch Coverage'. 155 | lv_branch_exe = lv_branch_exe + ls_coverage-executed. 156 | lv_branch_total = lv_branch_total + ls_coverage-executed + ls_coverage-not_executed. 157 | WHEN 'Processing Block Coverage'. 158 | lv_block_exe = lv_block_exe + ls_coverage-executed. 159 | lv_block_total = lv_block_total + ls_coverage-not_executed. 160 | WHEN 'Statement Coverage'. 161 | lv_statement_exe = lv_statement_exe + ls_coverage-executed. 162 | lv_statement_total = lv_statement_total + ls_coverage-executed + ls_coverage-not_executed. 163 | ENDCASE. 164 | ENDLOOP. 165 | ENDLOOP. 166 | 167 | rs_coverage_pct-branch_percentage = lv_branch_exe / lv_branch_total * 100. 168 | rs_coverage_pct-block_percentage = lv_block_exe / lv_block_total * 100. 169 | rs_coverage_pct-statement_percentage = lv_statement_exe / lv_statement_total * 100. 170 | 171 | ENDMETHOD. 172 | 173 | 174 | METHOD get_runner. 175 | 176 | DATA: lo_passport TYPE REF TO object. 177 | 178 | 179 | CALL METHOD ('\PROGRAM=SAPLSAUCV_GUI_RUNNER\CLASS=PASSPORT')=>get 180 | RECEIVING 181 | result = lo_passport. 182 | 183 | IF iv_coverage = abap_true. 184 | ro_runner = cl_aucv_test_runner_coverage=>create( lo_passport ). 185 | ELSE. 186 | ro_runner = cl_aucv_test_runner_standard=>create( lo_passport ). 187 | ENDIF. 188 | 189 | ENDMETHOD. 190 | 191 | 192 | METHOD has_tests. 193 | 194 | DATA(ls_aunit_info) = cl_aunit_prog_info=>get_program_info( 195 | allow_commit = abap_true 196 | obj_type = is_tadir-object 197 | obj_name = is_tadir-obj_name ). 198 | 199 | rv_has_tests = ls_aunit_info-has_tests. 200 | 201 | ENDMETHOD. 202 | 203 | 204 | METHOD run. 205 | 206 | DATA(lt_tadir) = zcl_abapgit_factory=>get_tadir( )->read( iv_devclass ). 207 | DELETE lt_tadir WHERE object <> 'CLAS' AND object <> 'PROG' AND object <> 'FUGR'. 208 | 209 | LOOP AT lt_tadir INTO DATA(ls_tadir). 210 | 211 | IF has_tests( CORRESPONDING #( ls_tadir ) ) = abap_false. 212 | CONTINUE. 213 | ENDIF. 214 | 215 | run_normal( 216 | EXPORTING 217 | is_tadir = CORRESPONDING #( ls_tadir ) 218 | IMPORTING 219 | et_tests = DATA(lt_tests) 220 | ev_has_skipped_tests = DATA(lv_has_skipped) ). 221 | 222 | APPEND VALUE #( 223 | tadir = CORRESPONDING #( ls_tadir ) 224 | has_skipped = lv_has_skipped 225 | tests = lt_tests ) TO rt_results. 226 | 227 | ENDLOOP. 228 | 229 | ENDMETHOD. 230 | 231 | 232 | METHOD run_coverage. 233 | 234 | CONSTANTS: lc_harmless TYPE saunit_d_allowed_risk_level VALUE 11, 235 | lc_medium TYPE saunit_d_allowed_rt_duration VALUE 24. 236 | 237 | DATA: lo_casted TYPE REF TO cl_saunit_internal_result, 238 | lo_cvrg_rslt_provider TYPE REF TO if_aucv_cvrg_rslt_provider. 239 | 240 | get_runner( abap_true )->run_for_program_keys( 241 | EXPORTING 242 | i_limit_on_duration_category = lc_medium 243 | i_limit_on_risk_level = lc_harmless 244 | i_program_keys = VALUE #( ( CORRESPONDING #( is_tadir MAPPING obj_type = object ) ) ) 245 | IMPORTING 246 | e_aunit_result = DATA(li_aunit) 247 | e_coverage_result = lo_cvrg_rslt_provider ). 248 | 249 | DATA(lo_result) = lo_cvrg_rslt_provider->build_coverage_result( ). 250 | 251 | LOOP AT lo_result->get_coverages( ) INTO DATA(ls_coverages). 252 | INSERT VALUE #( object = is_tadir-obj_name 253 | executed = ls_coverages->get_executed( ) 254 | not_executed = ls_coverages->get_not_executed( ) 255 | percentage = ls_coverages->get_percentage( ) 256 | type = ls_coverages->type->text 257 | ) INTO TABLE et_coverages. 258 | ENDLOOP. 259 | 260 | lo_casted ?= li_aunit. 261 | 262 | ev_has_skipped_tests = lo_casted->f_task_data-info-has_skipped. 263 | 264 | et_tests = analyze_result( lo_casted ). 265 | 266 | ENDMETHOD. 267 | 268 | 269 | METHOD run_normal. 270 | 271 | CONSTANTS: lc_harmless TYPE saunit_d_allowed_risk_level VALUE 11, 272 | lc_medium TYPE saunit_d_allowed_rt_duration VALUE 24. 273 | 274 | DATA: lo_casted TYPE REF TO cl_saunit_internal_result. 275 | 276 | get_runner( )->run_for_program_keys( 277 | EXPORTING 278 | i_limit_on_duration_category = lc_medium 279 | i_limit_on_risk_level = lc_harmless 280 | i_program_keys = VALUE #( ( CORRESPONDING #( is_tadir MAPPING obj_type = object ) ) ) 281 | IMPORTING 282 | e_aunit_result = DATA(li_aunit) ). 283 | 284 | lo_casted ?= li_aunit. 285 | 286 | ev_has_skipped_tests = lo_casted->f_task_data-info-has_skipped. 287 | 288 | et_tests = analyze_result( lo_casted ). 289 | 290 | ENDMETHOD. 291 | 292 | 293 | METHOD run_with_coverage. 294 | 295 | DATA(lt_tadir) = zcl_abapgit_factory=>get_tadir( )->read( iv_devclass ). 296 | DELETE lt_tadir WHERE object <> 'CLAS' AND object <> 'PROG' AND object <> 'FUGR'. 297 | 298 | LOOP AT lt_tadir INTO DATA(ls_tadir). 299 | 300 | TRY. 301 | run_coverage( 302 | EXPORTING 303 | is_tadir = CORRESPONDING #( ls_tadir ) 304 | IMPORTING 305 | et_tests = DATA(lt_tests) 306 | ev_has_skipped_tests = DATA(lv_has_skipped) 307 | et_coverages = DATA(lt_coverages) ). 308 | CATCH cx_scv_call_error cx_scv_execution_error. 309 | CONTINUE. 310 | ENDTRY. 311 | 312 | APPEND VALUE #( 313 | tadir = CORRESPONDING #( ls_tadir ) 314 | has_skipped = lv_has_skipped 315 | tests = lt_tests 316 | coverages = lt_coverages ) TO rs_cov_result-results. 317 | 318 | ENDLOOP. 319 | 320 | rs_cov_result-coverage = calc_coverage_pct( rs_cov_result-results ). 321 | 322 | ENDMETHOD. 323 | ENDCLASS. 324 | -------------------------------------------------------------------------------- /src/unit_tests/zcl_agci_unit_tests.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_AGCI_UNIT_TESTS 7 | E 8 | abapGit CI - Run unit tests 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | --------------------------------------------------------------------------------