11create or replace package body test_realtime_reporter as
22
3- g_actual_xml_report xmltype ;
3+ g_xml_reports test_xmltype_list := test_xmltype_list() ;
44
55 procedure create_test_suites_and_run is
66 pragma autonomous_transaction;
@@ -101,118 +101,157 @@ create or replace package body test_realtime_reporter as
101101 end;]';
102102
103103 <<run_report_and_cache_result>>
104- declare
105- l_results ut3.ut_varchar2_list ;
104+ declare
105+ l_clob clob ;
106106 begin
107- select *
108- bulk collect into l_results
109- from table(ut3.ut.run('ut3_tester:realtime_reporting', ut3.ut_realtime_reporter()));
110- g_actual_xml_report := xmltype(ut3.ut_utils.table_to_clob(l_results));
107+ g_xml_reports.delete;
108+ <<report_lines>>
109+ for r in (
110+ with
111+ base as (
112+ select sum(case when column_value like '<?xml%' then 1 else 0 end) over(order by rownum) group_no,
113+ rownum as rn,
114+ column_value as line
115+ from table(ut3.ut.run('ut3_tester:realtime_reporting', ut3.ut_realtime_reporter()))
116+ )
117+ select group_no,
118+ lead(group_no, 1, -1) over (order by rn) as next_group_no,
119+ rn,
120+ line
121+ from base
122+ order by rn
123+ ) loop
124+ ut3.ut_utils.append_to_clob(l_clob, r.line);
125+ ut3.ut_utils.append_to_clob(l_clob, chr(10));
126+ if r.group_no != r.next_group_no then
127+ g_xml_reports.extend;
128+ g_xml_reports(g_xml_reports.count) := xmltype(l_clob);
129+ l_clob := null;
130+ end if;
131+ end loop report_lines;
111132 end run_report_and_cache_result;
112133 end create_test_suites_and_run;
113134
114135 procedure xml_report_structure is
115- l_actual clob;
116- l_expected_list ut3.ut_varchar2_list;
117- l_expected clob;
136+ l_actual sys_refcursor;
137+ l_expected sys_refcursor;
118138 begin
119- l_actual := g_actual_xml_report.getclobval();
120- ut3.ut_utils.append_to_list(l_expected_list, '<?xml version="1.0"?>');
121- ut3.ut_utils.append_to_list(l_expected_list, '%<report>');
122- ut3.ut_utils.append_to_list(l_expected_list, '% <preRun>');
123- ut3.ut_utils.append_to_list(l_expected_list, '% <suites>');
124- ut3.ut_utils.append_to_list(l_expected_list, '% <suite id="%">');
125- ut3.ut_utils.append_to_list(l_expected_list, '% %<test id="%">');
126- ut3.ut_utils.append_to_list(l_expected_list, '% %</test>');
127- ut3.ut_utils.append_to_list(l_expected_list, '% </suite>');
128- ut3.ut_utils.append_to_list(l_expected_list, '% </suites>');
129- ut3.ut_utils.append_to_list(l_expected_list, '% <totalNumberOfTests>%</totalNumberOfTests>');
130- ut3.ut_utils.append_to_list(l_expected_list, '% </preRun>');
131- ut3.ut_utils.append_to_list(l_expected_list, '% <runEvents>');
132- ut3.ut_utils.append_to_list(l_expected_list, '% <startSuiteEvent id="%">');
133- ut3.ut_utils.append_to_list(l_expected_list, '% </startTestEvent>');
134- ut3.ut_utils.append_to_list(l_expected_list, '% <startTestEvent id="%">');
135- ut3.ut_utils.append_to_list(l_expected_list, '% </startTestEvent>');
136- ut3.ut_utils.append_to_list(l_expected_list, '% <endTestEvent id="%">');
137- ut3.ut_utils.append_to_list(l_expected_list, '% </endTestEvent>');
138- ut3.ut_utils.append_to_list(l_expected_list, '% <endSuiteEvent id="%">');
139- ut3.ut_utils.append_to_list(l_expected_list, '% </endSuiteEvent>');
140- ut3.ut_utils.append_to_list(l_expected_list, '% </runEvents>');
141- ut3.ut_utils.append_to_list(l_expected_list, '%</report>');
142- l_expected := ut3.ut_utils.table_to_clob(l_expected_list, null);
143- ut.expect(l_actual).to_be_like(l_expected);
139+ open l_actual for
140+ select t.column_value.extract('/event/@type').getstringval() as event_type,
141+ t.column_value.extract('/event/suite/@id|/event/test/@id').getstringval() as item_id
142+ from table(g_xml_reports) t;
143+ open l_expected for
144+ select 'pre-run' as event_type, null as item_id from dual union all
145+ select 'pre-suite' as event_type, 'realtime_reporting' as item_id from dual union all
146+ select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting3' as item_id from dual union all
147+ select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error' as item_id from dual union all
148+ select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error' as item_id from dual union all
149+ select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput' as item_id from dual union all
150+ select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput' as item_id from dual union all
151+ select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting3' as item_id from dual union all
152+ select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting2' as item_id from dual union all
153+ select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_3_ok' as item_id from dual union all
154+ select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_3_ok' as item_id from dual union all
155+ select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_4_nok' as item_id from dual union all
156+ select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_4_nok' as item_id from dual union all
157+ select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_5' as item_id from dual union all
158+ select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting2.test_5' as item_id from dual union all
159+ select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting2' as item_id from dual union all
160+ select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting1' as item_id from dual union all
161+ select 'pre-suite' as event_type, 'realtime_reporting.check_realtime_reporting1.test context' as item_id from dual union all
162+ select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_1_ok' as item_id from dual union all
163+ select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_1_ok' as item_id from dual union all
164+ select 'pre-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_2_nok' as item_id from dual union all
165+ select 'post-test' as event_type, 'realtime_reporting.check_realtime_reporting1.test context.test_2_nok' as item_id from dual union all
166+ select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting1.test context' as item_id from dual union all
167+ select 'post-suite' as event_type, 'realtime_reporting.check_realtime_reporting1' as item_id from dual union all
168+ select 'post-suite' as event_type, 'realtime_reporting' as item_id from dual union all
169+ select 'post-run' as event_type, null as item_id from dual;
170+ ut.expect(l_actual).to_equal(l_expected);
144171 end xml_report_structure;
145172
146173 procedure total_number_of_tests is
147174 l_actual integer;
148175 l_expected integer := 7;
149176 begin
150- l_actual := g_actual_xml_report.extract('/report/preRun/totalNumberOfTests/text()').getnumberval();
151- ut.expect(l_actual).to_equal(l_expected);
177+ select t.column_value.extract('/event/totalNumberOfTests/text()').getnumberval()
178+ into l_actual
179+ from table(g_xml_reports) t
180+ where t.column_value.extract('/event/@type').getstringval() = 'pre-run';
152181 end total_number_of_tests;
153182
154183 procedure escaped_characters is
155184 l_actual varchar2(32767);
156185 l_expected varchar2(20) := 'suite <A>';
157186 begin
158- l_actual :=
159- g_actual_xml_report.extract(
160- '//suite[@id="realtime_reporting.check_realtime_reporting1"]/description/text()'
161- ).getstringval();
187+ select t.column_value.extract(
188+ '//suite[@id="realtime_reporting.check_realtime_reporting1"]/description/text()'
189+ ).getstringval()
190+ into l_actual
191+ from table(g_xml_reports) t
192+ where t.column_value.extract('/event/@type').getstringval() = 'pre-run';
162193 ut.expect(l_actual).to_equal(l_expected);
163194 end escaped_characters;
164195
165- procedure number_of_starttestevent_nodes is
166- l_actual integer ;
167- l_expected integer := 7 ;
196+ procedure pre_test_nodes is
197+ l_actual sys_refcursor ;
198+ l_expected sys_refcursor ;
168199 begin
169- select count(*)
170- into l_actual
171- from xmltable(
172- '/report/runEvents/startTestEvent'
173- passing g_actual_xml_report
174- columns id varchar2(4000) path '@id',
175- test_number integer path 'testNumber',
176- total_number_of_tests integer path 'totalNumberOfTests'
177- )
178- where id is not null
179- and test_number is not null
180- and total_number_of_tests is not null;
181- ut.expect(l_actual).to_equal(l_expected);
182- end number_of_starttestevent_nodes;
200+ open l_actual for
201+ select t.column_value.extract('//test/testNumber/text()')
202+ .getnumberval() as test_number,
203+ t.column_value.extract('//test/totalNumberOfTests/text()')
204+ .getnumberval() as total_number_of_tests
205+ from table(g_xml_reports) t
206+ where t.column_value.extract('/event/@type').getstringval() = 'pre-test'
207+ and t.column_value.extract('//test/@id').getstringval() is not null;
208+ open l_expected for
209+ select level as test_number,
210+ 7 as total_number_of_tests
211+ from dual
212+ connect by level <= 7;
213+ ut.expect(l_actual).to_equal(l_expected).unordered;
214+ end pre_test_nodes;
183215
184- procedure endtestevent_nodes is
216+ procedure post_test_nodes is
185217 l_actual sys_refcursor;
186218 l_expected sys_refcursor;
187219 begin
188220 open l_actual for
189- select test_number, total_number_of_tests
190- from xmltable(
191- '/report/runEvents/endTestEvent'
192- passing g_actual_xml_report
193- columns id varchar2(4000) path '@id',
194- test_number integer path 'testNumber',
195- total_number_of_tests integer path 'totalNumberOfTests'
196- )
197- where id is not null
198- and test_number is not null
199- and total_number_of_tests is not null;
221+ select t.column_value.extract('//test/testNumber/text()')
222+ .getnumberval() as test_number,
223+ t.column_value.extract('//test/totalNumberOfTests/text()')
224+ .getnumberval() as total_number_of_tests
225+ from table(g_xml_reports) t
226+ where t.column_value.extract('/event/@type').getstringval() = 'post-test'
227+ and t.column_value.extract('//test/@id').getstringval() is not null
228+ and t.column_value.extract('//test/startTime/text()').getstringval() is not null
229+ and t.column_value.extract('//test/endTime/text()').getstringval() is not null
230+ and t.column_value.extract('//test/executionTime/text()').getnumberval() is not null
231+ and t.column_value.extract('//test/counter/disabled/text()').getnumberval() is not null
232+ and t.column_value.extract('//test/counter/success/text()').getnumberval() is not null
233+ and t.column_value.extract('//test/counter/failure/text()').getnumberval() is not null
234+ and t.column_value.extract('//test/counter/error/text()').getnumberval() is not null
235+ and t.column_value.extract('//test/counter/warning/text()').getnumberval() is not null;
200236 open l_expected for
201237 select level as test_number,
202238 7 as total_number_of_tests
203239 from dual
204240 connect by level <= 7;
205241 ut.expect(l_actual).to_equal(l_expected).unordered;
206- end endtestevent_nodes ;
242+ end post_test_nodes ;
207243
208244 procedure single_failed_message is
209245 l_actual varchar2(32767);
210246 l_expected varchar2(80) := '<![CDATA[Actual: 1 (number) was expected to equal: 2 (number) ]]>';
211247 begin
212- l_actual :=
213- g_actual_xml_report.extract(
214- '/report/runEvents/endTestEvent[@id="realtime_reporting.check_realtime_reporting1.test context.test_2_nok"]/failedExpectations/expectation[1]/message/text()'
215- ).getstringval();
248+ select t.column_value.extract(
249+ '/event/test/failedExpectations/expectation[1]/message/text()'
250+ ).getstringval()
251+ into l_actual
252+ from table(g_xml_reports) t
253+ where t.column_value.extract('/event[@type="post-test"]/test/@id').getstringval()
254+ = 'realtime_reporting.check_realtime_reporting1.test context.test_2_nok';
216255 ut.expect(l_actual).to_equal(l_expected);
217256 end single_failed_message;
218257
@@ -222,14 +261,17 @@ create or replace package body test_realtime_reporter as
222261 begin
223262 select count(*)
224263 into l_actual
225- from xmltable(
226- '/report/runEvents/endTestEvent[@id="realtime_reporting.check_realtime_reporting2.test_4_nok"]/failedExpectations/expectation'
227- passing g_actual_xml_report
264+ from table(g_xml_reports) t,
265+ xmltable(
266+ '/event/test/failedExpectations/expectation'
267+ passing t.column_value
228268 columns message clob path 'message',
229269 caller clob path 'caller'
230- )
231- where message is not null
232- and caller is not null;
270+ ) x
271+ where t.column_value.extract('/event[@type="post-test"]/test/@id').getstringval()
272+ = 'realtime_reporting.check_realtime_reporting2.test_4_nok'
273+ and x.message is not null
274+ and x.caller is not null;
233275 ut.expect(l_actual).to_equal(l_expected);
234276 end multiple_failed_messages;
235277
@@ -238,10 +280,11 @@ create or replace package body test_realtime_reporter as
238280 l_expected_list ut3.ut_varchar2_list;
239281 l_expected clob;
240282 begin
241- l_actual :=
242- g_actual_xml_report.extract(
243- '/report/runEvents/endTestEvent[@id="realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput"]/serverOutput/text()'
244- ).getclobval();
283+ select t.column_value.extract('//event/test/serverOutput/text()').getstringval()
284+ into l_actual
285+ from table(g_xml_reports) t
286+ where t.column_value.extract('/event[@type="post-test"]/test/@id').getstringval()
287+ = 'realtime_reporting.check_realtime_reporting3.test_7_with_serveroutput';
245288 ut3.ut_utils.append_to_list(l_expected_list, '<![CDATA[before test 7');
246289 ut3.ut_utils.append_to_list(l_expected_list, 'after test 7');
247290 ut3.ut_utils.append_to_list(l_expected_list, ']]>');
@@ -254,10 +297,11 @@ create or replace package body test_realtime_reporter as
254297 l_expected_list ut3.ut_varchar2_list;
255298 l_expected clob;
256299 begin
257- l_actual :=
258- g_actual_xml_report.extract(
259- '/report/runEvents/endSuiteEvent[@id="realtime_reporting.check_realtime_reporting3"]/serverOutput/text()'
260- ).getclobval();
300+ select t.column_value.extract('//event/suite/serverOutput/text()').getstringval()
301+ into l_actual
302+ from table(g_xml_reports) t
303+ where t.column_value.extract('/event[@type="post-suite"]/suite/@id').getstringval()
304+ = 'realtime_reporting.check_realtime_reporting3';
261305 ut3.ut_utils.append_to_list(l_expected_list, '<![CDATA[Now, a no_data_found exception is raised');
262306 ut3.ut_utils.append_to_list(l_expected_list, 'dbms_output and error stack is reported for this suite.');
263307 ut3.ut_utils.append_to_list(l_expected_list, 'A runtime error in afterall is counted as a warning.');
@@ -271,10 +315,11 @@ create or replace package body test_realtime_reporter as
271315 l_expected_list ut3.ut_varchar2_list;
272316 l_expected clob;
273317 begin
274- l_actual :=
275- g_actual_xml_report.extract(
276- '/report/runEvents/endTestEvent[@id="realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error"]/errorStack/text()'
277- ).getclobval();
318+ select t.column_value.extract('//event/test/errorStack/text()').getstringval()
319+ into l_actual
320+ from table(g_xml_reports) t
321+ where t.column_value.extract('/event[@type="post-test"]/test/@id').getstringval()
322+ = 'realtime_reporting.check_realtime_reporting3.test_6_with_runtime_error';
278323 ut3.ut_utils.append_to_list(l_expected_list, '<![CDATA[ORA-00942: table or view does not exist');
279324 ut3.ut_utils.append_to_list(l_expected_list, 'ORA-06512: at "%.CHECK_REALTIME_REPORTING3", line 5');
280325 ut3.ut_utils.append_to_list(l_expected_list, '%ORA-06512: at line 6]]>');
@@ -287,10 +332,11 @@ create or replace package body test_realtime_reporter as
287332 l_expected_list ut3.ut_varchar2_list;
288333 l_expected clob;
289334 begin
290- l_actual :=
291- g_actual_xml_report.extract(
292- '/report/runEvents/endSuiteEvent[@id="realtime_reporting.check_realtime_reporting3"]/errorStack/text()'
293- ).getclobval();
335+ select t.column_value.extract('//event/suite/errorStack/text()').getstringval()
336+ into l_actual
337+ from table(g_xml_reports) t
338+ where t.column_value.extract('/event[@type="post-suite"]/suite/@id').getstringval()
339+ = 'realtime_reporting.check_realtime_reporting3';
294340 ut3.ut_utils.append_to_list(l_expected_list, '<![CDATA[ORA-01403: no data found');
295341 ut3.ut_utils.append_to_list(l_expected_list, 'ORA-06512: at "%.CHECK_REALTIME_REPORTING3", line 21');
296342 ut3.ut_utils.append_to_list(l_expected_list, '%ORA-06512: at line 6]]>');
0 commit comments