8000 Failure details in sonar test reporter are now CDATA by jgebal · Pull Request #926 · utPLSQL/utPLSQL · GitHub
[go: up one dir, main page]

Skip to content

Failure details in sonar test reporter are now CDATA #926

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jun 2, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions source/core/types/ut_test.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -162,5 +162,15 @@ create or replace type body ut_test as
end loop;
return l_outputs;
end;

member function get_failed_expectation_lines return ut_varchar2_rows is
l_results ut_varchar2_rows;
begin
for i in 1 .. failed_expectations.count loop
ut_utils.append_to_list( l_results, ut_utils.convert_collection( failed_expectations(i).get_result_lines() ) );
ut_utils.append_to_list( l_results, failed_expectations(i).caller_info );
end loop;
return l_results;
end;
end;
/
3 changes: 2 additions & 1 deletion source/core/types/ut_test.tps
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ create or replace type ut_test under ut_suite_item (
overriding member procedure calc_execution_result(self in out nocopy ut_test),
overriding member procedure mark_as_errored(self in out nocopy ut_test, a_error_stack_trace varchar2),
overriding member function get_error_stack_traces(self ut_test) return ut_varchar2_list,
overriding member function get_serveroutputs return clob
overriding member function get_serveroutputs return clob,
member function get_failed_expectation_lines return ut_varchar2_rows
)
/
26 changes: 26 additions & 0 deletions source/core/ut_utils.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -798,5 +798,31 @@ create or replace package body ut_utils is
return l_valid_name;
end;

function to_cdata(a_lines ut_varchar2_rows) return ut_varchar2_rows is
l_results ut_varchar2_rows;
begin
if a_lines is not empty then
ut_utils.append_to_list( l_results, gc_cdata_start_tag);
for i in 1 .. a_lines.count loop
ut_utils.append_to_list( l_results, replace( a_lines(i), gc_cdata_end_tag, gc_cdata_end_tag_wrap ) );
end loop;
ut_utils.append_to_list( l_results, gc_cdata_end_tag);
else
l_results := a_lines;
end if;
return l_results;
end;

function to_cdata(a_clob clob) return clob is
l_result clob;
begin
if a_clob is not null and a_clob != empty_clob() then
l_result := replace( a_clob, gc_cdata_end_tag, gc_cdata_end_tag_wrap );
else
l_result := a_clob;
end if;
return l_result;
end;

end ut_utils;
/
21 changes: 19 additions & 2 deletions source/core/ut_utils.pks
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ create or replace package ut_utils authid definer is
gc_failure_char constant varchar2(7) := 'Failure'; -- one or more expectations failed
gc_error_char constant varchar2(5) := 'Error'; -- exception was raised

gc_cdata_start_tag constant varchar2(10) := '<![CDATA[';
gc_cdata_end_tag constant varchar2(10) := ']]>';
gc_cdata_end_tag_wrap constant varchar2(30) := ']]'||gc_cdata_end_tag||gc_cdata_start_tag||'>';


/*
Constants: Rollback type for ut_test_object
*/
Expand Down Expand Up @@ -386,6 +391,18 @@ create or replace package ut_utils authid definer is
* Check if xml name is valid if not build a valid name
*/
function get_valid_xml_name(a_name varchar2) return varchar2;

end ut_utils;

/**
* Converts input list into a list surrounded by CDATA tags
* All CDATA end tags get escaped using recommended method from https://en.wikipedia.org/wiki/CDATA#Nesting
*/
function to_cdata(a_lines ut_varchar2_rows) return ut_varchar2_rows;

/**
* Converts input CLOB into a CLOB surrounded by CDATA tags
* All CDATA end tags get escaped using recommended method from https://en.wikipedia.org/wiki/CDATA#Nesting
*/
function to_cdata(a_clob clob) return clob;

end ut_utils;
/
39 changes: 10 additions & 29 deletions source/reporters/ut_junit_reporter.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ create or replace type body ut_junit_reporter is
end;

overriding member procedure after_calling_run(self in out nocopy ut_junit_reporter, a_run in ut_run) is
c_cddata_tag_start constant varchar2(30) := '<![CDATA[';
c_cddata_tag_end constant varchar2(10) := ']]>';
l_suite_id integer := 0;
l_tests_count integer := a_run.results_count.disabled_count + a_run.results_count.success_count +
a_run.results_count.failure_count + a_run.results_count.errored_count;
Expand All @@ -36,8 +34,7 @@ create or replace type body ut_junit_reporter is

procedure print_test_elements(a_test ut_test) is
l_results ut_varchar2_rows := ut_varchar2_rows();
l_lines ut_varchar2_list;
l_output clob;
l_output clob;
begin
ut_utils.append_to_list(
l_results,
Expand All @@ -51,30 +48,18 @@ create or replace type body ut_junit_reporter is
end if;
if a_test.result = ut_utils.gc_error then
ut_utils.append_to_list( l_results, '<error>');
ut_utils.append_to_list( l_results, c_cddata_tag_start);
ut_utils.append_to_list( l_results, ut_utils.convert_collection(a_test.get_error_stack_traces()) );
ut_utils.append_to_list( l_results, c_cddata_tag_end);
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( a_test.get_error_stack_traces() ) ) );
ut_utils.append_to_list( l_results, '</error>');
elsif a_test.result > ut_utils.gc_success then
ut_utils.append_to_list( l_results, '<failure>');
for i in 1 .. a_test.failed_expectations.count loop

l_lines := a_test.failed_expectations(i).get_result_lines();

for j in 1 .. l_lines.count loop
ut_utils.append_to_list( l_results, dbms_xmlgen.convert(l_lines(j)) );
end loop;
ut_utils.append_to_list( l_results, dbms_xmlgen.convert(a_test.failed_expectations(i).caller_info) );
end loop;
ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_failed_expectation_lines() ) );
ut_utils.append_to_list( l_results, '</failure>');
end if;
-- TODO - decide if we need/want to use the <system-err/> tag too

l_output := a_test.get_serveroutputs();
if l_output is not null then
ut_utils.append_to_list( l_results, '<system-out>');
ut_utils.append_to_list( l_results, c_cddata_tag_start);
ut_utils.append_to_list( l_results, l_output);
ut_utils.append_to_list( l_results, c_cddata_tag_end );
ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_serveroutputs() ) );
ut_utils.append_to_list( l_results, '</system-out>' );
else
ut_utils.append_to_list( l_results, '<system-out/>');
Expand All @@ -86,7 +71,7 @@ create or replace type body ut_junit_reporter is
end;

procedure print_suite_elements(a_suite ut_logical_suite, a_suite_id in out nocopy integer) is
l_tests_count integer := a_suite.results_count.disabled_count + a_suite.results_count.success_count +
l_count integer := a_suite.results_count.disabled_count + a_suite.results_count.success_count +
a_suite.results_count.failure_count + a_suite.results_count.errored_count;
l_suite ut_suite;
l_tests ut_suite_items := ut_suite_items();
Expand All @@ -95,7 +80,7 @@ create or replace type body ut_junit_reporter is
l_errors ut_varchar2_list;
begin
a_suite_id := a_suite_id + 1;
self.print_text('<testsuite tests="' || l_tests_count || '"' || ' id="' || a_suite_id || '"' || ' package="' ||
self.print_text('<testsuite tests="' || l_count || '"' || ' id="' || a_suite_id || '"' || ' package="' ||
dbms_xmlgen.convert(a_suite.path) || '" ' || self.get_common_suite_attributes(a_suite) || '>');

-- Becasue testsuites have to appear before test we capture test and leave it for later.
Expand All @@ -117,11 +102,9 @@ create or replace type body ut_junit_reporter is
l_suite := treat(a_suite as ut_suite);

l_data := l_suite.get_serveroutputs();
if l_data is not null and l_data != empty_clob() then
if l_data is not null then
ut_utils.append_to_list( l_results, '<system-out>');
ut_utils.append_to_list( l_results, c_cddata_tag_start);
ut_utils.append_to_list( l_results, l_data);
ut_utils.append_to_list( l_results, c_cddata_tag_end);
ut_utils.append_to_list( l_results, ut_utils.to_cdata( l_data ) );
ut_utils.append_to_list( l_results, '</system-out>');
else
ut_utils.append_to_list( l_results, '<system-out/>');
Expand All @@ -130,9 +113,7 @@ create or replace type body ut_junit_reporter is
l_errors := l_suite.get_error_stack_traces();
if l_errors is not empty then
ut_utils.append_to_list( l_results, '<system-err>');
ut_utils.append_to_list( l_results, c_cddata_tag_start);
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(l_errors));
ut_utils.append_to_list( l_results, c_cddata_tag_end);
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( l_errors ) ) );
ut_utils.append_to_list( l_results, '</system-err>');
else
ut_utils.append_to_list( l_results, '<system-err/>');
Expand Down
14 changes: 3 additions & 11 deletions source/reporters/ut_sonar_test_reporter.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -43,26 +43,18 @@ create or replace type body ut_sonar_test_reporter is
end;

procedure print_test_results(a_test ut_test) is
l_results ut_varchar2_rows := ut_varchar2_rows();
l_lines ut_varchar2_list;
l_results ut_varchar2_rows := ut_varchar2_rows();
begin
ut_utils.append_to_list( l_results, '<testCase name="'||dbms_xmlgen.convert(a_test.name)||'" duration="'||round(a_test.execution_time()*1000,0)||'" >');
if a_test.result = ut_utils.gc_disabled then
ut_utils.append_to_list( l_results, '<skipped message="skipped"/>');
elsif a_test.result = ut_utils.gc_error then
ut_utils.append_to_list( l_results, '<error message="encountered errors">');
ut_utils.append_to_list( l_results, '<![CDATA[');
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.get_error_stack_traces()));
ut_utils.append_to_list( l_results, ']]>');
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( a_test.get_error_stack_traces() ) ) );
ut_utils.append_to_list( l_results, '</error>');
elsif a_test.result > ut_utils.gc_success then
ut_utils.append_to_list( l_results, '<failure message="some expectations have failed">');
for i in 1 .. a_test.failed_expectations.count loop
l_lines := a_test.failed_expectations(i).get_result_lines();
for i in 1 .. l_lines.count loop
ut_utils.append_to_list( l_results, dbms_xmlgen.convert(l_lines(i)));
end loop;
end loop;
ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_failed_expectation_lines() ) );
ut_utils.append_to_list( l_results, '</failure>');
end if;
ut_utils.append_to_list( l_results, '</testCase>');
Expand Down
81 changes: 33 additions & 48 deletions source/reporters/ut_tfs_junit_reporter.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@ create or replace type body ut_tfs_junit_reporter is

member procedure junit_version_one(self in out nocopy ut_tfs_junit_reporter,a_run in ut_run) is
l_suite_id integer := 0;
l_tests_count integer := a_run.results_count.disabled_count + a_run.results_count.success_count +
a_run.results_count.failure_count + a_run.results_count.errored_count;


function get_common_suite_attributes(a_item ut_suite_item) return varchar2 is
begin
return ' errors="' ||a_item.results_count.errored_count || '"' ||
Expand All @@ -55,7 +53,6 @@ create or replace type body ut_tfs_junit_reporter is

procedure print_test_results(a_test ut_test) is
l_results ut_varchar2_rows := ut_varchar2_rows();
l_lines ut_varchar2_list;
begin
self.print_text('<testcase classname="' || dbms_xmlgen.convert(get_path(a_test.path, a_test.name)) || '" ' ||
get_common_testcase_attributes(a_test) || '>');
Expand All @@ -69,20 +66,12 @@ create or replace type body ut_tfs_junit_reporter is

if a_test.result = ut_utils.gc_error then
ut_utils.append_to_list( l_results, '<error type="error" message="Error while executing '||a_test.name||'">');
ut_utils.append_to_list( l_results, '<![CDATA[');
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(a_test.get_error_stack_traces()));
ut_utils.append_to_list( l_results, ']]>');
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( a_test.get_error_stack_traces() ) ) );
ut_utils.append_to_list( l_results, '</error>');
-- Do not count error as failure
elsif a_test.result = ut_utils.gc_failure then
ut_utils.append_to_list( l_results, '<failure type="failure" message="Test '||a_test.name||' failed">');
for i in 1 .. a_test.failed_expectations.count loop
l_lines := a_test.failed_expectations(i).get_result_lines();
for j in 1 .. l_lines.count loop
ut_utils.append_to_list( l_results, dbms_xmlgen.convert(l_lines(j)));
end loop;
ut_utils.append_to_list( l_results, dbms_xmlgen.convert(a_test.failed_expectations(i).caller_info));
end loop;
ut_utils.append_to_list( l_results, ut_utils.to_cdata( a_test.get_failed_expectation_lines() ) );
ut_utils.append_to_list( l_results, '</failure>');
end if;

Expand All @@ -106,43 +95,39 @@ create or replace type body ut_tfs_junit_reporter is
end if;
end loop;

if a_suite is of(ut_suite) then
a_suite_id := a_suite_id + 1;
self.print_text('<testsuite tests="' || l_tests_count || '"' || ' id="' || a_suite_id || '"' || ' package="' ||
dbms_xmlgen.convert(a_suite.path) || '" ' || get_common_suite_attributes(a_suite) || '>');
self.print_text('<properties/>');
for i in 1 .. a_suite.items.count loop
if a_suite.items(i) is of(ut_test) then
print_test_results(treat(a_suite.items(i) as ut_test));
end if;
end loop;
l_suite := treat(a_suite as ut_suite);
l_outputs := l_suite.get_serveroutputs();
if l_outputs is not null and l_outputs != empty_clob() then
ut_utils.append_to_list( l_results, '<system-out>');
ut_utils.append_to_list( l_results, '<![CDATA[');
ut_utils.append_to_list( l_results, l_outputs);
ut_utils.append_to_list( l_results, ']]>');
ut_utils.append_to_list( l_results, '</system-out>');
else
ut_utils.append_to_list( l_results, '<system-out/>');
end if;
if a_suite is of(ut_suite) then
a_suite_id := a_suite_id + 1;
self.print_text('<testsuite tests="' || l_tests_count || '"' || ' id="' || a_suite_id || '"' || ' package="' ||
dbms_xmlgen.convert(a_suite.path) || '" ' || get_common_suite_attributes(a_suite) || '>');
self.print_text('<properties/>');
for i in 1 .. a_suite.items.count loop
if a_suite.items(i) is of(ut_test) then
print_test_results(treat(a_suite.items(i) as ut_test));
end if;
end loop;
l_suite := treat(a_suite as ut_suite);
l_outputs := l_suite.get_serveroutputs();
if l_outputs is not null and l_outputs != empty_clob() then
ut_utils.append_to_list( l_results, '<system-out>');
ut_utils.append_to_list( l_results, ut_utils.to_cdata( l_suite.get_serveroutputs() ) );
ut_utils.append_to_list( l_results, '</system-out>');
else
ut_utils.append_to_list( l_results, '<system-out/>');
end if;

l_errors := l_suite.get_error_stack_traces();
if l_errors is not empty then
ut_utils.append_to_list( l_results, '<system-err>');
ut_utils.append_to_list( l_results, '<![CDATA[');
ut_utils.append_to_list( l_results, ut_utils.table_to_clob(l_errors));
ut_utils.append_to_list( l_results, ']]>');
ut_utils.append_to_list( l_results, '</system-err>');
else
ut_utils.append_to_list( l_results, '<system-err/>');
end if;
ut_utils.append_to_list( l_results, '</testsuite>');
l_errors := l_suite.get_error_stack_traces();
if l_errors is not empty then
ut_utils.append_to_list( l_results, '<system-err>');
ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( l_errors ) ) );
ut_utils.append_to_list( l_results, '</system-err>');
else
ut_utils.append_to_list( l_results, '<system-err/>');
end if;
ut_utils.append_to_list( l_results, '</testsuite>');

self.print_text_lines(l_results);
self.print_text_lines(l_results);
end if;
end;
end;

begin
l_suite_id := 0;
Expand Down
4 changes: 2 additions & 2 deletions test/ut3_user/api/test_ut_run.pkb
Original file line number Diff line number Diff line change
Expand Up @@ -734,8 +734,8 @@ Failures:%
procedure remove_time_from_results(a_results in out nocopy ut3.ut_varchar2_list) is
begin
for i in 1 .. a_results.count loop
a_results(i) := regexp_replace(a_results(i),'\[[0-9]*\.[0-9]+ sec\]','');
a_results(i) := regexp_replace(a_results(i),'Finished in [0-9]*\.[0-9]+ seconds','');
a_results(i) := regexp_replace(a_results(i),'\[[0-9]*[\.,][0-9]+ sec\]','');
a_results(i) := regexp_replace(a_results(i),'Finished in [0-9]*[\.,][0-9]+ seconds','');
end loop;
end;

Expand Down
Loading
0