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

Skip to content

Commit 2a32620

Browse files
committed
Fixed XML/HTML special characters in reporters.
Resolves #499 Unified reporting of failures across reporters. With that change, expectation results are only kept in `ut_test` for failed expectations. XUnit reporter now reports also the line of the test where an expectation has failed. Resolves #487
1 parent 0bacde4 commit 2a32620

15 files changed

Lines changed: 119 additions & 33 deletions

source/core/ut_expectation_processor.pkb

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,14 @@ create or replace package body ut_expectation_processor as
5555
function get_expectations_results return ut_expectation_results is
5656
l_expectations_results ut_expectation_results := ut_expectation_results();
5757
begin
58-
ut_utils.debug_log('ut_expectation_processor.get_expectations_results: .count='||g_expectations_called.count);
59-
l_expectations_results := g_expectations_called;
58+
ut_utils.debug_log('ut_expectation_processor.get_expectations_results: g_expectations_called.count='||g_expectations_called.count);
59+
for i in 1 .. g_expectations_called.count loop
60+
if g_expectations_called(i).status > ut_utils.tr_success then
61+
l_expectations_results.extend;
62+
l_expectations_results(l_expectations_results.last) := g_expectations_called(i);
63+
end if;
64+
end loop;
65+
ut_utils.debug_log('ut_expectation_processor.get_expectations_results: l_expectations_results.count='||g_expectations_called.count);
6066
clear_expectations();
6167
return l_expectations_results;
6268
end get_expectations_results;

source/reporters/ut_coverage_report_html_helper.pkb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ create or replace package body ut_coverage_report_html_helper is
106106
dbms_lob.createtemporary(l_result, true);
107107
l_coverage_pct := coverage_pct(a_coverage_unit.covered_lines, a_coverage_unit.uncovered_lines);
108108
l_file_part :=
109-
'<div class="source_table" id="'||a_object_id||'"><div class="header"> <h3>'||a_object_full_name||'</h3>' ||
109+
'<div class="source_table" id="'||a_object_id||'"><div class="header"> <h3>'||dbms_xmlgen.convert(a_object_full_name)||'</h3>' ||
110110
'<h4><span class="'||coverage_css_class(l_coverage_pct)||'">'||l_coverage_pct||' %</span> covered</h4>' ||
111111
'<div> <b>'||(a_coverage_unit.covered_lines+a_coverage_unit.uncovered_lines)||'</b> relevant lines. ' ||
112112
'<span class="green"><b>'||a_coverage_unit.covered_lines||'</b> lines covered</span> and ' ||
@@ -179,7 +179,7 @@ create or replace package body ut_coverage_report_html_helper is
179179
l_file_part :=
180180
chr(10)||
181181
'<tr>' ||
182-
'<td class="strong">'||link_to_source_file(l_unit)||'</td>' ||
182+
'<td class="strong">'||link_to_source_file(dbms_xmlgen.convert(l_unit))||'</td>' ||
183183
'<td class="'||coverage_css_class(l_coverage_pct)||' strong">'||l_coverage_pct||' %</td>' ||
184184
'<td>'||l_unit_coverage.total_lines||'</td>' ||
185185
'<td>'||(l_unit_coverage.covered_lines+l_unit_coverage.uncovered_lines)||'</td>' ||

source/reporters/ut_coverage_sonar_reporter.tpb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ create or replace type body ut_coverage_sonar_reporter is
6868
ut_utils.append_to_clob(l_result, c_coverage_header);
6969
l_unit := a_coverage_data.objects.first;
7070
while l_unit is not null loop
71-
l_file_part := '<file path="'||l_unit||'">'||chr(10);
71+
l_file_part := '<file path="'||dbms_xmlgen.convert(l_unit)||'">'||chr(10);
7272
ut_utils.append_to_clob(l_result, l_file_part);
7373

7474
dbms_lob.append(l_result,get_lines_xml(a_coverage_data.objects(l_unit)));

source/reporters/ut_documentation_reporter.tpb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,7 @@ create or replace type body ut_documentation_reporter is
111111
self.print_red_text(ut_utils.table_to_clob(a_test.get_error_stack_traces()));
112112

113113
for j in 1 .. a_test.results.count loop
114-
if a_test.results(j).status > ut_utils.tr_success then
115-
print_failure_for_expectation(a_test.results(j));
116-
end if;
114+
print_failure_for_expectation(a_test.results(j));
117115
end loop;
118116

119117
self.lvl := self.lvl - 3;

source/reporters/ut_sonar_test_reporter.tpb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ create or replace type body ut_sonar_test_reporter is
4545
procedure print_test_results(a_test ut_test) is
4646
l_lines ut_varchar2_list;
4747
begin
48-
self.print_text('<testCase name="'||a_test.name||'" duration="'||round(a_test.execution_time()*1000,0)||'" >');
48+
self.print_text('<testCase name="'||dbms_xmlgen.convert(a_test.name)||'" duration="'||round(a_test.execution_time()*1000,0)||'" >');
4949
if a_test.result = ut_utils.tr_disabled then
5050
self.print_text('<skipped message="skipped"/>');
5151
elsif a_test.result = ut_utils.tr_error then
@@ -77,7 +77,7 @@ create or replace type body ut_sonar_test_reporter is
7777
end if;
7878
end loop;
7979
if a_suite is of(ut_suite) then
80-
self.print_text('<file path="'||map_package_to_file(treat(a_suite as ut_suite), a_file_mappings)||'">');
80+
self.print_text('<file path="'||dbms_xmlgen.convert(map_package_to_file(treat(a_suite as ut_suite), a_file_mappings))||'">');
8181

8282
for i in 1 .. a_suite.items.count loop
8383
if a_suite.items(i) is of(ut_test) then

source/reporters/ut_teamcity_reporter.tpb

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ create or replace type body ut_teamcity_reporter is
5757
end;
5858

5959
overriding member procedure after_calling_test(self in out nocopy ut_teamcity_reporter, a_test in ut_test) is
60-
l_expectation ut_expectation_result;
6160
l_test_full_name varchar2(4000);
6261
l_std_err_msg varchar2(32767);
6362
begin
@@ -98,19 +97,11 @@ create or replace type body ut_teamcity_reporter is
9897
,a_details => trim(l_std_err_msg) || case when a_test.results is not null and a_test.results.count>0 then a_test.results(1)
9998
.message end));
10099
elsif a_test.results is not null and a_test.results.count > 0 then
101-
for i in 1 .. a_test.results.count loop
100+
-- Teamcity supports only a single failure message
102101

103-
l_expectation := a_test.results(i);
104-
105-
if l_expectation.status > ut_utils.tr_success then
106-
self.print_text(ut_teamcity_reporter_helper.test_failed(a_test_name => l_test_full_name
107-
,a_msg => l_expectation.description
108-
,a_details => l_expectation.message ));
109-
-- Teamcity supports only a single failure message
110-
exit;
111-
end if;
112-
113-
end loop;
102+
self.print_text(ut_teamcity_reporter_helper.test_failed(a_test_name => l_test_full_name
103+
,a_msg => a_test.results(a_test.results.first).description
104+
,a_details => a_test.results(a_test.results.first).message ));
114105
elsif a_test.result = ut_utils.tr_failure then
115106
self.print_text(ut_teamcity_reporter_helper.test_failed(a_test_name => l_test_full_name
116107
,a_msg => 'Test failed'));

source/reporters/ut_xunit_reporter.tpb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ create or replace type body ut_xunit_reporter is
3636
l_lines ut_varchar2_list;
3737
l_output clob;
3838
begin
39-
self.print_text('<testcase classname="' || get_path(a_test.path, a_test.name) || '" ' || ' assertions="' ||
39+
self.print_text('<testcase classname="' || dbms_xmlgen.convert(get_path(a_test.path, a_test.name)) || '" ' || ' assertions="' ||
4040
coalesce(cardinality(a_test.results), 0) || '"' || self.get_common_item_attributes(a_test) || case when
4141
a_test.result != ut_utils.tr_success then
4242
' status="' || ut_utils.test_result_to_char(a_test.result) || '"' end || '>');
@@ -54,9 +54,10 @@ create or replace type body ut_xunit_reporter is
5454
self.print_text('<![CDATA[');
5555
for i in 1 .. a_test.results.count loop
5656
l_lines := a_test.results(i).get_result_lines();
57-
for i in 1 .. l_lines.count loop
58-
self.print_text(l_lines(i));
57+
for j in 1 .. l_lines.count loop
58+
self.print_text(l_lines(j));
5959
end loop;
60+
self.print_text(a_test.results(i).caller_info);
6061
end loop;
6162
self.print_text(']]>');
6263
self.print_text('</failure>');
@@ -80,7 +81,7 @@ create or replace type body ut_xunit_reporter is
8081
begin
8182
a_suite_id := a_suite_id + 1;
8283
self.print_text('<testsuite tests="' || l_tests_count || '"' || ' id="' || a_suite_id || '"' || ' package="' ||
83-
a_suite.path || '" ' || self.get_common_item_attributes(a_suite) || '>');
84+
dbms_xmlgen.convert(a_suite.path) || '" ' || self.get_common_item_attributes(a_suite) || '>');
8485
if a_suite is of(ut_suite) then
8586
l_suite := treat(a_suite as ut_suite);
8687

@@ -122,7 +123,7 @@ create or replace type body ut_xunit_reporter is
122123

123124
member function get_common_item_attributes(a_item ut_suite_item) return varchar2 is
124125
begin
125-
return ' skipped="' || a_item.results_count.disabled_count || '" error="' || a_item.results_count.errored_count || '"' || ' failure="' || a_item.results_count.failure_count || '" name="' || nvl(a_item.description, a_item.name) || '"' || ' time="' || a_item.execution_time() || '" ';
126+
return ' skipped="' || a_item.results_count.disabled_count || '" error="' || a_item.results_count.errored_count || '"' || ' failure="' || a_item.results_count.failure_count || '" name="' || dbms_xmlgen.convert(nvl(a_item.description, a_item.name)) || '"' || ' time="' || a_item.execution_time() || '" ';
126127
end;
127128

128129
end;

test/install_tests.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
set define off
12
whenever sqlerror exit failure rollback
23
whenever oserror exit failure rollback
34

@@ -10,6 +11,7 @@ whenever oserror exit failure rollback
1011
@@ut_reporters/test_coverage.pks
1112
@@ut_reporters/test_coverage_sonar_reporter.pks
1213
@@ut_reporters/test_coveralls_reporter.pks
14+
@@ut_reporters/test_xunit_reporter.pks
1315
@ut_expectations/test_expectations_cursor.pks
1416
@@ut_runner/test_ut_runner.pks
1517

@@ -22,6 +24,7 @@ whenever oserror exit failure rollback
2224
@@ut_reporters/test_coverage.pkb
2325
@@ut_reporters/test_coverage_sonar_reporter.pkb
2426
@@ut_reporters/test_coveralls_reporter.pkb
27+
@@ut_reporters/test_xunit_reporter.pkb
2528
@ut_expectations/test_expectations_cursor.pkb
2629
@@ut_runner/test_ut_runner.pkb
2730

test/ut_reporters/test_coverage.pks

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
create or replace package test_coverage is
22

33
--%suite
4-
--%suitepath(utplsql.core)
4+
--%suitepath(utplsql.core.reporters)
55

66
--%beforeall
77
procedure setup_dummy_coverage;

test/ut_reporters/test_coverage_sonar_reporter.pkb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
create or replace package body test_coverage_sonar_reporter is
22

33
procedure report_on_file is
4-
v_run_id integer;
54
l_results ut3.ut_varchar2_list;
65
l_expected clob;
76
l_actual clob;

0 commit comments

Comments
 (0)