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

Skip to content

Commit b4594c5

Browse files
authored
Merge pull request #205 from Pazus/stdout-stderr-v2
Added outputs to the reporters. Moved *each to ut_test
2 parents 8822dab + 97f4fb8 commit b4594c5

31 files changed

Lines changed: 601 additions & 185 deletions

docs/userguide/exception-reporting.md

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Test execution can fail for different reasons. The failures on different excepti
1313
* A test package that is raising an exception in `%beforetest` - the `%test` is reported as failed with exception, `%test` is not executed. The `%aftertest`, `%aftereach` and `%afterall` blocks are getting executed to allow cleanup of whatever was done in `%before...` blocks
1414
* A test package that is raising an exception in `%test` - the `%test` is reported as failed with exception. The execution of other blocks continues normally
1515
* A test package that is raising an exception in `%aftertest` - the `%test` is reported as failed with exception. The execution of other blocks continues normally
16-
* A test package that is raising an exception in `%aftereach` - all blocks of the package are executed, as ehe `%aftereach` is a closing block for an individual test. Exception in `%aftereach` is not affecting test results. For every failed execution of `%aftereach` a warning with exception stacktrace is displayed in the summary
16+
* A test package that is raising an exception in `%aftereach` - each `%test` is reported as failed with exception.
1717
* A test package that is raising an exception in `%afterall` - all blocks of the package are executed, as the `%afterall` is the last step of package execution. Exception in `%afterall` is not affecting test results. A warning with exception stacktrace is displayed in the summary
1818

1919

@@ -77,29 +77,32 @@ Finished in ,045523 seconds
7777
Example of reporting with exception thrown in `%aftereach`:
7878
```
7979
Remove rooms by name
80-
Removes a room without content in it
81-
Does not remove room when it has content
82-
Raises exception when null room name given
83-
84-
Warnings:
85-
86-
1) test_remove_rooms_by_name - Aftereach procedure failed:
87-
ORA-20001: Test exception
88-
ORA-06512: at "UT3.TEST_REMOVE_ROOMS_BY_NAME", line 31
89-
ORA-06512: at line 6
90-
91-
2) test_remove_rooms_by_name - Aftereach procedure failed:
92-
ORA-20001: Test exception
93-
ORA-06512: at "UT3.TEST_REMOVE_ROOMS_BY_NAME", line 31
94-
ORA-06512: at line 6
80+
Removes a room without content in it (FAILED - 1)
81+
Does not remove room when it has content (FAILED - 2)
82+
Raises exception when null room name given (FAILED - 3)
9583
96-
3) test_remove_rooms_by_name - Aftereach procedure failed:
97-
ORA-20001: Test exception
98-
ORA-06512: at "UT3.TEST_REMOVE_ROOMS_BY_NAME", line 31
99-
ORA-06512: at line 6
84+
Failures:
10085
101-
Finished in ,05071 seconds
102-
3 tests, 0 failed, 0 errored, 0 ignored. 3 warning(s)
86+
1) remove_empty_room
87+
88+
error: ORA-20001: Test exception
89+
ORA-06512: at "UT3.TEST_REMOVE_ROOMS_BY_NAME", line 31
90+
ORA-06512: at line 6
91+
92+
2) room_with_content
93+
94+
error: ORA-20001: Test exception
95+
ORA-06512: at "UT3.TEST_REMOVE_ROOMS_BY_NAME", line 31
96+
ORA-06512: at line 6
97+
98+
3) null_room_name
99+
100+
error: ORA-20001: Test exception
101+
ORA-06512: at "UT3.TEST_REMOVE_ROOMS_BY_NAME", line 31
102+
ORA-06512: at line 6
103+
104+
Finished in ,034863 seconds
105+
3 tests, 0 failed, 3 errored, 0 ignored.
103106
```
104107

105108
Example of reporting with exception thrown in `%afterall`:

examples/demo_expectations.pck

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ create or replace package demo_expectations is
3232
procedure demo_to_be_null_failure;
3333

3434
-- %test
35-
-- %displayname(demo of failure for to_be_null expectation )
35+
-- %displayname(demo of success for to_be_null expectation )
3636
procedure demo_to_be_null_success;
3737

3838
-- %test
39-
-- %displayname(demo of success for to_be_not_null expectation )
39+
-- %displayname(demo of failure for to_be_not_null expectation )
4040
procedure demo_to_be_not_null_failure;
4141

4242
-- %test

source/api/ut_runner.pkb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ create or replace package body ut_runner is
3737
exception
3838
when others then
3939
ut_output_buffer.close(l_listener.reporters);
40+
dbms_output.put_line(dbms_utility.format_error_backtrace);
41+
dbms_output.put_line(dbms_utility.format_error_stack);
4042
raise;
4143
end;
4244

source/core/types/ut_event_listener.tpb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ create or replace type body ut_event_listener is
4343
elsif a_event_name = ut_utils.gc_before_all then
4444
self.reporters(i).before_calling_before_all(treat(a_item as ut_logical_suite));
4545
elsif a_event_name = ut_utils.gc_before_each then
46-
self.reporters(i).before_calling_before_each(treat(a_item as ut_logical_suite));
46+
self.reporters(i).before_calling_before_each(treat(a_item as ut_test));
4747
elsif a_event_name = ut_utils.gc_test then
4848
self.reporters(i).before_calling_test(treat(a_item as ut_test));
4949
elsif a_event_name = ut_utils.gc_before_test then
@@ -53,7 +53,7 @@ create or replace type body ut_event_listener is
5353
elsif a_event_name = ut_utils.gc_after_test then
5454
self.reporters(i).before_calling_after_test(treat(a_item as ut_test));
5555
elsif a_event_name = ut_utils.gc_after_each then
56-
self.reporters(i).before_calling_after_each(treat(a_item as ut_logical_suite));
56+
self.reporters(i).before_calling_after_each(treat(a_item as ut_test));
5757
elsif a_event_name = ut_utils.gc_after_all then
5858
self.reporters(i).before_calling_after_all(treat(a_item as ut_logical_suite));
5959
else
@@ -67,7 +67,7 @@ create or replace type body ut_event_listener is
6767
elsif a_event_name = ut_utils.gc_before_all then
6868
self.reporters(i).after_calling_before_all(treat(a_item as ut_logical_suite));
6969
elsif a_event_name = ut_utils.gc_before_each then
70-
self.reporters(i).after_calling_before_each(treat(a_item as ut_logical_suite));
70+
self.reporters(i).after_calling_before_each(treat(a_item as ut_test));
7171
elsif a_event_name = ut_utils.gc_test then
7272
self.reporters(i).after_calling_test(treat(a_item as ut_test));
7373
elsif a_event_name = ut_utils.gc_before_test then
@@ -77,7 +77,7 @@ create or replace type body ut_event_listener is
7777
elsif a_event_name = ut_utils.gc_after_test then
7878
self.reporters(i).after_calling_after_test(treat(a_item as ut_test));
7979
elsif a_event_name = ut_utils.gc_after_each then
80-
self.reporters(i).after_calling_after_each(treat(a_item as ut_logical_suite));
80+
self.reporters(i).after_calling_after_each(treat(a_item as ut_test));
8181
elsif a_event_name = ut_utils.gc_after_all then
8282
self.reporters(i).after_calling_after_all(treat(a_item as ut_logical_suite));
8383
else

source/core/types/ut_executable.tpb

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,22 +69,20 @@ create or replace type body ut_executable is
6969
return ut_metadata.form_name(owner_name, object_name, procedure_name);
7070
end;
7171

72-
member procedure do_execute(self in ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) is
72+
member procedure do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) is
7373
l_completed_without_errors boolean;
7474
begin
7575
l_completed_without_errors := self.do_execute(a_item, a_listener);
7676
end do_execute;
7777

78-
member function do_execute(self in ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) return boolean is
78+
member function do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) return boolean is
7979
l_statement varchar2(4000);
8080
l_status number;
8181
l_cursor_number number;
8282
l_owner varchar2(200) := self.owner_name;
8383
l_object_name varchar2(200) := self.object_name;
8484
l_procedure_name varchar2(200) := self.procedure_name;
8585

86-
l_error_stack varchar2(32767);
87-
l_error_backtrace varchar2(32767);
8886
l_completed_without_errors boolean := true;
8987

9088
function process_errors_from_call(a_error_stack varchar2, a_error_backtrace varchar2) return boolean is
@@ -98,6 +96,25 @@ create or replace type body ut_executable is
9896
return true;
9997
end if;
10098
end;
99+
100+
procedure save_dbms_output is
101+
l_status number;
102+
l_line varchar2(32767);
103+
begin
104+
dbms_lob.createtemporary(self.serveroutput, true, dur => dbms_lob.session);
105+
106+
loop
107+
dbms_output.get_line(line => l_line, status => l_status);
108+
exit when l_status = 1;
109+
110+
dbms_lob.writeappend(lob_loc => self.serveroutput,
111+
amount => length(l_line),
112+
buffer => l_line);
113+
dbms_lob.writeappend(lob_loc => self.serveroutput,
114+
amount => 1,
115+
buffer => chr(10));
116+
end loop;
117+
end save_dbms_output;
101118
begin
102119
if self.is_defined() then
103120
--listener - before call to executable
@@ -129,15 +146,17 @@ create or replace type body ut_executable is
129146

130147
l_cursor_number := dbms_sql.open_cursor;
131148
dbms_sql.parse(l_cursor_number, statement => l_statement, language_flag => dbms_sql.native);
132-
dbms_sql.bind_variable(l_cursor_number, 'a_error_stack', l_error_stack, 32767);
133-
dbms_sql.bind_variable(l_cursor_number, 'a_error_backtrace', l_error_backtrace, 32767);
149+
dbms_sql.bind_variable(l_cursor_number, 'a_error_stack', to_char(null), 32767);
150+
dbms_sql.bind_variable(l_cursor_number, 'a_error_backtrace', to_char(null), 32767);
134151

135152
l_status := dbms_sql.execute(l_cursor_number);
136-
dbms_sql.variable_value(l_cursor_number, 'a_error_stack', l_error_stack);
137-
dbms_sql.variable_value(l_cursor_number, 'a_error_backtrace', l_error_backtrace);
153+
dbms_sql.variable_value(l_cursor_number, 'a_error_stack', self.error_stack);
154+
dbms_sql.variable_value(l_cursor_number, 'a_error_backtrace', self.error_backtrace);
138155
dbms_sql.close_cursor(l_cursor_number);
156+
157+
save_dbms_output;
139158

140-
l_completed_without_errors := process_errors_from_call(l_error_stack, l_error_backtrace);
159+
l_completed_without_errors := process_errors_from_call(self.error_stack, self.error_backtrace);
141160

142161
a_listener.fire_after_event(self.associated_event_name, a_item);
143162
--listener - after call to executable

source/core/types/ut_executable.tps

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,19 @@ create or replace type ut_executable force authid current_user as object(
2222
owner_name varchar2(250 char),
2323
object_name varchar2(250 char),
2424
procedure_name varchar2(250 char),
25+
error_backtrace varchar2(4000),
26+
error_stack varchar2(4000),
27+
serveroutput clob,
2528
constructor function ut_executable( self in out nocopy ut_executable, a_context ut_suite_item, a_procedure_name varchar2, a_associated_event_name varchar2) return self as result,
2629
member function is_valid return boolean,
2730
member function is_defined return boolean,
2831
member function form_name return varchar2,
29-
member procedure do_execute(self in ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base),
32+
member procedure do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base),
3033
/**
3134
* executes the defines executable
3235
* returns true if executed without exceptions
3336
* returns false if exceptions were raised
3437
*/
35-
member function do_execute(self in ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) return boolean
38+
member function do_execute(self in out nocopy ut_executable, a_item in out nocopy ut_suite_item, a_listener in out nocopy ut_event_listener_base) return boolean
3639
) final
3740
/

source/core/types/ut_reporter_base.tpb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ create or replace type body ut_reporter_base is
5555
null;
5656
end;
5757

58-
member procedure before_calling_before_each(self in out nocopy ut_reporter_base, a_suite in ut_logical_suite) is
58+
member procedure before_calling_before_each(self in out nocopy ut_reporter_base, a_suite in ut_test) is
5959
begin
6060
null;
6161
end;
62-
member procedure after_calling_before_each (self in out nocopy ut_reporter_base, a_suite in ut_logical_suite) is
62+
member procedure after_calling_before_each (self in out nocopy ut_reporter_base, a_suite in ut_test) is
6363
begin
6464
null;
6565
end;
@@ -103,11 +103,11 @@ create or replace type body ut_reporter_base is
103103
end;
104104

105105
--suite hooks continued
106-
member procedure before_calling_after_each(self in out nocopy ut_reporter_base, a_suite in ut_logical_suite) is
106+
member procedure before_calling_after_each(self in out nocopy ut_reporter_base, a_suite in ut_test) is
107107
begin
108108
null;
109109
end;
110-
member procedure after_calling_after_each (self in out nocopy ut_reporter_base, a_suite in ut_logical_suite) is
110+
member procedure after_calling_after_each (self in out nocopy ut_reporter_base, a_suite in ut_test) is
111111
begin
112112
null;
113113
end;

source/core/types/ut_reporter_base.tps

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ create or replace type ut_reporter_base authid current_user as object(
3232
member procedure before_calling_before_all(self in out nocopy ut_reporter_base, a_suite in ut_logical_suite),
3333
member procedure after_calling_before_all (self in out nocopy ut_reporter_base, a_suite in ut_logical_suite),
3434

35-
member procedure before_calling_before_each(self in out nocopy ut_reporter_base, a_suite in ut_logical_suite),
36-
member procedure after_calling_before_each (self in out nocopy ut_reporter_base, a_suite in ut_logical_suite),
35+
member procedure before_calling_before_each(self in out nocopy ut_reporter_base, a_suite in ut_test),
36+
member procedure after_calling_before_each (self in out nocopy ut_reporter_base, a_suite in ut_test),
3737

3838
-- test hooks
3939
member procedure before_calling_test(self in out nocopy ut_reporter_base, a_test in ut_test),
@@ -50,8 +50,8 @@ create or replace type ut_reporter_base authid current_user as object(
5050
member procedure after_calling_test(self in out nocopy ut_reporter_base, a_test in ut_test),
5151

5252
--suite hooks continued
53-
member procedure before_calling_after_each(self in out nocopy ut_reporter_base, a_suite in ut_logical_suite),
54-
member procedure after_calling_after_each (self in out nocopy ut_reporter_base, a_suite in ut_logical_suite),
53+
member procedure before_calling_after_each(self in out nocopy ut_reporter_base, a_suite in ut_test),
54+
member procedure after_calling_after_each (self in out nocopy ut_reporter_base, a_suite in ut_test),
5555

5656
member procedure before_calling_after_all(self in out nocopy ut_reporter_base, a_suite in ut_logical_suite),
5757
member procedure after_calling_after_all (self in out nocopy ut_reporter_base, a_suite in ut_logical_suite),

source/core/types/ut_suite.tpb

Lines changed: 13 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,13 @@ create or replace type body ut_suite as
1919
constructor function ut_suite (
2020
self in out nocopy ut_suite , a_object_owner varchar2 := null, a_object_name varchar2, a_name varchar2, a_path varchar2, a_description varchar2 := null,
2121
a_rollback_type integer := null, a_ignore_flag boolean := false, a_before_all_proc_name varchar2 := null,
22-
a_after_all_proc_name varchar2 := null, a_before_each_proc_name varchar2 := null, a_after_each_proc_name varchar2 := null
22+
a_after_all_proc_name varchar2 := null
2323
) return self as result is
2424
begin
2525
self.self_type := $$plsql_unit;
2626
self.init(a_object_owner, a_object_name, a_name, a_description, a_path, a_rollback_type, a_ignore_flag);
2727
self.before_all := ut_executable(self, a_before_all_proc_name, ut_utils.gc_before_all);
28-
self.before_each := ut_executable(self, a_before_each_proc_name, ut_utils.gc_before_each);
2928
self.items := ut_suite_items();
30-
self.after_each := ut_executable(self, a_after_each_proc_name, ut_utils.gc_after_each);
3129
self.after_all := ut_executable(self, a_after_all_proc_name, ut_utils.gc_after_all);
3230
return;
3331
end;
@@ -37,18 +35,15 @@ create or replace type body ut_suite as
3735
begin
3836
l_is_valid :=
3937
( not self.before_all.is_defined() or self.before_all.is_valid() ) and
40-
( not self.before_each.is_defined() or self.before_each.is_valid() ) and
41-
( not self.after_each.is_defined() or self.after_each.is_valid() ) and
4238
( not self.after_all.is_defined() or self.after_all.is_valid() );
4339
return l_is_valid;
4440
end;
4541

4642
overriding member function do_execute(self in out nocopy ut_suite, a_listener in out nocopy ut_event_listener_base) return boolean is
4743
l_suite_savepoint varchar2(30);
4844
l_item_savepoint varchar2(30);
49-
l_completed_without_errors boolean;
5045
l_suite_step_without_errors boolean;
51-
46+
5247
procedure do_fail(a_prefix varchar2) is
5348
l_results ut_assert_results := ut_assert_processor.get_asserts_results();
5449
begin
@@ -59,15 +54,15 @@ create or replace type body ut_suite as
5954
begin
6055
ut_utils.debug_log('ut_suite.execute');
6156
a_listener.fire_before_event(ut_utils.gc_suite,self);
62-
63-
self.start_time := current_timestamp;
57+
58+
self.start_time := current_timestamp;
6459

6560
if self.get_ignore_flag() then
6661
self.result := ut_utils.tr_ignore;
6762
self.end_time := self.start_time;
6863
ut_utils.debug_log('ut_suite .execute - ignored');
6964
else
70-
65+
7166
if self.is_valid() then
7267

7368
l_suite_savepoint := self.create_savepoint_if_needed();
@@ -77,45 +72,19 @@ create or replace type body ut_suite as
7772

7873
if l_suite_step_without_errors then
7974
for i in 1 .. self.items.count loop
80-
l_completed_without_errors := true;
81-
82-
--savepoint
83-
l_item_savepoint := self.items(i).create_savepoint_if_needed();
84-
85-
--before each
86-
--includes listener calls for before and after actions
87-
l_completed_without_errors := self.before_each.do_execute(self, a_listener);
88-
89-
-- execute the item (test or suite)
90-
if l_completed_without_errors then
91-
l_completed_without_errors := self.items(i).do_execute(a_listener);
92-
else
93-
self.items(i).fail(a_listener, 'Beforeach procedure failed:'||chr(10)||ut_assert_processor.get_asserts_results()(1).error_message);
94-
end if;
95-
96-
--after each
97-
--includes listener calls for before and after actions
98-
--run afteeach even if a test raised an exception
99-
l_completed_without_errors := self.after_each.do_execute(self, a_listener);
100-
if not l_completed_without_errors then
101-
self.put_warning('Aftereach procedure failed:'||chr(10)||ut_assert_processor.get_asserts_results()(1).error_message);
102-
end if;
103-
104-
--rollback to savepoint
105-
self.items(i).rollback_to_savepoint(l_item_savepoint);
106-
75+
self.items(i).do_execute(a_listener);
10776
end loop;
108-
109-
l_suite_step_without_errors := self.after_all.do_execute(self, a_listener);
110-
if not l_suite_step_without_errors then
111-
self.put_warning('Afterall procedure failed: '||chr(10)||ut_assert_processor.get_asserts_results()(1).error_message);
112-
end if;
11377
else
11478
do_fail('Beforeall procedure failed: '||chr(10));
11579
end if;
11680

81+
l_suite_step_without_errors := self.after_all.do_execute(self, a_listener);
82+
if not l_suite_step_without_errors then
83+
self.put_warning('Afterall procedure failed: '||chr(10)||ut_assert_processor.get_asserts_results()(1).error_message);
84+
end if;
85+
11786
self.rollback_to_savepoint(l_suite_savepoint);
118-
87+
11988
else
12089
do_fail(null);
12190
end if;
@@ -126,7 +95,7 @@ create or replace type body ut_suite as
12695
end if;
12796
a_listener.fire_after_event(ut_utils.gc_suite,self);
12897

129-
return l_completed_without_errors;
98+
return l_suite_step_without_errors;
13099
end;
131100

132101
end;

0 commit comments

Comments
 (0)