diff --git a/source/reporters/ut_coverage_cobertura_reporter.tpb b/source/reporters/ut_coverage_cobertura_reporter.tpb index 18221e3d9..56fd4b524 100644 --- a/source/reporters/ut_coverage_cobertura_reporter.tpb +++ b/source/reporters/ut_coverage_cobertura_reporter.tpb @@ -1,160 +1,160 @@ -create or replace type body ut_coverage_cobertura_reporter is - /* - utPLSQL - Version 3 - Copyright 2016 - 2018 utPLSQL Project - - Licensed under the Apache License, Version 2.0 (the "License"): - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - - constructor function ut_coverage_cobertura_reporter( - self in out nocopy ut_coverage_cobertura_reporter - ) return self as result is - begin - self.init($$plsql_unit); - return; - end; - - - overriding member procedure after_calling_run(self in out nocopy ut_coverage_cobertura_reporter, a_run in ut_run) as - l_report_lines ut_varchar2_list; - l_coverage_data ut_coverage.t_coverage; - - function get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage) return clob is - l_file_part varchar2(32767); - l_result clob; - l_line_no binary_integer; - l_pct integer; - begin - dbms_lob.createtemporary(l_result, true); - l_line_no := a_unit_coverage.lines.first; - if l_line_no is null then - for i in 1 .. a_unit_coverage.total_lines loop - ut_utils.append_to_clob(l_result, ''); - end loop; - else - while l_line_no is not null loop - if a_unit_coverage.lines(l_line_no).executions = 0 then - l_file_part := ''||chr(10); - else - l_file_part := ''||chr(10); - end if; - ut_utils.append_to_clob(l_result, l_file_part); - l_line_no := a_unit_coverage.lines.next(l_line_no); - end loop; - end if; - return l_result; - end; - - function get_coverage_xml( - a_coverage_data ut_coverage.t_coverage, - a_run ut_run - ) return ut_varchar2_rows is - l_file_part varchar2(32767); - l_result ut_varchar2_rows := ut_varchar2_rows(); - l_unit ut_coverage.t_full_name; - l_obj_name ut_coverage.t_object_name; - c_coverage_def constant varchar2(200) := ''; - c_file_footer constant varchar2(30) := ''; - c_coverage_footer constant varchar2(30) := ''; - c_sources_footer constant varchar2(30) := ''; - c_packages_footer constant varchar2(30) := ''; - c_package_footer constant varchar2(30) := ''; - c_class_footer constant varchar2(30) := ''; - c_lines_footer constant varchar2(30) := ''; - l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60; - begin - - ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) ); - ut_utils.append_to_list( l_result, c_coverage_def ); - - --write header - ut_utils.append_to_list( - l_result, - '' - ); - - - --Write sources - l_unit := a_coverage_data.objects.first; - ut_utils.append_to_list( l_result, '' ); - - while l_unit is not null loop - ut_utils.append_to_list(l_result, ''||dbms_xmlgen.convert(l_unit)||''); - l_unit := a_coverage_data.objects.next(l_unit); - end loop; - ut_utils.append_to_list(l_result, c_sources_footer); - - --write packages - l_unit := a_coverage_data.objects.first; - ut_utils.append_to_list(l_result, ''); - - while l_unit is not null loop - l_obj_name := a_coverage_data.objects(l_unit).name; - ut_utils.append_to_list( - l_result, - '' - ); - - ut_utils.append_to_list( - l_result, - '' - ); - - ut_utils.append_to_list(l_result, ''); - - ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) ); - - ut_utils.append_to_list(l_result, c_lines_footer); - ut_utils.append_to_list(l_result, c_class_footer); - ut_utils.append_to_list(l_result, c_package_footer); - - l_unit := a_coverage_data.objects.next(l_unit); - end loop; - - ut_utils.append_to_list(l_result, c_packages_footer); - ut_utils.append_to_list(l_result, c_coverage_footer); - return l_result; - end; - begin - ut_coverage.coverage_stop(); - - l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options); - - self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) ); - - (self as ut_reporter_base).after_calling_run(a_run); - end; - - overriding member function get_description return varchar2 as - begin - return 'Generates a Cobertura coverage report providing information on code coverage with line numbers.' || chr(10) || - 'Designed for Jenkins and TFS to report coverage. ' || chr(10) || - 'Cobertura Document Type Definition can be found: http://cobertura.sourceforge.net/xml/coverage-04.dtd.'|| chr(10) || - 'Sample file: https://github.com/leobalter/testing-examples/blob/master/solutions/3/report/cobertura-coverage.xml.'; - end; - -end; -/ +create or replace type body ut_coverage_cobertura_reporter is + /* + utPLSQL - Version 3 + Copyright 2016 - 2018 utPLSQL Project + + Licensed under the Apache License, Version 2.0 (the "License"): + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + + constructor function ut_coverage_cobertura_reporter( + self in out nocopy ut_coverage_cobertura_reporter + ) return self as result is + begin + self.init($$plsql_unit); + return; + end; + + + overriding member procedure after_calling_run(self in out nocopy ut_coverage_cobertura_reporter, a_run in ut_run) as + l_report_lines ut_varchar2_list; + l_coverage_data ut_coverage.t_coverage; + + function get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage) return clob is + l_file_part varchar2(32767); + l_result clob; + l_line_no binary_integer; + l_pct integer; + begin + dbms_lob.createtemporary(l_result, true); + l_line_no := a_unit_coverage.lines.first; + if l_line_no is null then + for i in 1 .. a_unit_coverage.total_lines loop + ut_utils.append_to_clob(l_result, ''||chr(10)); + end loop; + else + while l_line_no is not null loop + if a_unit_coverage.lines(l_line_no).executions = 0 then + l_file_part := ''||chr(10); + else + l_file_part := ''||chr(10); + end if; + ut_utils.append_to_clob(l_result, l_file_part); + l_line_no := a_unit_coverage.lines.next(l_line_no); + end loop; + end if; + return l_result; + end; + + function get_coverage_xml( + a_coverage_data ut_coverage.t_coverage, + a_run ut_run + ) return ut_varchar2_rows is + l_file_part varchar2(32767); + l_result ut_varchar2_rows := ut_varchar2_rows(); + l_unit ut_coverage.t_full_name; + l_obj_name ut_coverage.t_object_name; + c_coverage_def constant varchar2(200) := ''; + c_file_footer constant varchar2(30) := ''; + c_coverage_footer constant varchar2(30) := ''; + c_sources_footer constant varchar2(30) := ''; + c_packages_footer constant varchar2(30) := ''; + c_package_footer constant varchar2(30) := ''; + c_class_footer constant varchar2(30) := ''; + c_lines_footer constant varchar2(30) := ''; + l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60; + begin + + ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) ); + ut_utils.append_to_list( l_result, c_coverage_def ); + + --write header + ut_utils.append_to_list( + l_result, + '' + ); + + + --Write sources + l_unit := a_coverage_data.objects.first; + ut_utils.append_to_list( l_result, '' ); + + while l_unit is not null loop + ut_utils.append_to_list(l_result, ''||dbms_xmlgen.convert(l_unit)||''); + l_unit := a_coverage_data.objects.next(l_unit); + end loop; + ut_utils.append_to_list(l_result, c_sources_footer); + + --write packages + l_unit := a_coverage_data.objects.first; + ut_utils.append_to_list(l_result, ''); + + while l_unit is not null loop + l_obj_name := a_coverage_data.objects(l_unit).name; + ut_utils.append_to_list( + l_result, + '' + ); + + ut_utils.append_to_list( + l_result, + '' + ); + + ut_utils.append_to_list(l_result, ''); + + ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) ); + + ut_utils.append_to_list(l_result, c_lines_footer); + ut_utils.append_to_list(l_result, c_class_footer); + ut_utils.append_to_list(l_result, c_package_footer); + + l_unit := a_coverage_data.objects.next(l_unit); + end loop; + + ut_utils.append_to_list(l_result, c_packages_footer); + ut_utils.append_to_list(l_result, c_coverage_footer); + return l_result; + end; + begin + ut_coverage.coverage_stop(); + + l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options); + + self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) ); + + (self as ut_reporter_base).after_calling_run(a_run); + end; + + overriding member function get_description return varchar2 as + begin + return 'Generates a Cobertura coverage report providing information on code coverage with line numbers.' || chr(10) || + 'Designed for Jenkins and TFS to report coverage. ' || chr(10) || + 'Cobertura Document Type Definition can be found: http://cobertura.sourceforge.net/xml/coverage-04.dtd.'|| chr(10) || + 'Sample file: https://github.com/leobalter/testing-examples/blob/master/solutions/3/report/cobertura-coverage.xml.'; + end; + +end; +/ diff --git a/test/install_and_run_tests.sh b/test/install_and_run_tests.sh index be7857346..01bd378fb 100755 --- a/test/install_and_run_tests.sh +++ b/test/install_and_run_tests.sh @@ -20,10 +20,11 @@ time utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWO -source_path=source -owner=ut3 \ -p='ut3_tester,ut3$user#' \ -test_path=test -c \ --f=ut_coverage_sonar_reporter -o=coverage.xml \ --f=ut_coverage_html_reporter -o=coverage.html \ --f=ut_coveralls_reporter -o=coverage.json \ --f=ut_sonar_test_reporter -o=test_results.xml \ --f=ut_junit_reporter -o=junit_test_results.xml \ --f=ut_tfs_junit_reporter -o=tfs_test_results.xml \ --f=ut_documentation_reporter -o=test_results.log -s +-f=ut_coverage_sonar_reporter -o=coverage.xml \ +-f=ut_coverage_cobertura_reporter -o=cobertura.xml \ +-f=ut_coverage_html_reporter -o=coverage.html \ +-f=ut_coveralls_reporter -o=coverage.json \ +-f=ut_sonar_test_reporter -o=test_results.xml \ +-f=ut_junit_reporter -o=junit_test_results.xml \ +-f=ut_tfs_junit_reporter -o=tfs_test_results.xml \ +-f=ut_documentation_reporter -o=test_results.log -s diff --git a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb index ecfb66340..b3c0439b4 100644 --- a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb +++ b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pkb @@ -41,5 +41,61 @@ create or replace package body test_cov_cobertura_reporter is ut.expect(l_actual).to_be_like(l_expected); end; + procedure report_zero_coverage is + l_results ut3.ut_varchar2_list; + l_expected clob; + l_actual clob; + begin + --Arrange + l_expected := + q'[ + + + +ut3.dummy_coverage + + + + + + + + + + + + + + + + + + + + + + + + +]'; + + test_coverage.cleanup_dummy_coverage; + --Act + select * + bulk collect into l_results + from table( + ut3.ut.run( + a_path => 'ut3.test_dummy_coverage', + a_reporter=> ut3.ut_coverage_cobertura_reporter( ), + a_include_objects => ut3.ut_varchar2_list('UT3.DUMMY_COVERAGE') + ) + ); + l_actual := ut3_tester_helper.main_helper.table_to_clob(l_results); + --Assert + ut.expect(l_actual).to_be_like(l_expected); + --Cleanup + test_coverage.setup_dummy_coverage; + end; + end; / diff --git a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks index 365815964..0016641d5 100644 --- a/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks +++ b/test/ut3_user/reporters/test_coverage/test_cov_cobertura_reporter.pks @@ -6,5 +6,8 @@ create or replace package test_cov_cobertura_reporter is --%test(reports on a project file mapped to database object) procedure report_on_file; + --%test(reports zero coverage on each line of non-executed database object - Issue #917) + procedure report_zero_coverage; + end test_cov_cobertura_reporter; /