11create or replace type body ut_test is
22
3- constructor function ut_test(a_object_name varchar2, a_test_procedure varchar2, a_test_name in varchar2 default null, a_owner_name varchar2 default null, a_setup_procedure varchar2 default null, a_teardown_procedure varchar2 default null)
3+ constructor function ut_test(a_object_name varchar2, a_test_procedure varchar2, a_test_name in varchar2 default null, a_owner_name varchar2 default null, a_setup_procedure varchar2 default null, a_teardown_procedure varchar2 default null, a_rollback_type integer default null )
44 return self as result is
55 begin
66 self.name := a_test_name;
@@ -21,6 +21,13 @@ create or replace type body ut_test is
2121 ,procedure_name => trim(a_teardown_procedure)
2222 ,owner_name => trim(a_owner_name));
2323 end if;
24+
25+ if a_rollback_type is not null then
26+ ut_utils.validate_rollback_type(a_rollback_type);
27+ self.rollback_type := a_rollback_type;
28+ else
29+ self.rollback_type := ut_utils.gc_rollback_auto;
30+ end if;
2431 return;
2532 end ut_test;
2633
@@ -37,67 +44,84 @@ create or replace type body ut_test is
3744 end;
3845 overriding member function execute(self in out nocopy ut_test, a_reporter ut_reporter) return ut_reporter is
3946 l_reporter ut_reporter := a_reporter;
47+ l_savepoint varchar2(30);
4048 begin
4149 l_reporter.before_test(self);
42-
43- begin
44- ut_utils.debug_log('ut_test.execute');
4550
46- self.start_time := current_timestamp;
51+ if self.rollback_type = ut_utils.gc_rollback_auto then
52+ l_savepoint := ut_utils.gen_savepoint_name;
53+ execute immediate 'savepoint ' || l_savepoint;
54+ end if;
55+
56+ ut_utils.debug_log('ut_test.execute');
57+
58+ self.start_time := current_timestamp;
4759
48- if self.is_valid() then
49- if self.setup is not null then
50- l_reporter.before_test_setup(self);
51- self.setup.execute;
52- l_reporter.after_test_setup(self);
60+ if nvl(self.ignore_flag,0) != 1 then
61+ begin
62+
63+ if self.is_valid() then
64+
65+ if self.setup is not null then
66+ l_reporter.before_test_setup(self);
67+ self.setup.execute;
68+ l_reporter.after_test_setup(self);
69+ end if;
70+
71+ l_reporter.before_test_execute(self);
72+ begin
73+ self.test.execute;
74+ exception
75+ when others then
76+ -- dbms_utility.format_error_backtrace is 10g or later
77+ -- utl_call_stack package may be better but it's 12c but still need to investigate
78+ -- article with details: http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html
79+ ut_utils.debug_log('testmethod failed-' || sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
80+
81+ ut_assert.report_error(sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
82+ end;
83+ l_reporter.after_test_execute(self);
84+
85+ if self.teardown is not null then
86+ l_reporter.before_test_teardown(self);
87+ self.teardown.execute;
88+ l_reporter.after_test_teardown(self);
89+ end if;
90+
5391 end if;
5492
55- l_reporter.before_test_execute(self);
56- begin
57-
58- self.test.execute;
59- exception
60- when others then
61- -- dbms_utility.format_error_backtrace is 10g or later
62- -- utl_call_stack package may be better but it's 12c but still need to investigate
63- -- article with details: http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html
64- ut_utils.debug_log('testmethod failed-' || sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
65-
66- ut_assert.report_error(sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
67- end;
68- l_reporter.after_test_execute(self);
93+ exception
94+ when others then
95+ if sqlcode = -04068 then
96+ --raise on ORA-04068: existing state of packages has been discarded to avoid unrecoverable session exception
97+ raise;
98+ end if;
99+ ut_utils.debug_log('ut_test.execute failed-' || sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
100+ -- most likely occured in setup or teardown if here.
101+ ut_assert.report_error(sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_stack);
102+ ut_assert.report_error(sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
103+ end;
69104
70- if self.teardown is not null then
71- l_reporter.before_test_teardown(self);
72- self.teardown.execute;
73- l_reporter.after_test_teardown(self);
74- end if;
105+ if self.rollback_type = ut_utils.gc_rollback_auto then
106+ execute immediate 'rollback to ' || l_savepoint;
75107 end if;
76108
77- exception
78- when others then
79- if sqlcode = -04068 then
80- --raise on ORA-04068: existing state of packages has been discarded to avoid unrecoverable session exception
81- raise;
82- end if;
83- ut_utils.debug_log('ut_test.execute failed-' || sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
84- -- most likely occured in setup or teardown if here.
85- ut_assert.report_error(sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_stack);
86- ut_assert.report_error(sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
87- end;
88-
89- self.end_time := current_timestamp;
90-
91- l_reporter.before_asserts_process(self);
92- self.items := ut_assert.get_asserts_results();
93-
94- self.calc_execution_result;
95-
96- for i in 1 .. self.items.count loop
97- l_reporter.on_assert_process(treat(self.items(i) as ut_assert_result));
98- end loop;
99-
100- l_reporter.after_asserts_process(self);
109+ self.end_time := current_timestamp;
110+
111+ l_reporter.before_asserts_process(self);
112+ self.items := ut_assert.get_asserts_results();
113+
114+ self.calc_execution_result;
115+
116+ for i in 1 .. self.items.count loop
117+ l_reporter.on_assert_process(treat(self.items(i) as ut_assert_result));
118+ end loop;
119+
120+ l_reporter.after_asserts_process(self);
121+ else
122+ self.end_time := current_timestamp;
123+ self.result := ut_utils.tr_ignore;
124+ end if;
101125
102126 l_reporter.after_test(self);
103127
0 commit comments