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

Skip to content

Commit e1b562a

Browse files
authored
Merge pull request #918 from utPLSQL/feature/fix_cobertura_coverage_report
Fixed issue with missing newlines in cobertura coverage
2 parents f0c2bd8 + 4d7bc3d commit e1b562a

4 files changed

Lines changed: 227 additions & 167 deletions

File tree

Lines changed: 160 additions & 160 deletions
Original file line numberDiff line numberDiff line change
@@ -1,160 +1,160 @@
1-
create or replace type body ut_coverage_cobertura_reporter is
2-
/*
3-
utPLSQL - Version 3
4-
Copyright 2016 - 2018 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-
l_pct integer;
37-
begin
38-
dbms_lob.createtemporary(l_result, true);
39-
l_line_no := a_unit_coverage.lines.first;
40-
if l_line_no is null then
41-
for i in 1 .. a_unit_coverage.total_lines loop
42-
ut_utils.append_to_clob(l_result, '<line number="'||i||'" hits="0" branch="false"/>');
43-
end loop;
44-
else
45-
while l_line_no is not null loop
46-
if a_unit_coverage.lines(l_line_no).executions = 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="'||a_unit_coverage.lines(l_line_no).executions||'"';
50-
if a_unit_coverage.lines(l_line_no).covered_blocks < a_unit_coverage.lines(l_line_no).no_blocks then
51-
l_file_part := l_file_part || ' branch="true"';
52-
l_pct := (a_unit_coverage.lines(l_line_no).covered_blocks/a_unit_coverage.lines(l_line_no).no_blocks)*100;
53-
l_file_part := l_file_part || ' condition-coverage="'||l_pct||'%';
54-
l_file_part := l_file_part || ' ('||a_unit_coverage.lines(l_line_no).covered_blocks||'/'||a_unit_coverage.lines(l_line_no).no_blocks||')"';
55-
else
56-
l_file_part := l_file_part || ' branch="false"';
57-
end if;
58-
l_file_part := l_file_part ||'/>'||chr(10);
59-
end if;
60-
ut_utils.append_to_clob(l_result, l_file_part);
61-
l_line_no := a_unit_coverage.lines.next(l_line_no);
62-
end loop;
63-
end if;
64-
return l_result;
65-
end;
66-
67-
function get_coverage_xml(
68-
a_coverage_data ut_coverage.t_coverage,
69-
a_run ut_run
70-
) return ut_varchar2_rows is
71-
l_file_part varchar2(32767);
72-
l_result ut_varchar2_rows := ut_varchar2_rows();
73-
l_unit ut_coverage.t_full_name;
74-
l_obj_name ut_coverage.t_object_name;
75-
c_coverage_def constant varchar2(200) := '<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">';
76-
c_file_footer constant varchar2(30) := '</file>';
77-
c_coverage_footer constant varchar2(30) := '</coverage>';
78-
c_sources_footer constant varchar2(30) := '</sources>';
79-
c_packages_footer constant varchar2(30) := '</packages>';
80-
c_package_footer constant varchar2(30) := '</package>';
81-
c_class_footer constant varchar2(30) := '</class>';
82-
c_lines_footer constant varchar2(30) := '</lines>';
83-
l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60;
84-
begin
85-
86-
ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) );
87-
ut_utils.append_to_list( l_result, c_coverage_def );
88-
89-
--write header
90-
ut_utils.append_to_list(
91-
l_result,
92-
'<coverage line-rate="0" branch-rate="0.0" lines-covered="'
93-
||a_coverage_data.covered_lines||'" lines-valid="'
94-
||TO_CHAR(a_coverage_data.covered_lines + a_coverage_data.uncovered_lines)
95-
||'" branches-covered="0" branches-valid="0" complexity="0" version="1" timestamp="'||l_epoch||'">'
96-
);
97-
98-
99-
--Write sources
100-
l_unit := a_coverage_data.objects.first;
101-
ut_utils.append_to_list( l_result, '<sources>' );
102-
103-
while l_unit is not null loop
104-
ut_utils.append_to_list(l_result, '<source>'||dbms_xmlgen.convert(l_unit)||'</source>');
105-
l_unit := a_coverage_data.objects.next(l_unit);
106-
end loop;
107-
ut_utils.append_to_list(l_result, c_sources_footer);
108-
109-
--write packages
110-
l_unit := a_coverage_data.objects.first;
111-
ut_utils.append_to_list(l_result, '<packages>');
112-
113-
while l_unit is not null loop
114-
l_obj_name := a_coverage_data.objects(l_unit).name;
115-
ut_utils.append_to_list(
116-
l_result,
117-
'<package name="'||dbms_xmlgen.convert(l_obj_name)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'
118-
);
119-
120-
ut_utils.append_to_list(
121-
l_result,
122-
'<class name="'||dbms_xmlgen.convert(l_obj_name)||'" filename="'
123-
||dbms_xmlgen.convert(l_unit)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'
124-
);
125-
126-
ut_utils.append_to_list(l_result, '<lines>');
127-
128-
ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) );
129-
130-
ut_utils.append_to_list(l_result, c_lines_footer);
131-
ut_utils.append_to_list(l_result, c_class_footer);
132-
ut_utils.append_to_list(l_result, c_package_footer);
133-
134-
l_unit := a_coverage_data.objects.next(l_unit);
135-
end loop;
136-
137-
ut_utils.append_to_list(l_result, c_packages_footer);
138-
ut_utils.append_to_list(l_result, c_coverage_footer);
139-
return l_result;
140-
end;
141-
begin
142-
ut_coverage.coverage_stop();
143-
144-
l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options);
145-
146-
self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) );
147-
148-
(self as ut_reporter_base).after_calling_run(a_run);
149-
end;
150-
151-
overriding member function get_description return varchar2 as
152-
begin
153-
return 'Generates a Cobertura coverage report providing information on code coverage with line numbers.' || chr(10) ||
154-
'Designed for Jenkins and TFS to report coverage. ' || chr(10) ||
155-
'Cobertura Document Type Definition can be found: http://cobertura.sourceforge.net/xml/coverage-04.dtd.'|| chr(10) ||
156-
'Sample file: https://github.com/leobalter/testing-examples/blob/master/solutions/3/report/cobertura-coverage.xml.';
157-
end;
158-
159-
end;
160-
/
1+
create or replace type body ut_coverage_cobertura_reporter is
2+
/*
3+
utPLSQL - Version 3
4+
Copyright 2016 - 2018 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+
l_pct integer;
37+
begin
38+
dbms_lob.createtemporary(l_result, true);
39+
l_line_no := a_unit_coverage.lines.first;
40+
if l_line_no is null then
41+
for i in 1 .. a_unit_coverage.total_lines loop
42+
ut_utils.append_to_clob(l_result, '<line number="'||i||'" hits="0" branch="false"/>'||chr(10));
43+
end loop;
44+
else
45+
while l_line_no is not null loop
46+
if a_unit_coverage.lines(l_line_no).executions = 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="'||a_unit_coverage.lines(l_line_no).executions||'"';
50+
if a_unit_coverage.lines(l_line_no).covered_blocks < a_unit_coverage.lines(l_line_no).no_blocks then
51+
l_file_part := l_file_part || ' branch="true"';
52+
l_pct := (a_unit_coverage.lines(l_line_no).covered_blocks/a_unit_coverage.lines(l_line_no).no_blocks)*100;
53+
l_file_part := l_file_part || ' condition-coverage="'||l_pct||'%';
54+
l_file_part := l_file_part || ' ('||a_unit_coverage.lines(l_line_no).covered_blocks||'/'||a_unit_coverage.lines(l_line_no).no_blocks||')"';
55+
else
56+
l_file_part := l_file_part || ' branch="false"';
57+
end if;
58+
l_file_part := l_file_part ||'/>'||chr(10);
59+
end if;
60+
ut_utils.append_to_clob(l_result, l_file_part);
61+
l_line_no := a_unit_coverage.lines.next(l_line_no);
62+
end loop;
63+
end if;
64+
return l_result;
65+
end;
66+
67+
function get_coverage_xml(
68+
a_coverage_data ut_coverage.t_coverage,
69+
a_run ut_run
70+
) return ut_varchar2_rows is
71+
l_file_part varchar2(32767);
72+
l_result ut_varchar2_rows := ut_varchar2_rows();
73+
l_unit ut_coverage.t_full_name;
74+
l_obj_name ut_coverage.t_object_name;
75+
c_coverage_def constant varchar2(200) := '<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">';
76+
c_file_footer constant varchar2(30) := '</file>';
77+
c_coverage_footer constant varchar2(30) := '</coverage>';
78+
c_sources_footer constant varchar2(30) := '</sources>';
79+
c_packages_footer constant varchar2(30) := '</packages>';
80+
c_package_footer constant varchar2(30) := '</package>';
81+
c_class_footer constant varchar2(30) := '</class>';
82+
c_lines_footer constant varchar2(30) := '</lines>';
83+
l_epoch varchar2(50) := (sysdate - to_date('01-01-1970 00:00:00', 'dd-mm-yyyy hh24:mi:ss')) * 24 * 60 * 60;
84+
begin
85+
86+
ut_utils.append_to_list( l_result, ut_utils.get_xml_header(a_run.client_character_set) );
87+
ut_utils.append_to_list( l_result, c_coverage_def );
88+
89+
--write header
90+
ut_utils.append_to_list(
91+
l_result,
92+
'<coverage line-rate="0" branch-rate="0.0" lines-covered="'
93+
||a_coverage_data.covered_lines||'" lines-valid="'
94+
||TO_CHAR(a_coverage_data.covered_lines + a_coverage_data.uncovered_lines)
95+
||'" branches-covered="0" branches-valid="0" complexity="0" version="1" timestamp="'||l_epoch||'">'
96+
);
97+
98+
99+
--Write sources
100+
l_unit := a_coverage_data.objects.first;
101+
ut_utils.append_to_list( l_result, '<sources>' );
102+
103+
while l_unit is not null loop
104+
ut_utils.append_to_list(l_result, '<source>'||dbms_xmlgen.convert(l_unit)||'</source>');
105+
l_unit := a_coverage_data.objects.next(l_unit);
106+
end loop;
107+
ut_utils.append_to_list(l_result, c_sources_footer);
108+
109+
--write packages
110+
l_unit := a_coverage_data.objects.first;
111+
ut_utils.append_to_list(l_result, '<packages>');
112+
113+
while l_unit is not null loop
114+
l_obj_name := a_coverage_data.objects(l_unit).name;
115+
ut_utils.append_to_list(
116+
l_result,
117+
'<package name="'||dbms_xmlgen.convert(l_obj_name)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'
118+
);
119+
120+
ut_utils.append_to_list(
121+
l_result,
122+
'<class name="'||dbms_xmlgen.convert(l_obj_name)||'" filename="'
123+
||dbms_xmlgen.convert(l_unit)||'" line-rate="0.0" branch-rate="0.0" complexity="0.0">'
124+
);
125+
126+
ut_utils.append_to_list(l_result, '<lines>');
127+
128+
ut_utils.append_to_list( l_result, get_lines_xml(a_coverage_data.objects(l_unit)) );
129+
130+
ut_utils.append_to_list(l_result, c_lines_footer);
131+
ut_utils.append_to_list(l_result, c_class_footer);
132+
ut_utils.append_to_list(l_result, c_package_footer);
133+
134+
l_unit := a_coverage_data.objects.next(l_unit);
135+
end loop;
136+
137+
ut_utils.append_to_list(l_result, c_packages_footer);
138+
ut_utils.append_to_list(l_result, c_coverage_footer);
139+
return l_result;
140+
end;
141+
begin
142+
ut_coverage.coverage_stop();
143+
144+
l_coverage_data := ut_coverage.get_coverage_data(a_run.coverage_options);
145+
146+
self.print_text_lines( get_coverage_xml( l_coverage_data, a_run ) );
147+
148+
(self as ut_reporter_base).after_calling_run(a_run);
149+
end;
150+
151+
overriding member function get_description return varchar2 as
152+
begin
153+
return 'Generates a Cobertura coverage report providing information on code coverage with line numbers.' || chr(10) ||
154+
'Designed for Jenkins and TFS to report coverage. ' || chr(10) ||
155+
'Cobertura Document Type Definition can be found: http://cobertura.sourceforge.net/xml/coverage-04.dtd.'|| chr(10) ||
156+
'Sample file: https://github.com/leobalter/testing-examples/blob/master/solutions/3/report/cobertura-coverage.xml.';
157+
end;
158+
159+
end;
160+
/

test/install_and_run_tests.sh

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ time utPLSQL-cli/bin/utplsql run ${UT3_TESTER_HELPER}/${UT3_TESTER_HELPER_PASSWO
2020
-source_path=source -owner=ut3 \
2121
-p='ut3_tester,ut3$user#' \
2222
-test_path=test -c \
23-
-f=ut_coverage_sonar_reporter -o=coverage.xml \
24-
-f=ut_coverage_html_reporter -o=coverage.html \
25-
-f=ut_coveralls_reporter -o=coverage.json \
26-
-f=ut_sonar_test_reporter -o=test_results.xml \
27-
-f=ut_junit_reporter -o=junit_test_results.xml \
28-
-f=ut_tfs_junit_reporter -o=tfs_test_results.xml \
29-
-f=ut_documentation_reporter -o=test_results.log -s
23+
-f=ut_coverage_sonar_reporter -o=coverage.xml \
24+
-f=ut_coverage_cobertura_reporter -o=cobertura.xml \
25+
-f=ut_coverage_html_reporter -o=coverage.html \
26+
-f=ut_coveralls_reporter -o=coverage.json \
27+
-f=ut_sonar_test_reporter -o=test_results.xml \
28+
-f=ut_junit_reporter -o=junit_test_results.xml \
29+
-f=ut_tfs_junit_reporter -o=tfs_test_results.xml \
30+
-f=ut_documentation_reporter -o=test_results.log -s

0 commit comments

Comments
 (0)