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

Skip to content

Commit 7b395ac

Browse files
committed
Resolved issues with error_stack reporting UTPLSQL stack instead of Unit Test stack.
Fixed formatting of documentation reporter - romobing blank lines.
1 parent 290982f commit 7b395ac

5 files changed

Lines changed: 68 additions & 53 deletions

File tree

source/core/types/ut_executable.tpb

Lines changed: 39 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
create or replace type body ut_executable is
22

3-
static procedure execute_call(a_owner varchar2, a_object varchar2, a_procedure_name varchar2) is
4-
l_stmt varchar2(200);
5-
l_cursorid number;
6-
l_rowsprocessed number;
7-
3+
static function execute_call(a_owner varchar2, a_object varchar2, a_procedure_name varchar2) return varchar2 is
4+
l_statement varchar2(4000);
5+
l_status number;
6+
l_cursor_number number;
7+
l_error_stack varchar2(4000);
88
l_owner varchar2(200) := a_owner;
99
l_object_name varchar2(200) := a_object;
1010
l_procedure_name varchar2(200) := a_procedure_name;
@@ -13,20 +13,34 @@ create or replace type body ut_executable is
1313

1414
ut_metadata.do_resolve(a_owner => l_owner, a_object => l_object_name, a_procedure_name => l_procedure_name);
1515

16-
l_stmt := 'begin ' || ut_metadata.form_name(l_owner, l_object_name, l_procedure_name) || '; end;';
17-
18-
ut_utils.debug_log('ut_executable.execute_call stmt:' || l_stmt);
16+
l_statement :=
17+
'declare' || chr(10) ||
18+
' l_error_stack varchar2(4000);' || chr(10) ||
19+
'begin' || chr(10) ||
20+
' begin' || chr(10) ||
21+
' ' || ut_metadata.form_name(l_owner, l_object_name, l_procedure_name) || ';' || chr(10) ||
22+
' exception' || chr(10) ||
23+
' when others then ' || chr(10) ||
24+
' --raise on ORA-04068: existing state of packages has been discarded to avoid unrecoverable session exception' || chr(10) ||
25+
' if sqlcode = -04068 then' || chr(10) ||
26+
' raise;' || chr(10) ||
27+
' end if;' || chr(10) ||
28+
' l_error_stack := dbms_utility.format_error_stack || dbms_utility.format_error_backtrace;' || chr(10) ||
29+
' end;' || chr(10) ||
30+
' :l_error_stack := l_error_stack;' || chr(10) ||
31+
'end;';
32+
33+
ut_utils.debug_log('ut_executable.execute_call l_statement: ' || l_statement);
34+
1935

20-
l_cursorid := dbms_sql.open_cursor;
21-
dbms_sql.parse(c => l_cursorid, statement => l_stmt, language_flag => dbms_sql.native);
22-
l_rowsprocessed := dbms_sql.execute(l_cursorid);
23-
dbms_sql.close_cursor(l_cursorid);
24-
exception
25-
when others then
26-
if l_cursorid is not null and dbms_sql.is_open(l_cursorid) then
27-
dbms_sql.close_cursor(l_cursorid);
28-
end if;
29-
raise;
36+
l_cursor_number := dbms_sql.open_cursor;
37+
dbms_sql.parse(l_cursor_number, statement => l_statement, language_flag => dbms_sql.native);
38+
dbms_sql.bind_variable(l_cursor_number, 'l_error_stack', l_error_stack, 8000);
39+
l_status := dbms_sql.execute(l_cursor_number);
40+
dbms_sql.variable_value(l_cursor_number, 'l_error_stack', l_error_stack);
41+
dbms_sql.close_cursor(l_cursor_number);
42+
43+
return rtrim(l_error_stack,chr(10));
3044
end;
3145

3246
member function is_valid(a_proc_type varchar2) return boolean is
@@ -66,8 +80,14 @@ create or replace type body ut_executable is
6680
end;
6781

6882
member procedure do_execute(self in ut_executable) is
83+
l_exception_stack varchar2(32767);
84+
begin
85+
l_exception_stack := do_execute();
86+
end do_execute;
87+
88+
member function do_execute(self in ut_executable) return varchar2 is
6989
begin
70-
ut_executable.execute_call(self.owner_name, self.object_name, self.procedure_name);
90+
return ut_executable.execute_call(self.owner_name, self.object_name, self.procedure_name);
7191
end do_execute;
7292

7393
end;

source/core/types/ut_executable.tps

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ create or replace type ut_executable force as object
44
object_name varchar2(32 char),
55
procedure_name varchar2(32 char),
66

7-
static procedure execute_call(a_owner varchar2, a_object varchar2, a_procedure_name varchar2),
7+
static function execute_call(a_owner varchar2, a_object varchar2, a_procedure_name varchar2) return varchar2,
88
member function is_valid(a_proc_type varchar2) return boolean,
99
member function form_name return varchar2,
10-
member procedure do_execute(self in ut_executable)
10+
member procedure do_execute(self in ut_executable),
11+
member function do_execute(self in ut_executable) return varchar2
1112
) final
1213
/

source/core/types/ut_test.tpb

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ create or replace type body ut_test is
3939

4040
overriding member procedure do_execute(self in out nocopy ut_test, a_reporter in out nocopy ut_reporter) is
4141
l_savepoint varchar2(30);
42+
l_failed boolean := false;
43+
function report_errors_from_call(a_exception_stack varchar2) return boolean is
44+
begin
45+
if a_exception_stack is not null then
46+
ut_utils.debug_log('test method failed- ' ||a_exception_stack);
47+
ut_assert_processor.report_error( a_exception_stack );
48+
return true;
49+
else
50+
return false;
51+
end if;
52+
end;
4253
begin
4354
a_reporter.before_test(self);
4455

@@ -52,47 +63,28 @@ create or replace type body ut_test is
5263
self.start_time := current_timestamp;
5364

5465
if self.get_ignore_flag() = false then
55-
begin
56-
57-
if self.is_valid() then
66+
if self.is_valid() then
5867

59-
if self.setup is not null then
60-
a_reporter.before_test_setup(self);
61-
self.setup.do_execute;
62-
a_reporter.after_test_setup(self);
63-
end if;
68+
if self.setup is not null then
69+
a_reporter.before_test_setup(self);
70+
l_failed := report_errors_from_call( self.setup.do_execute() );
71+
a_reporter.after_test_setup(self);
72+
end if;
6473

74+
if not l_failed then
6575
a_reporter.before_test_execute(self);
66-
begin
67-
self.test.do_execute;
68-
exception
69-
when others then
70-
-- dbms_utility.format_error_backtrace is 10g or later
71-
-- utl_call_stack package may be better but it's 12c but still need to investigate
72-
-- article with details: http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html
73-
ut_utils.debug_log('test method failed-' || sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_stack || dbms_utility.format_error_backtrace);
74-
ut_assert_processor.report_error( dbms_utility.format_error_stack || dbms_utility.format_error_backtrace );
75-
end;
76+
l_failed := report_errors_from_call( self.test.do_execute() );
7677
a_reporter.after_test_execute(self);
7778

7879
if self.teardown is not null then
7980
a_reporter.before_test_teardown(self);
80-
self.teardown.do_execute;
81+
l_failed := report_errors_from_call( self.teardown.do_execute() );
8182
a_reporter.after_test_teardown(self);
8283
end if;
8384

8485
end if;
8586

86-
exception
87-
when others then
88-
if sqlcode = -04068 then
89-
--raise on ORA-04068: existing state of packages has been discarded to avoid unrecoverable session exception
90-
raise;
91-
end if;
92-
ut_utils.debug_log('ut_test.execute failed-' || sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
93-
-- most likely occured in setup or teardown if here.
94-
ut_assert_processor.report_error( dbms_utility.format_error_stack || dbms_utility.format_error_backtrace );
95-
end;
87+
end if;
9688

9789
if self.rollback_type = ut_utils.gc_rollback_auto then
9890
execute immediate 'rollback to ' || l_savepoint;

source/reporters/ut_documentation_reporter.tpb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@ create or replace type body ut_documentation_reporter is
9797
if l_assert.error_message is not null then
9898
self.print('error: '||ut_utils.indent_lines( l_assert.error_message, self.lvl*2+length('error: ') ) );
9999
end if;
100-
self.print(l_assert.caller_info);
100+
if l_assert.caller_info is not null then
101+
self.print(l_assert.caller_info);
102+
end if;
101103
self.print('');
102104
end if;
103105
end loop;

tests/ut_test/ut_test.TeardownProcedureNameNull.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
PROMPT Does not invoke setup procedure when setup procedure name for a test is null
1+
PROMPT Does not invoke teardown procedure when teardown procedure name for a test is null
22

33
--Arrange
44
declare
@@ -14,7 +14,7 @@ begin
1414
if ut_example_tests.g_char = 'a' then
1515
:test_result := ut_utils.tr_success;
1616
else
17-
dbms_output.put_line('expected: ut_example_tests.g_char is null, got: '||ut_example_tests.g_char );
17+
dbms_output.put_line('expected: ut_example_tests.g_char = ''a'', got: '||ut_example_tests.g_char );
1818
end if;
1919
end;
2020
/

0 commit comments

Comments
 (0)