@@ -51,11 +51,12 @@ create or replace type body ut_tfs_junit_reporter is
5151 return regexp_substr(a_path_with_name, '(.*)\.' ||a_name||'$',subexpression=>1);
5252 end;
5353
54- procedure print_test_results (a_test ut_test) is
54+ function add_test_results (a_test ut_test) return ut_varchar2_rows is
5555 l_results ut_varchar2_rows := ut_varchar2_rows();
5656 begin
57- self.print_text( '<testcase classname="' || dbms_xmlgen.convert(get_path(a_test.path, a_test.name)) || '" ' ||
57+ ut_utils.append_to_list( l_results, '<testcase classname="' || dbms_xmlgen.convert(get_path(a_test.path, a_test.name)) || '" ' ||
5858 get_common_testcase_attributes(a_test) || '>');
59+
5960 /*
6061 According to specs :
6162 - A failure is a test which the code has explicitly failed by using the mechanisms for that purpose.
@@ -83,64 +84,87 @@ create or replace type body ut_tfs_junit_reporter is
8384
8485 ut_utils.append_to_list( l_results, '</testcase>');
8586
86- self.print_text_lines( l_results) ;
87+ return l_results;
8788 end;
8889
89- procedure print_suite_results(a_suite ut_logical_suite, a_suite_id in out nocopy integer) is
90+ procedure print_suite_results(a_suite ut_logical_suite, a_suite_id in out nocopy integer, a_nested_tests in out nocopy ut_varchar2_rows ) is
9091 l_tests_count integer := a_suite.results_count.disabled_count + a_suite.results_count.success_count +
9192 a_suite.results_count.failure_count + a_suite.results_count.errored_count;
9293 l_results ut_varchar2_rows := ut_varchar2_rows();
9394 l_suite ut_suite;
9495 l_outputs clob;
9596 l_errors ut_varchar2_list;
96- begin
97-
97+ l_tests ut_varchar2_list;
98+ begin
9899 for i in 1 .. a_suite.items.count loop
99- if a_suite.items(i) is of(ut_logical_suite) then
100- print_suite_results(treat(a_suite.items(i) as ut_logical_suite), a_suite_id);
100+ if a_suite.items(i) is of(ut_suite_context) then
101+ print_suite_results(treat(a_suite.items(i) as ut_suite_context), a_suite_id, a_nested_tests);
102+ elsif a_suite.items(i) is of(ut_suite) then
103+ print_suite_results(treat(a_suite.items(i) as ut_suite), a_suite_id, a_nested_tests);
104+ elsif a_suite.items(i) is of(ut_logical_suite) then
105+ print_suite_results(treat(a_suite.items(i) as ut_logical_suite), a_suite_id, a_nested_tests);
101106 end if;
102107 end loop;
103-
104- if a_suite is of(ut_suite) then
105- a_suite_id := a_suite_id + 1;
106- self.print_text('<testsuite tests="' || l_tests_count || '"' || ' id="' || a_suite_id || '"' || ' package="' ||
107- dbms_xmlgen.convert(a_suite.path) || '" ' || get_common_suite_attributes(a_suite) || '>');
108- self.print_text('<properties/>');
108+ --Due to fact tha TFS and junit5 accepts only flat structure we have to report in suite level only.
109+ if a_suite is of(ut_suite_context) then
109110 for i in 1 .. a_suite.items.count loop
110111 if a_suite.items(i) is of(ut_test) then
111- print_test_results( treat(a_suite.items(i) as ut_test));
112+ ut_utils.append_to_list( a_nested_tests,(add_test_results( treat(a_suite.items(i) as ut_test)) ));
112113 end if;
113114 end loop;
114- l_suite := treat(a_suite as ut_suite);
115- l_outputs := l_suite.get_serveroutputs();
116- if l_outputs is not null and l_outputs != empty_clob() then
117- ut_utils.append_to_list( l_results, '<system-out>');
118- ut_utils.append_to_list( l_results, ut_utils.to_cdata( l_suite.get_serveroutputs() ) );
119- ut_utils.append_to_list( l_results, '</system-out>');
120- else
121- ut_utils.append_to_list( l_results, '<system-out/>');
122- end if;
123-
124- l_errors := l_suite.get_error_stack_traces();
125- if l_errors is not empty then
126- ut_utils.append_to_list( l_results, '<system-err>');
127- ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( l_errors ) ) );
128- ut_utils.append_to_list( l_results, '</system-err>');
129- else
130- ut_utils.append_to_list( l_results, '<system-err/>');
131- end if;
132- ut_utils.append_to_list( l_results, '</testsuite>');
133-
134- self.print_text_lines(l_results);
115+ elsif a_suite is of(ut_suite) then
116+ for i in 1 .. a_suite.items.count loop
117+ if a_suite.items(i) is of(ut_test) then
118+ ut_utils.append_to_list( a_nested_tests,(add_test_results(treat(a_suite.items(i) as ut_test))));
119+ end if;
120+ end loop;
121+ --TFS doesnt report on empty test suites, however all we want to make sure is that we dont pring parents suites
122+ -- showing test count but not tests.
123+ if (a_nested_tests.count > 0 and l_tests_count > 0) or (a_nested_tests.count = 0 and l_tests_count = 0) then
124+ a_suite_id := a_suite_id + 1;
125+ ut_utils.append_to_list( l_results,'<testsuite tests="' || l_tests_count || '"' || ' id="' || a_suite_id || '"' || ' package="' ||
126+ dbms_xmlgen.convert(a_suite.path) || '" ' || get_common_suite_attributes(a_suite) || '>');
127+ ut_utils.append_to_list( l_results,'<properties/>');
128+ ut_utils.append_to_list(l_results,a_nested_tests);
129+ l_suite := treat(a_suite as ut_suite);
130+ l_outputs := l_suite.get_serveroutputs();
131+ if l_outputs is not null and l_outputs != empty_clob() then
132+ ut_utils.append_to_list( l_results, '<system-out>');
133+ ut_utils.append_to_list( l_results, ut_utils.to_cdata( l_suite.get_serveroutputs() ) );
134+ ut_utils.append_to_list( l_results, '</system-out>');
135+ else
136+ ut_utils.append_to_list( l_results, '<system-out/>');
137+ end if;
138+
139+ l_errors := l_suite.get_error_stack_traces();
140+ if l_errors is not empty then
141+ ut_utils.append_to_list( l_results, '<system-err>');
142+ ut_utils.append_to_list( l_results, ut_utils.to_cdata( ut_utils.convert_collection( l_errors ) ) );
143+ ut_utils.append_to_list( l_results, '</system-err>');
144+ else
145+ ut_utils.append_to_list( l_results, '<system-err/>');
146+ end if;
147+ ut_utils.append_to_list( l_results, '</testsuite>');
148+
149+ self.print_text_lines(l_results);
150+ --We have resolved a context and we now reset value.
151+ a_nested_tests := ut_varchar2_rows();
152+ end if;
135153 end if;
136154 end;
155+
156+ procedure get_suite_results(a_suite ut_logical_suite, a_suite_id in out nocopy integer) is
157+ l_nested_tests ut_varchar2_rows:= ut_varchar2_rows();
158+ begin
159+ print_suite_results(a_suite, l_suite_id,l_nested_tests);
160+ end;
137161
138162 begin
139163 l_suite_id := 0;
140164 self.print_text(ut_utils.get_xml_header(a_run.client_character_set));
141165 self.print_text('<testsuites>');
142166 for i in 1 .. a_run.items.count loop
143- print_suite_results (treat(a_run.items(i) as ut_logical_suite), l_suite_id);
167+ get_suite_results (treat(a_run.items(i) as ut_logical_suite), l_suite_id);
144168 end loop;
145169 self.print_text('</testsuites>');
146170 end;
0 commit comments