Skip to content

Commit be014a0

Browse files
committed
Added ut_sonar_test_reporter
1 parent adf0aaa commit be014a0

File tree

11 files changed

+201
-1
lines changed

11 files changed

+201
-1
lines changed

docs/userguide/reporters.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,22 @@ Example of failure report details
8989
![xunit_reporter_outputs](../images/teamcity_report_example_errors.png)
9090

9191

92+
# Sonar test reporter
93+
If you are using [SonarQube](https://about.sonarqube.com/) to do static code analysis for you PLSQL projects, your code analysis can benefit from code coverage and test results.
94+
utPLSQL provides two reporters to for SonarQube:
95+
- `ut_sonar_test_reporter` - provides an XML output of each test executed per each project test file (package)
96+
- `ut_coverage_sonar_reporter` - provides XML output of code coverage per each project source file
97+
98+
`ut_sonar_test_reporter` needs to be called with a list of paths to test files (packages).
99+
The paths to files can be relative to the project root directory (recommended) or be absolute.
100+
101+
`ut_coverage_sonar_reporter` needs to be called with a list of paths to source files for your project.
102+
The paths to files can be relative to the project root directory (recommended) or be absolute.
103+
104+
Providing invalid paths or paths to non-existing files will result in failure when publishing test results/coverage results to sonar server.
105+
106+
For details on how to invoke reporter with paths, see the **Coverage reporters** section.
107+
92108
# Coverage reporters
93109

94110
utPLSQL comes with a set of build-in coverage reporters. Have a look into the [coverage documentation](coverage.md) to learn more about them.

examples/RunExpectations.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ set echo off
1111
@@demo_expectations.pck
1212

1313
begin
14+
ut_coverage.coverage_start_develop();
1415
ut.run();
16+
ut_coverage.coverage_stop_develop();
1517
end;
1618
/
1719

source/core/types/ut_suite_item.tps

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ create or replace type ut_suite_item force under ut_suite_item_base (
2424
member function get_disabled_flag return boolean,
2525
member function create_savepoint_if_needed return varchar2,
2626
member procedure rollback_to_savepoint(self in out nocopy ut_suite_item, a_savepoint varchar2),
27+
/*
28+
Returns execution time in seconds (with miliseconds)
29+
*/
2730
member function execution_time return number,
2831

2932
not instantiable member function do_execute(self in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) return boolean,

source/core/ut_utils.pks

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ create or replace package ut_utils authid definer is
187187

188188
function table_to_clob(a_text_table ut_varchar2_list) return clob;
189189

190+
/*
191+
Returns time difference in seconds (with miliseconds) between given timestamps
192+
*/
190193
function time_diff(a_start_time timestamp with time zone, a_end_time timestamp with time zone) return number;
191194

192195
/*

source/create_synonyms_and_grants_for_public.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ grant execute on ut_coverage_file_mappings to public;
6060
grant execute on ut_coverage_file_mapping to public;
6161
grant execute on ut_key_value_pairs to public;
6262
grant execute on ut_key_value_pair to public;
63+
grant execute on ut_sonar_test_reporter to public;
6364

6465
prompt Creating synonyms for UTPLSQL objects in &&ut3_owner schema to PUBLIC
6566

@@ -96,3 +97,4 @@ create public synonym ut_coverage_file_mappings for ut_coverage_file_mappings;
9697
create public synonym ut_coverage_file_mapping for ut_coverage_file_mapping;
9798
create public synonym ut_key_value_pairs for ut_key_value_pairs;
9899
create public synonym ut_key_value_pair for ut_key_value_pair;
100+
create public synonym ut_sonar_test_reporter for ut_sonar_test_reporter;

source/create_synonyms_and_grants_for_user.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ grant execute on ut_coverage_file_mappings to &ut3_user;
6161
grant execute on ut_coverage_file_mapping to &ut3_user;
6262
grant execute on ut_key_value_pairs to &ut3_user;
6363
grant execute on ut_key_value_pair to &ut3_user;
64+
grant execute on ut_sonar_test_reporter to &ut3_user;
6465

6566
prompt Creating synonyms for UTPLSQL objects in &&ut3_owner schema to user &&ut3_user
6667

@@ -97,3 +98,4 @@ create or replace synonym &ut3_user .ut_coverage_file_mappings for ut_coverage_f
9798
create or replace synonym &ut3_user .ut_coverage_file_mapping for ut_coverage_file_mapping;
9899
create or replace synonym &ut3_user .ut_key_value_pairs for ut_key_value_pairs;
99100
create or replace synonym &ut3_user .ut_key_value_pair for ut_key_value_pair;
101+
create or replace synonym &ut3_user .ut_sonar_test_reporter for ut_sonar_test_reporter;

source/install.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,8 @@ whenever sqlerror exit failure rollback
218218
@@reporters/ut_teamcity_reporter.tpb
219219
@@reporters/ut_xunit_reporter.tps
220220
@@reporters/ut_xunit_reporter.tpb
221-
221+
@@reporters/ut_sonar_test_reporter.tps
222+
@@reporters/ut_sonar_test_reporter.tpb
222223

223224
@@reporters/ut_coverage_html_reporter.tps
224225
@@reporters/ut_coverage_report_html_helper.pks
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
create or replace type body ut_sonar_test_reporter is
2+
/*
3+
utPLSQL - Version X.X.X.X
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_sonar_test_reporter(
20+
self in out nocopy ut_sonar_test_reporter,
21+
a_object_owner varchar2 := null,
22+
a_file_paths ut_varchar2_list,
23+
a_regex_pattern varchar2,
24+
a_object_owner_subexpression positive,
25+
a_object_name_subexpression positive,
26+
a_object_type_subexpression positive,
27+
a_file_to_object_type_mapping ut_key_value_pairs
28+
) return self as result is
29+
begin
30+
self.file_mappings := ut_coverage.build_file_mappings(
31+
a_object_owner, a_file_paths, a_file_to_object_type_mapping, a_regex_pattern,
32+
a_object_owner_subexpression, a_object_name_subexpression, a_object_type_subexpression
33+
);
34+
self.init($$plsql_unit);
35+
return;
36+
end;
37+
38+
constructor function ut_sonar_test_reporter(
39+
self in out nocopy ut_sonar_test_reporter,
40+
a_object_owner varchar2 := null,
41+
a_file_paths ut_varchar2_list
42+
) return self as result is
43+
begin
44+
self.file_mappings := coalesce(ut_coverage.build_file_mappings( a_object_owner, a_file_paths ), ut_coverage_file_mappings());
45+
self.init($$plsql_unit);
46+
return;
47+
end;
48+
49+
constructor function ut_sonar_test_reporter(
50+
self in out nocopy ut_sonar_test_reporter,
51+
a_file_mappings ut_coverage_file_mappings
52+
) return self as result is
53+
begin
54+
self.init($$plsql_unit);
55+
self.file_mappings := coalesce(a_file_mappings,ut_coverage_file_mappings());
56+
return;
57+
end;
58+
59+
overriding member procedure before_calling_run(self in out nocopy ut_sonar_test_reporter, a_run in ut_run) is
60+
begin
61+
self.print_text('<testExecutions version="1">');
62+
end;
63+
64+
overriding member procedure before_calling_suite(self in out nocopy ut_sonar_test_reporter, a_suite ut_logical_suite) is
65+
l_file_name varchar2(4000);
66+
begin
67+
for i in 1 .. self.file_mappings.count loop
68+
if upper(self.file_mappings(i).object_name) = upper(a_suite.object_name)
69+
and upper(self.file_mappings(i).object_owner) = upper(a_suite.object_owner) then
70+
l_file_name := self.file_mappings(i).file_name;
71+
exit;
72+
end if;
73+
end loop;
74+
l_file_name := coalesce(l_file_name, a_suite.path);
75+
self.print_text('<file path="'||l_file_name||'">');
76+
end;
77+
78+
overriding member procedure after_calling_test(self in out nocopy ut_sonar_test_reporter, a_test ut_test) is
79+
l_message varchar2(32757);
80+
l_lines ut_varchar2_list;
81+
begin
82+
self.print_text('<testCase name="'||a_test.name||'" duration="'||round(a_test.execution_time()*1000,0)||'" >');
83+
if a_test.result = ut_utils.tr_disabled then
84+
self.print_text('<skipped message="skipped"/>');
85+
elsif a_test.result = ut_utils.tr_error then
86+
self.print_text('<error message="encountered errors">');
87+
self.print_text('<![CDATA[');
88+
self.print_clob(ut_utils.table_to_clob(a_test.get_error_stack_traces()));
89+
self.print_text(']]>');
90+
self.print_text('</error>');
91+
elsif a_test.result > ut_utils.tr_success then
92+
self.print_text('<failure message="some expectations have failed">');
93+
self.print_text('<![CDATA[');
94+
for i in 1 .. a_test.results.count loop
95+
l_lines := a_test.results(i).get_result_lines();
96+
for i in 1 .. l_lines.count loop
97+
self.print_text(l_lines(i));
98+
end loop;
99+
end loop;
100+
self.print_text(']]>');
101+
self.print_text('</failure>');
102+
end if;
103+
self.print_text('</testCase>');
104+
end;
105+
106+
overriding member procedure after_calling_suite(self in out nocopy ut_sonar_test_reporter, a_suite ut_logical_suite) is
107+
begin
108+
self.print_text('</file>');
109+
end;
110+
111+
overriding member procedure after_calling_run(self in out nocopy ut_sonar_test_reporter, a_run in ut_run) is
112+
begin
113+
self.print_text('</testExecutions>');
114+
end;
115+
116+
end;
117+
/
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
create or replace type ut_sonar_test_reporter under ut_reporter_base(
2+
/*
3+
utPLSQL - Version X.X.X.X
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+
file_mappings ut_coverage_file_mappings,
19+
20+
constructor function ut_sonar_test_reporter(
21+
self in out nocopy ut_sonar_test_reporter,
22+
a_object_owner varchar2 := null,
23+
a_file_paths ut_varchar2_list,
24+
a_regex_pattern varchar2,
25+
a_object_owner_subexpression positive,
26+
a_object_name_subexpression positive,
27+
a_object_type_subexpression positive,
28+
a_file_to_object_type_mapping ut_key_value_pairs
29+
) return self as result,
30+
31+
constructor function ut_sonar_test_reporter(
32+
self in out nocopy ut_sonar_test_reporter,
33+
a_object_owner varchar2 := null,
34+
a_file_paths ut_varchar2_list
35+
) return self as result,
36+
37+
constructor function ut_sonar_test_reporter(
38+
self in out nocopy ut_sonar_test_reporter,
39+
a_file_mappings ut_coverage_file_mappings
40+
) return self as result,
41+
42+
43+
overriding member procedure before_calling_run(self in out nocopy ut_sonar_test_reporter, a_run in ut_run),
44+
overriding member procedure before_calling_suite(self in out nocopy ut_sonar_test_reporter, a_suite ut_logical_suite),
45+
overriding member procedure after_calling_test(self in out nocopy ut_sonar_test_reporter, a_test ut_test),
46+
overriding member procedure after_calling_suite(self in out nocopy ut_sonar_test_reporter, a_suite ut_logical_suite),
47+
overriding member procedure after_calling_run(self in out nocopy ut_sonar_test_reporter, a_run in ut_run)
48+
)
49+
not final
50+
/

source/uninstall.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ drop package ut_coverage_report_html_helper;
5959

6060
drop type ut_coverage_html_reporter;
6161

62+
drop type ut_sonar_test_reporter;
63+
6264
drop package ut_coverage;
6365

6466
drop type ut_coverage_file_mappings;

0 commit comments

Comments
 (0)