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

Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
b1f6323
Initial, incomplete version of reporter
PhilippSalvisberg Dec 17, 2018
e83eeaf
added grants ans synonyms for ut_sqldev_reporter
PhilippSalvisberg Dec 17, 2018
99c1d31
rename ut_sqldev_reporter to ut_realtime_reporter
PhilippSalvisberg Dec 27, 2018
6531e08
add initial test suite for ut_realtime_reporter
PhilippSalvisberg Dec 28, 2018
28a1a73
install test_realtime_reporter
PhilippSalvisberg Dec 28, 2018
010b8fd
add ut_realtime_reporter to list of core reporters
PhilippSalvisberg Dec 28, 2018
9e79e6f
use print_xml_fragment for pretty printing
PhilippSalvisberg Dec 28, 2018
4b29c56
changed formatting and comments
PhilippSalvisberg Dec 28, 2018
2f22a89
new XML report format, using XML attributes for id only
PhilippSalvisberg Dec 28, 2018
d45c88c
extended unit test, reasonable coverage, helps understanding the repo…
PhilippSalvisberg Dec 28, 2018
b37b188
enable drop of test packages
PhilippSalvisberg Dec 28, 2018
8c1c561
remove hard-coded owner ut3_tester
PhilippSalvisberg Dec 28, 2018
bcf1606
make complete event a.s.a.p. visible in consuming session
PhilippSalvisberg Dec 28, 2018
d4b09c7
fix incompatibility to 12.1
PhilippSalvisberg Dec 29, 2018
c2cc292
Fixed typos in comments and made comments more precise.
PhilippSalvisberg Dec 29, 2018
0c6a0ad
get_description synchronized with type specification.
PhilippSalvisberg Dec 29, 2018
7134f13
use print_end_node to close tags
PhilippSalvisberg Dec 29, 2018
2577566
removed duplicate line feed
PhilippSalvisberg Dec 29, 2018
1672248
removed duplicate line feed
PhilippSalvisberg Dec 29, 2018
42cf8ee
change description of the tests to reflect the requirements as sugges…
PhilippSalvisberg Dec 29, 2018
6512cf8
replace granular self.print_text_lines calls with a few self.print_te…
PhilippSalvisberg Dec 29, 2018
c1273af
added text_xmltype_list collection type for test_realtime_reporter
PhilippSalvisberg Dec 29, 2018
b05760d
install new collection type test_xmltype_list for test_realtime_reporter
PhilippSalvisberg Dec 29, 2018
93e4ea8
add xml_header attribute, used for each produced document
PhilippSalvisberg Dec 29, 2018
290ca30
replace hard-coded id attribute with name and value for an optional a…
PhilippSalvisberg Dec 29, 2018
e570e48
produce an XML document for each event resulting in a new output stru…
PhilippSalvisberg Dec 29, 2018
17ed198
changed name and description to match new output structure
PhilippSalvisberg Dec 29, 2018
eef5938
test 26 event-based XML documents produced by the revised reporter
PhilippSalvisberg Dec 29, 2018
eba2e9e
change comment to reflect new role of the member procedure
PhilippSalvisberg Dec 30, 2018
8f5b736
Added `item_type` attribute to output buffer.
jgebal Dec 30, 2018
e02d238
Added `item_type` attribute to output reporters.
jgebal Dec 30, 2018
fc0f0e9
Fixed failing examples.
jgebal Dec 30, 2018
fb96511
create object type and collection type for test_realtime_reporter
PhilippSalvisberg Dec 31, 2018
957e5c9
produce 1 row per event document using new output buffer
PhilippSalvisberg Dec 31, 2018
f992193
renamed package persistent variable
PhilippSalvisberg Dec 31, 2018
576b8ea
Fix crash due to null value.
PhilippSalvisberg Dec 31, 2018
73669eb
Fixed issues with nested runs
PhilippSalvisberg Jan 1, 2019
cc3a7e4
Extracted duplicated code from pipelined functions into `get_report_o…
jgebal Jan 1, 2019
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
Prev Previous commit
Next Next commit
new XML report format, using XML attributes for id only
  • Loading branch information
PhilippSalvisberg committed Dec 28, 2018
commit 2f22a8955e2f42ea06c9e5a5ecf8dfbb5201ef8b
231 changes: 177 additions & 54 deletions source/reporters/ut_realtime_reporter.tpb
Original file line number Diff line number Diff line change
Expand Up @@ -16,96 +16,219 @@ create or replace type body ut_realtime_reporter is
limitations under the License.
*/

constructor function ut_realtime_reporter(self in out nocopy ut_realtime_reporter) return self as result is
constructor function ut_realtime_reporter(
self in out nocopy ut_realtime_reporter
) return self as result is
begin
self.init($$plsql_unit);
total_number_of_tests := 0;
current_test_number := 0;
current_indent := 0;
return;
end;

overriding member procedure before_calling_run(self in out nocopy ut_realtime_reporter, a_run in ut_run) is
procedure print_test_elements(a_test ut_test) is
overriding member procedure before_calling_run(
self in out nocopy ut_realtime_reporter,
a_run in ut_run
) is
procedure print_test_elements(
a_test in ut_test
) is
begin
self.print_xml_fragment('<testcase path="' || a_test.path || '"'
|| ' executable_type="' || a_test.item.executable_type || '"'
|| ' owner_name="' || a_test.item.owner_name || '"'
|| ' object_name="' || a_test.item.object_name || '"'
|| ' procedure_name="' || a_test.item.procedure_name || '"'
|| ' disabled="' || case when a_test.get_disabled_flag() then 'true' else 'false' end || '"'
|| ' name="' || a_test.name || '"'
|| ' description="' || a_test.description || '"/>');
end;
total_number_of_tests := total_number_of_tests + 1;
self.print_start_node('test', a_test.path);
self.print_node('executableType', a_test.item.executable_type);
self.print_node('ownerName', a_test.item.owner_name);
self.print_node('objectName', a_test.item.object_name);
self.print_node('procedureName', a_test.item.procedure_name);
self.print_node('disabled', case when a_test.get_disabled_flag() then 'true' else 'false' end);
self.print_node('name', a_test.name);
self.print_node('description', a_test.description);
self.print_node('testNumber', to_char(total_number_of_tests));
self.print_end_node('test');
end print_test_elements;

procedure print_suite_elements(a_suite ut_logical_suite) is
procedure print_suite_elements(
a_suite in ut_logical_suite
) is
begin
self.print_xml_fragment('<testsuite path="' || a_suite.path || '"'
|| ' name="' || a_suite.name || '"'
|| ' description="' || a_suite.description || '">', 0, 1);
self.print_start_node('suite', a_suite.path);
self.print_node('name', a_suite.name);
self.print_node('description', a_suite.description);
<<suite_elements>>
for i in 1 .. a_suite.items.count loop
if a_suite.items(i) is of(ut_test) then
print_test_elements(treat(a_suite.items(i) as ut_test));
elsif a_suite.items(i) is of(ut_logical_suite) then
print_suite_elements(treat(a_suite.items(i) as ut_logical_suite));
end if;
end loop;
self.print_xml_fragment('</testsuite>', -1);
end;

end loop suite_elements;
self.print_end_node('suite');
end print_suite_elements;
begin
self.print_xml_fragment(ut_utils.get_xml_header(a_run.client_character_set));
self.print_xml_fragment('<report>', 0, 1);
self.print_xml_fragment('<prolog>', 0, 1);
self.print_xml_fragment('<testsuites>', 0, 1);
self.print_start_node('report');
self.print_start_node('preRun');
self.print_start_node('suites');
<<items>>
for i in 1 .. a_run.items.count loop
print_suite_elements(treat(a_run.items(i) as ut_logical_suite));
end loop;
self.print_xml_fragment('</testsuites>', -1);
self.print_xml_fragment('</prolog>', -1);
self.print_xml_fragment('<run>', 0, 1);
end;
end loop items;
self.print_end_node('suites');
self.print_node('totalNumberOfTests', to_char(total_number_of_tests));
self.print_end_node('preRun');
self.print_start_node('runEvents');
end before_calling_run;

overriding member procedure after_calling_run(
self in out nocopy ut_realtime_reporter,
a_run in ut_run
) is
begin
self.print_xml_fragment('</runEvents>', -1);
self.print_xml_fragment('</report>', -1);
end after_calling_run;

overriding member procedure before_calling_test(self in out nocopy ut_realtime_reporter, a_test in ut_test) as
overriding member procedure before_calling_suite(
self in out nocopy ut_realtime_reporter,
a_suite in ut_logical_suite
) is
begin
self.print_xml_fragment('<test path="' || a_test.path || '"'
|| ' executable_type="' || a_test.item.executable_type || '"'
|| ' owner_name="' || a_test.item.owner_name || '"'
|| ' object_name="' || a_test.item.object_name || '"'
|| ' procedure_name="' || a_test.item.procedure_name || '"'
|| ' disabled="' || case when a_test.get_disabled_flag() then 'true' else 'false' end || '"/>', 1, -1);
end;
self.print_start_node('startSuiteEvent', a_suite.path);
self.print_end_node('startSuiteEvent');
end before_calling_suite;

overriding member procedure after_calling_suite(
self in out nocopy ut_realtime_reporter,
a_suite in ut_logical_suite
) is
begin
self.print_start_node('endSuiteEvent', a_suite.path);
self.print_node('startTime', to_char(a_suite.start_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
self.print_node('endTime', to_char(a_suite.end_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
self.print_node('executionTime', ut_utils.to_xml_number_format(a_suite.execution_time()));
self.print_start_node('counter');
self.print_node('disabled', to_char(a_suite.results_count.disabled_count));
self.print_node('success', to_char(a_suite.results_count.success_count));
self.print_node('failure', to_char(a_suite.results_count.failure_count));
self.print_node('error', to_char(a_suite.results_count.errored_count));
self.print_node('warning', to_char(a_suite.results_count.warnings_count));
self.print_end_node('counter');
self.print_cdata_node('errorStack', ut_utils.table_to_clob(a_suite.get_error_stack_traces()));
self.print_cdata_node('serverOutput', a_suite.get_serveroutputs());
self.print_end_node('endSuiteEvent');
end after_calling_suite;

overriding member procedure before_calling_test(
self in out nocopy ut_realtime_reporter,
a_test in ut_test
) is
begin
current_test_number := current_test_number + 1;
self.print_start_node('startTestEvent', a_test.path);
self.print_node('testNumber', to_char(current_test_number));
self.print_node('totalNumberOfTests', to_char(total_number_of_tests));
self.print_end_node('startTestEvent');
end before_calling_test;

overriding member procedure after_calling_test(self in out nocopy ut_realtime_reporter, a_test in ut_test) as
overriding member procedure after_calling_test(
self in out nocopy ut_realtime_reporter,
a_test in ut_test
) is
begin
self.print_xml_fragment('');
end;
self.print_start_node('endTestEvent', a_test.path);
self.print_node('testNumber', to_char(current_test_number));
self.print_node('totalNumberOfTests', to_char(total_number_of_tests));
self.print_node('startTime', to_char(a_test.start_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
self.print_node('endTime', to_char(a_test.end_time, 'YYYY-MM-DD"T"HH24:MI:SS.FF6'));
self.print_node('executionTime', ut_utils.to_xml_number_format(a_test.execution_time()));
self.print_start_node('counter');
self.print_node('disabled', to_char(a_test.results_count.disabled_count));
self.print_node('success', to_char(a_test.results_count.success_count));
self.print_node('failure', to_char(a_test.results_count.failure_count));
self.print_node('error', to_char(a_test.results_count.errored_count));
self.print_node('warning', to_char(a_test.results_count.warnings_count));
self.print_end_node('counter');
self.print_cdata_node('errorStack', ut_utils.table_to_clob(a_test.get_error_stack_traces()));
self.print_cdata_node('serverOutput', a_test.get_serveroutputs());
if a_test.failed_expectations.count > 0 then
self.print_start_node('failedExpectations');
<<expectations>>
for i in 1 .. a_test.failed_expectations.count loop
self.print_start_node('expectation');
self.print_node('description', a_test.failed_expectations(i).description);
self.print_cdata_node('message', a_test.failed_expectations(i).message);
self.print_cdata_node('caller', a_test.failed_expectations(i).caller_info);
self.print_end_node('expectation');
end loop expectations;
self.print_end_node('failedExpectations');
end if;
self.print_end_node('endTestEvent');
end after_calling_test;

overriding member procedure after_calling_suite(self in out nocopy ut_realtime_reporter, a_suite in ut_logical_suite) as
overriding member function get_description return varchar2 is
begin
self.print_xml_fragment('');
end;
return 'Provides test results in a XML format, for clients such as SQL Developer interested progressing details.';
end get_description;

overriding member procedure after_calling_run(self in out nocopy ut_realtime_reporter, a_run in ut_run) as
member procedure print_start_node(
self in out nocopy ut_realtime_reporter,
a_name in varchar2,
a_id in varchar2 default null
) is
begin
self.print_xml_fragment('</run>', -1);
self.print_xml_fragment('</report>', -1);
end;
self.print_xml_fragment(
'<' || a_name
|| case
when a_id is not null then
' id="' || dbms_xmlgen.convert(a_id) || '"'
end
|| '>',
0, 1
);
end print_start_node;

member procedure print_end_node(
self in out nocopy ut_realtime_reporter,
a_name in varchar2
) is
begin
self.print_xml_fragment('</' || a_name || '>', -1);
end print_end_node;

overriding member function get_description return varchar2 as
member procedure print_node(
self in out nocopy ut_realtime_reporter,
a_name in varchar2,
a_content in clob
) is
begin
return 'Provides test results in a XML format, to consumed by clients such as SQL Developer interested progressing details.';
end;
if a_content is not null then
self.print_xml_fragment('<' || a_name || '>' || dbms_xmlgen.convert(a_content) || '</' || a_name || '>');
end if;
end print_node;

member procedure print_cdata_node(
self in out nocopy ut_realtime_reporter,
a_name in varchar2,
a_content in clob
) is
begin
if a_content is not null then
self.print_xml_fragment('<' || a_name || '><![CDATA[' || a_content || ']]></' || a_name || '>');
end if;
end print_cdata_node;

member procedure print_xml_fragment(
self in out nocopy ut_realtime_reporter,
a_fragment in varchar2,
a_indent_summand_before in integer default 0,
a_indent_summand_after in integer default 0
) as
a_fragment in clob,
a_indent_summand_before in integer default 0,
a_indent_summand_after in integer default 0
) is
begin
current_indent := current_indent + a_indent_summand_before;
self.print_text(lpad(' ', 2 * current_indent) || a_fragment);
current_indent := current_indent + a_indent_summand_after;
end;
end print_xml_fragment;

end;
/