Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fed7c66

Browse files
authored
Merge pull request #596 from lwasylow/cobertura_cov_reporter
Cobertura Coverage Reporter
2 parents 53ade01 + 6fd6299 commit fed7c66

11 files changed

Lines changed: 233 additions & 1 deletion

docs/userguide/coverage.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Following code coverage reporters are supplied with utPLSQL:
1515
* `ut_coverage_html_reporter` - generates a HTML coverage report providing summary and detailed information on code coverage. The html reporter is based on open-source [simplecov-html](https://github.com/colszowka/simplecov-html) reporter for Ruby. It includes source code of the code that was covered (if possible)
1616
* `ut_coveralls_reporter` - generates a [Coveralls compatible JSON](https://coveralls.zendesk.com/hc/en-us/articles/201774865-API-Introduction) coverage report providing detailed information on code coverage with line numbers. This coverage report is designed to be consumed by cloud services like [coveralls](https://coveralls.io)
1717
* `ut_coverage_sonar_reporter` - generates a [Sonar Compatible XML](https://docs.sonarqube.org/display/SONAR/Generic+Test+Data) coverage report providing detailed information on code coverage with line numbers. This coverage report is designed to be consumed by services like [sonarqube/sonarcloud](https://about.sonarcloud.io/)
18+
* `ut_coverage_cobertura_reporter` - generates a basic cobertura coverage (http://cobertura.sourceforge.net/xml/coverage-04.dtd) report providing detailed information on code coverage with line numbers. This coverage report is designed to be consumed by services like TFS, Jenkins. Please see example of XML generated by java : https://raw.githubusercontent.com/jenkinsci/cobertura-plugin/master/src/test/resources/hudson/plugins/cobertura/coverage-with-data.xml
1819

1920
## Security model
2021
Code coverage is using DBMS_PROFILER to gather information about execution of code under test and therefore follows the [DBMS_PROFILER's Security Model](https://docs.oracle.com/database/121/ARPLS/d_profil.htm#ARPLS67465)

source/create_synonyms_and_grants_for_public.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ grant execute on &&ut3_owner..ut_documentation_reporter to public;
5353
grant execute on &&ut3_owner..ut_coverage_html_reporter to public;
5454
grant execute on &&ut3_owner..ut_coverage_sonar_reporter to public;
5555
grant execute on &&ut3_owner..ut_coveralls_reporter to public;
56+
grant execute on &&ut3_owner..ut_coverage_cobertura_reporter to public;
5657
grant execute on &&ut3_owner..ut_reporters to public;
5758
grant execute on &&ut3_owner..ut_varchar2_list to public;
5859
grant execute on &&ut3_owner..ut_varchar2_rows to public;
@@ -107,6 +108,7 @@ create public synonym ut_documentation_reporter for &&ut3_owner..ut_documentatio
107108
create public synonym ut_coverage_html_reporter for &&ut3_owner..ut_coverage_html_reporter;
108109
create public synonym ut_coverage_sonar_reporter for &&ut3_owner..ut_coverage_sonar_reporter;
109110
create public synonym ut_coveralls_reporter for &&ut3_owner..ut_coveralls_reporter;
111+
create public synonym ut_coverage_cobertura_reporter for &&ut3_owner..ut_coverage_cobertura_reporter;
110112
create public synonym ut_reporters for &&ut3_owner..ut_reporters;
111113
create public synonym ut_varchar2_list for &&ut3_owner..ut_varchar2_list;
112114
create public synonym ut_varchar2_rows for &&ut3_owner..ut_varchar2_rows;

source/create_synonyms_and_grants_for_user.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ grant execute on &&ut3_owner..ut_documentation_reporter to &ut3_user;
7373
grant execute on &&ut3_owner..ut_coverage_html_reporter to &ut3_user;
7474
grant execute on &&ut3_owner..ut_coverage_sonar_reporter to &ut3_user;
7575
grant execute on &&ut3_owner..ut_coveralls_reporter to &ut3_user;
76+
grant execute on &&ut3_owner..ut_coverage_cobertura_reporter to &ut3_user;
7677
grant execute on &&ut3_owner..ut_reporters to &ut3_user;
7778
grant execute on &&ut3_owner..ut_varchar2_list to &ut3_user;
7879
grant execute on &&ut3_owner..ut_varchar2_rows to &ut3_user;
@@ -126,6 +127,7 @@ create or replace synonym &ut3_user..ut_documentation_reporter for &&ut3_owner..
126127
create or replace synonym &ut3_user..ut_coverage_html_reporter for &&ut3_owner..ut_coverage_html_reporter;
127128
create or replace synonym &ut3_user..ut_coverage_sonar_reporter for &&ut3_owner..ut_coverage_sonar_reporter;
128129
create or replace synonym &ut3_user..ut_coveralls_reporter for &&ut3_owner..ut_coveralls_reporter;
130+
create or replace synonym &ut3_user..ut_coverage_cobertura_reporter for &&ut3_owner..ut_coverage_cobertura_reporter;
129131
create or replace synonym &ut3_user..ut_reporters for &&ut3_owner..ut_reporters;
130132
create or replace synonym &ut3_user..ut_varchar2_list for &&ut3_owner..ut_varchar2_list;
131133
create or replace synonym &ut3_user..ut_varchar2_rows for &&ut3_owner..ut_varchar2_rows;

source/install.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ prompt Installing PLSQL profiler objects into &&ut3_owner schema
240240
@@install_component.sql 'reporters/ut_coverage_sonar_reporter.tpb'
241241
@@install_component.sql 'reporters/ut_coveralls_reporter.tps'
242242
@@install_component.sql 'reporters/ut_coveralls_reporter.tpb'
243+
@@install_component.sql 'reporters/ut_coverage_cobertura_reporter.tps'
244+
@@install_component.sql 'reporters/ut_coverage_cobertura_reporter.tpb'
243245

244246
@@install_component.sql 'api/be_between.syn'
245247
@@install_component.sql 'api/be_empty.syn'
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
create or replace type body ut_coverage_cobertura_reporter is
2+
/*
3+
utPLSQL - Version 3
4+
Copyright 2016 - 2017 utPLSQL Project
5+
6+
Licensed under the Apache License, Version 2.0 (the "License"):
7+
you may not use this file except in compliance with the License.
8+
You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing, software
13+
distributed under the License is distributed on an "AS IS" BASIS,
14+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
See the License for the specific language governing permissions and
16+
limitations under the License.
17+
*/
18+
19+
constructor function ut_coverage_cobertura_reporter(
20+
self in out nocopy ut_coverage_cobertura_reporter
21+
) return self as result is
22+
begin
23+
self.init($$plsql_unit);
24+
return;
25+
end;
26+
27+
28+
overriding member procedure after_calling_run(self in out nocopy ut_coverage_cobertura_reporter, a_run in ut_run) as
29+
l_report_lines ut_varchar2_list;
30+
l_coverage_data ut_coverage.t_coverage;
31+
32+
function get_lines_xml(a_unit_coverage ut_coverage.t_unit_coverage) return clob is
33+
l_file_part varchar2(32767);
34+
l_result clob;
35+
l_line_no binary_integer;
36+
begin
37+
dbms_lob.createtemporary(l_result, true);
38+
l_line_no := a_unit_coverage.lines.first;
39+
if l_line_no is null then
40+
for i in 1 .. a_unit_coverage.total_lines loop
41+
l_file_part := '<line number="'||i||'" hits="0" branch="false"/>'||chr(10);
42+
ut_utils.append_to_clob(l_result, l_file_part);
43+
end loop;
44+
else
45+
while l_line_no is not null loop
46+
if a_unit_coverage.lines(l_line_no) = 0 then
47+
l_file_part := '<line number="'||l_line_no||'" hits="0" branch="false"/>'||chr(10);
48+
else
49+
l_file_part := '<line number="'||l_line_no||'" hits="1" branch="false"/>'||chr(10);
50+
end if;
51+
ut_utils.append_to_clob(l_result, l_file_part);
52+
l_line_no := a_unit_coverage.lines.next(l_line_no);
53+
end loop;
54+
end if;
55+
return l_result;
56+
end;
57+
58+
function get_coverage_xml(
59+
a_coverage_data ut_coverage.t_coverage
60+
) return clob is
61+
l_file_part varchar2(32767);
62+
l_result clob;
63+
l_unit ut_coverage.t_full_name;
64+
l_obj_name ut_coverage.t_object_name;
65+
c_coverage_def constant varchar2(200) := '<?xml version="1.0"?>'||CHR(10)||'<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">'||chr(10);
66+
c_file_footer constant varchar2(30) := '</file>'||chr(10);
67+
c_coverage_footer constant varchar2(30) := '</coverage>';
68+
c_sources_footer constant varchar2(30) := '</sources>'||chr(10);
69+
c_packages_footer constant varchar2(30) := '</packages>'||chr(10);
70+
c_package_footer constant varchar2(30) := '</package>'||chr(10);
71+
c_class_footer constant varchar2(30) := '</class>'||chr(10);
72+
c_lines_footer constant varchar2(30) := '</lines>'||chr(10);
73+
l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60;
74+
begin
75+
76+
dbms_lob.createtemporary(l_result,true);
77+
78+
ut_utils.append_to_clob(l_result, c_coverage_def);
79+
80+
--write header
81+
l_file_part:= '<coverage line-rate="0" branch-rate="0.0" lines-covered="'||a_coverage_data.covered_lines||'" lines-valid="'||TO_CHAR(a_coverage_data.covered_lines + a_coverage_data.uncovered_lines)||'" branches-covered="0" branches-valid="0" complexity="0" version="1" timestamp="'||l_epoch||'">';
82+
ut_utils.append_to_clob(l_result, l_file_part);
83+
84+
85+
--Write sources
86+
l_unit := a_coverage_data.objects.first;
87+
l_file_part := '<sources>'||CHR(10);
88+
ut_utils.append_to_clob(l_result, l_file_part);
89+
90+
while l_unit is not null loop
91+
l_file_part := '<source>'||dbms_xmlgen.convert(l_unit)||'</source>'||chr(10);
92+
ut_utils.append_to_clob(l_result, l_file_part);
93+
l_unit := a_coverage_data.objects.next(l_unit);
94+
end loop;
95+
ut_utils.append_to_clob(l_result, c_sources_footer);
96+
97+
--write packages
98+
l_unit := a_coverage_data.objects.first;
99+
l_file_part := '<packages>'||CHR(10);
100+
ut_utils.append_to_clob(l_result, l_file_part);
101+
102+
while l_unit is not null loop
103+
l_obj_name := a_coverage_data.objects(l_unit).name;
104+
l_file_part := '<package name="'||dbms_xmlgen.convert(l_obj_name)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'||CHR(10);
105+
ut_utils.append_to_clob(l_result, l_file_part);
106+
107+
l_file_part := '<class name="'||dbms_xmlgen.convert(l_obj_name)||'" filename="'||dbms_xmlgen.convert(l_unit)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'||CHR(10);
108+
ut_utils.append_to_clob(l_result, l_file_part);
109+
110+
l_file_part := '<lines>'||CHR(10);
111+
ut_utils.append_to_clob(l_result, l_file_part);
112+
113+
dbms_lob.append(l_result,get_lines_xml(a_coverage_data.objects(l_unit)));
114+
115+
ut_utils.append_to_clob(l_result, c_lines_footer);
116+
ut_utils.append_to_clob(l_result, c_class_footer);
117+
ut_utils.append_to_clob(l_result, c_package_footer);
118+
119+
l_unit := a_coverage_data.objects.next(l_unit);
120+
end loop;
121+
122+
ut_utils.append_to_clob(l_result, c_packages_footer);
123+
ut_utils.append_to_clob(l_result, c_coverage_footer);
124+
return l_result;
125+
end;
126+
begin
127+
ut_coverage.coverage_stop();
128+
129+
l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options);
130+
131+
self.print_clob( get_coverage_xml( l_coverage_data ) );
132+
133+
(self as ut_reporter_base).after_calling_run(a_run);
134+
end;
135+
136+
end;
137+
/
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
create or replace type ut_coverage_cobertura_reporter under ut_coverage_reporter_base(
2+
/*
3+
utPLSQL - Version 3
4+
Copyright 2016 - 2017 utPLSQL Project
5+
6+
Licensed under the Apache License, Version 2.0 (the "License"):
7+
you may not use this file except in compliance with the License.
8+
You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing, software
13+
distributed under the License is distributed on an "AS IS" BASIS,
14+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
See the License for the specific language governing permissions and
16+
limitations under the License.
17+
*/
18+
19+
constructor function ut_coverage_cobertura_reporter(
20+
self in out nocopy ut_coverage_cobertura_reporter
21+
) return self as result,
22+
23+
overriding member procedure after_calling_run(self in out nocopy ut_coverage_cobertura_reporter, a_run in ut_run)
24+
)
25+
/
26+

source/uninstall.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ drop type ut_coveralls_reporter force;
5656

5757
drop type ut_coverage_sonar_reporter force;
5858

59+
drop type ut_coverage_cobertura_reporter force;
60+
5961
drop package ut_coverage_report_html_helper;
6062

6163
drop type ut_coverage_html_reporter force;
@@ -292,3 +294,5 @@ end;
292294
/
293295

294296
spool off
297+
298+
exit;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
create or replace package body test_cov_cobertura_reporter is
2+
3+
procedure report_on_file is
4+
l_results ut3.ut_varchar2_list;
5+
l_expected clob;
6+
l_actual clob;
7+
begin
8+
--Arrange
9+
l_expected :=
10+
'<?xml version="1.0"?>
11+
<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">
12+
<coverage line-rate="0" branch-rate="0.0" lines-covered="2" lines-valid="3" branches-covered="0" branches-valid="0" complexity="0" version="1" timestamp="%"><sources>
13+
<source>test/ut3.dummy_coverage.pkb</source>
14+
</sources>
15+
<packages>
16+
<package name="DUMMY_COVERAGE" line-rate="0.0" branch-rate="0.0" complexity="0.0">
17+
<class name="DUMMY_COVERAGE" filename="test/ut3.dummy_coverage.pkb" line-rate="0.0" branch-rate="0.0" complexity="0.0">
18+
<lines>
19+
<line number="4" hits="1" branch="false"/>
20+
<line number="5" hits="0" branch="false"/>
21+
<line number="7" hits="1" branch="false"/>
22+
</lines>
23+
</class>
24+
</package>
25+
</packages>
26+
</coverage>';
27+
--Act
28+
select *
29+
bulk collect into l_results
30+
from table(
31+
ut3.ut.run(
32+
a_path => 'ut3.test_dummy_coverage',
33+
a_reporter=> ut3.ut_coverage_cobertura_reporter( ),
34+
a_source_files => ut3.ut_varchar2_list( 'test/ut3.dummy_coverage.pkb' ),
35+
a_test_files => ut3.ut_varchar2_list( )
36+
)
37+
);
38+
l_actual := ut3.ut_utils.table_to_clob(l_results);
39+
--Assert
40+
ut.expect(l_actual).to_be_like(l_expected);
41+
end;
42+
43+
end;
44+
/
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
create or replace package test_cov_cobertura_reporter is
2+
3+
--%suite(ut_cov_cobertura_reporter)
4+
--%suitepath(utplsql.core.reporters.test_coverage)
5+
6+
--%test(reports on a project file mapped to database object)
7+
procedure report_on_file;
8+
9+
end test_cov_cobertura_reporter;
10+
/

test/install_and_run_tests.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#!/bin/bash
22
set -ev
3+
4+
35
#goto git root directory
46
git rev-parse && cd "$(git rev-parse --show-cdup)"
57

0 commit comments

Comments
 (0)