@@ -43,12 +43,21 @@ create or replace type body ut_suite as
4343 return l_is_valid;
4444 end;
4545
46- overriding member function do_execute(self in out nocopy ut_suite , a_listener in out nocopy ut_event_listener_base) return boolean is
46+ overriding member function do_execute(self in out nocopy ut_suite, a_listener in out nocopy ut_event_listener_base) return boolean is
4747 l_suite_savepoint varchar2(30);
4848 l_item_savepoint varchar2(30);
4949 l_completed_without_errors boolean;
50+ l_suite_step_without_errors boolean;
51+
52+ procedure do_fail(a_prefix varchar2) is
53+ l_results ut_assert_results := ut_assert_processor.get_asserts_results();
54+ begin
55+ for i in 1..self.items.count loop
56+ self.items(i).fail(a_listener, a_prefix||l_results(1).error_message);
57+ end loop;
58+ end;
5059 begin
51- ut_utils.debug_log('ut_suite .execute');
60+ ut_utils.debug_log('ut_suite.execute');
5261 a_listener.fire_before_event(ut_utils.gc_suite,self);
5362
5463 self.start_time := current_timestamp;
@@ -64,48 +73,53 @@ create or replace type body ut_suite as
6473 l_suite_savepoint := self.create_savepoint_if_needed();
6574
6675 --includes listener calls for before and after actions
67- l_completed_without_errors := self.before_all.do_execute(self, a_listener);
76+ l_suite_step_without_errors := self.before_all.do_execute(self, a_listener);
6877
69- if l_completed_without_errors then
78+ if l_suite_step_without_errors then
7079 for i in 1 .. self.items.count loop
7180 l_completed_without_errors := true;
7281
7382 --savepoint
7483 l_item_savepoint := self.items(i).create_savepoint_if_needed();
7584 --before each
76- if l_completed_without_errors then
77- --includes listener calls for before and after actions
78- l_completed_without_errors := self.before_each.do_execute(self, a_listener);
79- end if;
85+ --includes listener calls for before and after actions
86+ l_completed_without_errors := self.before_each.do_execute(self, a_listener);
8087
8188 -- execute the item (test or suite)
8289 if l_completed_without_errors then
8390 l_completed_without_errors := self.items(i).do_execute(a_listener);
84- end if;
85-
86- --after each
87- if l_completed_without_errors then
91+
92+ --after each
8893 --includes listener calls for before and after actions
94+ -- run afteeach even if a test raised an exception
8995 l_completed_without_errors := self.after_each.do_execute(self, a_listener);
96+
97+ if not l_completed_without_errors then
98+ self.items(i).fail(a_listener, 'Aftereach procedure failed:'||chr(10)||ut_assert_processor.get_asserts_results()(1).error_message);
99+ end if;
100+
101+ else
102+ self.items(i).fail(a_listener, 'Beforeach procedure failed:'||chr(10)||ut_assert_processor.get_asserts_results()(1).error_message);
90103 end if;
104+
91105 --rollback to savepoint
92106 self.items(i).rollback_to_savepoint(l_item_savepoint);
93107
94108 -- exit when not l_completed_without_errors;
95109 end loop;
96- end if;
97-
98- if l_completed_without_errors then
99- l_completed_without_errors := self.after_all.do_execute(self, a_listener);
110+
111+ l_suite_step_without_errors := self.after_all.do_execute(self, a_listener);
112+ if not l_suite_step_without_errors then
113+ do_fail('Afterall procedure failed: '||chr(10));
114+ end if;
115+ else
116+ do_fail('Beforeall procedure failed: '||chr(10));
100117 end if;
101118
102119 self.rollback_to_savepoint(l_suite_savepoint);
120+
103121 else
104- for i in 1..self.items.count loop
105- if self.items(i) is of(ut_test) then
106- l_completed_without_errors := self.items(i).do_execute(a_listener);
107- end if;
108- end loop;
122+ do_fail(null);
109123 end if;
110124
111125 self.calc_execution_result();
0 commit comments