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

Skip to content

Commit 6217c06

Browse files
committed
RunExampleTestThroughBaseClass.sql now works
modified ut_types to use subtype for identifiers. added helper functions fix caseing issue with ut_metadata enhanced ut_test_execute to resolve procedure names before testing for exists.
1 parent 9abbfb3 commit 6217c06

8 files changed

Lines changed: 169 additions & 84 deletions
Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,25 @@
11
--This shows how the interna test engine works to test a single package.
22
--No tables are used for this and exceptions are handled better.
3-
DECLARE
4-
TestToExecute ut_Types.Single_Test;
5-
TestResults ut_Types.test_execution_result;
6-
BEGIN
7-
--TestToExecute.TypeOfTest := ut_Types.TT_Package;
8-
testtoexecute.owner_name := USER;
9-
testtoexecute.object_name := 'UT_EXAMPLETEST';
10-
testtoexecute.setup_procedure := 'SETUP';
11-
TestToExecute.TearDown_procedure := 'TEARDOWN';
12-
testtoexecute.test_procedure := 'UT_EXAMPLETEST';
13-
ut_Test_Execute.Execute_Test(TestToExecute,TestResults);
14-
--For now result is an integer but will need a look upto make pretty later.
15-
dbms_output.put_line('Result: ' || TestResults.result);
16-
dbms_output.put_line('Assert Results:');
17-
FOR I in TestResults.Assert_Results.First .. TestResults.Assert_Results.Last
18-
loop
19-
dbms_output.put_line(i || ' - result: ' || testresults.assert_results(i).result);
20-
dbms_output.put_line(I || ' - Message: ' || TestResults.Assert_Results(I).Message);
21-
END LOOP;
22-
END;
23-
24-
25-
26-
27-
3+
Clear Screen
4+
Set Serveroutput On Size Unlimited
5+
declare
6+
testtoexecute ut_types.single_test;
7+
testresults ut_types.test_execution_result;
8+
begin
9+
--testtoexecute.typeoftest := ut_types.tt_package;
10+
testtoexecute.owner_name := user;
11+
testtoexecute.object_name := 'ut_exampletest';
12+
testtoexecute.setup_procedure := 'setup';
13+
testtoexecute.teardown_procedure := 'teardown';
14+
testtoexecute.test_procedure := 'ut_exampletest';
15+
ut_test_execute.execute_test(testtoexecute,testresults);
2816

17+
--for now result is an integer but will need a look upto make pretty later.
18+
dbms_output.put_line('result: ' || ut_types.test_result_to_char(testresults.result) );
19+
dbms_output.put_line('assert results:');
20+
for i in testresults.assert_results.first .. testresults.assert_results.last
21+
Loop
22+
dbms_output.put_line(i || ' - result: ' || ut_types.test_result_to_char(testresults.assert_results(i).result) );
23+
dbms_output.put_line(i || ' - message: ' || testresults.assert_results(i).message);
24+
end loop;
25+
end;

source/ut_assert.pkb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ is
5151
is
5252
v_result ut_types.assert_result;
5353
begin
54-
$if $$ut_trace $then dbms_output.put_line('ut_assert.report_assert :' || assertresult || ':' || message ); $end
54+
$if $$ut_trace $then dbms_output.put_line('ut_assert.report_assert :' || assert_result || ':' || message ); $end
5555

5656
v_result.result := assert_result;
5757
v_result.message := message;

source/ut_metadata.pkb

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
create or replace package body ut_metadata
22
as
3+
34
function package_valid(a_owner_name varchar2,a_package_name in varchar2) return boolean
45
as
56
v_cnt integer;
67
begin
8+
--maybe use DBMS_UTILITY.NAME_RESOLVE first
9+
710
select
811
count(*) into v_cnt
912
from
1013
all_objects
1114
where
12-
upper(owner) = upper(a_owner_name)
13-
and upper(object_name) = upper(a_package_name)
14-
and object_type in ('package','package body')
15-
and status = 'valid';
15+
owner = a_owner_name
16+
and object_name = a_package_name
17+
and object_type in ('PACKAGE','PACKAGE BODY')
18+
and status = 'VALID';
1619

17-
-- expect both package and body to be valid
20+
-- expect both package and body to be valid
1821
return v_cnt = 2;
1922
end;
2023

2124
function procedure_exists(a_owner_name varchar2,
22-
a_package_name in varchar2,
23-
a_procedure_name in varchar2) return boolean
25+
a_package_name in varchar2,
26+
a_procedure_name in varchar2) return boolean
2427
as
2528
v_cnt integer;
2629
begin
@@ -29,9 +32,9 @@ as
2932
from
3033
all_procedures
3134
where
32-
upper(owner) = upper(a_owner_name)
33-
and upper(object_name) = upper(a_package_name)
34-
and upper(procedure_name) = upper(a_procedure_name);
35+
owner = a_owner_name
36+
and object_name = a_package_name
37+
and procedure_name = a_procedure_name;
3538
--expect one method only for the package with that name.
3639
return v_cnt = 1;
3740
end;

source/ut_reporter_execution.pks

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ create or replace package ut_reporter_execution
22
as
33
-- these are in spec to make testing a reporter easier
44
procedure begin_suite (a_reporter in ut_types.test_suite_reporter, a_suite in ut_types.test_suite);
5-
procedure end_suite (a_reporter in ut_types.test_suite_reporter, a_suite in ut_types.test_suite, a_results in ut_types.test_suite_results);
6-
procedure begin_test(a_reporter in ut_types.test_suite_reporter, a_test in ut_types.single_test,a_in_suite in boolean);
7-
procedure end_test(a_reporter in ut_types.test_suite_reporter, a_test in ut_types.single_test, a_result ut_types.test_execution_result,a_in_suite in boolean);
5+
procedure end_suite (a_reporter in ut_types.test_suite_reporter, a_suite in ut_types.test_suite , a_results in ut_types.test_suite_results);
6+
procedure begin_test (a_reporter in ut_types.test_suite_reporter, a_test in ut_types.single_test, a_in_suite in boolean);
7+
procedure end_test (a_reporter in ut_types.test_suite_reporter, a_test in ut_types.single_test, a_result ut_types.test_execution_result,a_in_suite in boolean);
88

99
-- these are the ones called when a test/suite is run.
1010
procedure begin_suite (a_reporters in ut_types.test_suite_reporters, a_suite in ut_types.test_suite);
11-
procedure end_suite (a_reporters in ut_types.test_suite_reporters, a_suite in ut_types.test_suite, a_results in ut_types.test_suite_results);
12-
procedure begin_test(a_reporters in ut_types.test_suite_reporters, a_test in ut_types.single_test,a_in_suite in boolean);
13-
procedure end_test(a_reporters in ut_types.test_suite_reporters, a_test in ut_types.single_test, a_result ut_types.test_execution_result,a_in_suite in boolean);
14-
end;
11+
procedure end_suite (a_reporters in ut_types.test_suite_reporters, a_suite in ut_types.test_suite , a_results in ut_types.test_suite_results);
12+
procedure begin_test (a_reporters in ut_types.test_suite_reporters, a_test in ut_types.single_test, a_in_suite in boolean);
13+
procedure end_test (a_reporters in ut_types.test_suite_reporters, a_test in ut_types.single_test, a_result ut_types.test_execution_result,a_in_suite in boolean);
14+
end;

source/ut_test_execute.pkb

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,48 +7,59 @@ as
77
,a_procedure_name in varchar2)
88
as
99
obj_data user_objects%rowtype;
10-
stmt varchar2(104);
10+
stmt varchar2(150); --128 plus some extra
1111
execute_stmt boolean := true;
1212
begin
1313
$if $$ut_trace $then dbms_output.put_line('ut_execute.execute_procedure'); $end
1414

1515
if execute_stmt then
16-
stmt := 'begin ' || trim(a_owner_name) || trim(a_package_name) || '.' || trim(a_procedure_name) || '; end;';
16+
stmt := trim(a_package_name) || '.' || trim(a_procedure_name);
17+
if trim(a_owner_name) is not null then
18+
stmt := trim(a_owner_name) ||'.' || stmt;
19+
end if;
20+
stmt := 'begin ' || stmt || '; end;';
1721
$if $$ut_trace $then dbms_output.put_line('execute_procedure stmt:' || stmt); $end
1822
execute immediate stmt;
1923
end if;
2024
end;
2125

2226
procedure execute_package_test(a_test_to_execute in ut_types.single_test)
23-
as
24-
begin
25-
$if $$ut_trace $then dbms_output.put_line('executepackagetest ' || a_test_to_execute.owner_name || '.' || a_test_to_execute.object_name || '.' || a_test_to_execute.test_procedure); $end
27+
As
28+
b_test_to_execute ut_types.single_test;
29+
Begin
30+
31+
$if $$ut_trace $then dbms_output.put_line('execute_package_test ' || a_test_to_execute.owner_name || '.' || a_test_to_execute.object_name || '.' || a_test_to_execute.test_procedure); $end
2632

27-
if not ut_metadata.package_valid(a_test_to_execute.owner_name,a_test_to_execute.object_name) then
28-
ut_assert.report_error('package does not exist or is invalid: ' || nvl(a_test_to_execute.object_name,'<missing package name>'));
33+
B_Test_To_Execute := A_Test_To_Execute;
34+
If Not Ut_Types.Single_Test_Is_Valid(B_Test_To_Execute) Then
35+
ut_assert.report_error('Single_Test is not invalid: ' );
36+
Return;
37+
end if;
38+
if not ut_metadata.package_valid(B_Test_To_Execute.owner_name,B_Test_To_Execute.object_name) then
39+
ut_assert.report_error('package does not exist or is invalid: ' || nvl(B_Test_To_Execute.object_name,'<missing package name>'));
2940
return;
3041
end if;
3142

32-
if not ut_metadata.procedure_exists(a_test_to_execute.owner_name,a_test_to_execute.object_name,a_test_to_execute.setup_procedure) then
33-
ut_assert.report_error('package missing setup method ' || a_test_to_execute.object_name || '.' || nvl(a_test_to_execute.setup_procedure,'<missing procedure name>'));
43+
if not ut_metadata.procedure_exists(B_Test_To_Execute.owner_name,B_Test_To_Execute.object_name,B_Test_To_Execute.setup_procedure) then
44+
ut_assert.report_error('package missing setup method ' || B_Test_To_Execute.object_name || '.' || nvl(B_Test_To_Execute.setup_procedure,'<missing procedure name>'));
3445
return;
3546
end if;
3647

37-
if not ut_metadata.procedure_exists(a_test_to_execute.owner_name,a_test_to_execute.object_name,a_test_to_execute.test_procedure) then
38-
ut_assert.report_error('package missing test method ' || a_test_to_execute.object_name || '.' || nvl(a_test_to_execute.test_procedure,'<missing procedure name>'));
48+
if not ut_metadata.procedure_exists(B_Test_To_Execute.owner_name,B_Test_To_Execute.object_name,B_Test_To_Execute.test_procedure) then
49+
ut_assert.report_error('package missing test method ' || B_Test_To_Execute.object_name || '.' || nvl(B_Test_To_Execute.test_procedure,'<missing procedure name>'));
3950
return;
4051
end if;
4152

42-
if not ut_metadata.procedure_exists(a_test_to_execute.owner_name,a_test_to_execute.object_name,a_test_to_execute.teardown_procedure) then
43-
ut_assert.report_error('package missing teardown method ' || a_test_to_execute.object_name || '.' || nvl(a_test_to_execute.teardown_procedure,'<missing procedure name>'));
53+
if not ut_metadata.procedure_exists(B_Test_To_Execute.owner_name,B_Test_To_Execute.object_name,B_Test_To_Execute.teardown_procedure) then
54+
ut_assert.report_error('package missing teardown method ' || B_Test_To_Execute.object_name || '.' || nvl(B_Test_To_Execute.teardown_procedure,'<missing procedure name>'));
4455
return;
4556
end if;
4657

4758

4859

49-
execute_procedure(a_test_to_execute.owner_name,a_test_to_execute.object_name,a_test_to_execute.setup_procedure);
60+
execute_procedure(B_Test_To_Execute.owner_name,B_Test_To_Execute.object_name,B_Test_To_Execute.setup_procedure);
5061
begin
51-
execute_procedure(a_test_to_execute.owner_name,a_test_to_execute.object_name,a_test_to_execute.test_procedure);
62+
execute_procedure(B_Test_To_Execute.owner_name,B_Test_To_Execute.object_name,B_Test_To_Execute.test_procedure);
5263
exception
5364
when others then
5465
-- dbms_utility.format_error_backtrace is 10g or later
@@ -57,7 +68,8 @@ as
5768
$if $$ut_trace $then dbms_output.put_line('testmethod failed-' ||sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace); $end
5869
ut_assert.report_error(sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
5970
end;
60-
execute_procedure(a_test_to_execute.owner_name,a_test_to_execute.object_name,a_test_to_execute.teardown_procedure);
71+
execute_procedure(B_Test_To_Execute.owner_name,B_Test_To_Execute.object_name,B_Test_To_Execute.teardown_procedure);
72+
6173
end execute_package_test;
6274

6375

@@ -82,7 +94,7 @@ as
8294
$if $$ut_trace $then dbms_output.put_line('execute_test failed-' ||sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace); $end
8395
-- most likely occured in setup or teardown if here.
8496
ut_assert.report_error(sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_stack);
85-
ut_assert.report_error(sqlerrm(sqlcode) || ' ' || dbms_utility.format_error_backtrace);
97+
Ut_Assert.Report_Error(Sqlerrm(Sqlcode) || ' ' || Dbms_Utility.Format_Error_Backtrace);
8698
ut_assert.copy_called_asserts(a_test_result.assert_results);
8799
ut_assert.clear_asserts;
88100
a_test_result.result := ut_types.tr_error;

source/ut_test_execute.pks

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ as
55
Purpose is to execute a single test, used *internally* by ut_test_runner.
66
*/
77

8-
procedure execute_test (a_test_to_execute in ut_types.single_test,
9-
a_test_result out ut_types.test_execution_result);
8+
procedure execute_test (a_test_to_execute in ut_types.single_test,
9+
a_test_result out ut_types.test_execution_result);
1010
end ut_test_execute;
1111
/

source/ut_types.pkb

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,75 @@ create or replace package body ut_types as
88
when tr_success then return 'Success';
99
when tr_failure then return 'Failure';
1010
when tr_error then return 'Error';
11+
else return 'Unknown('||a_test_result||')';
1112
end case;
1213
end;
13-
14+
15+
function do_resolve (the_owner IN OUT dbms_quoted_id, the_object IN OUT dbms_quoted_id, a_procedurename IN OUT dbms_quoted_id) return boolean
16+
is
17+
NAME VARCHAR2(200);
18+
CONTEXT NUMBER;
19+
SCHEMA VARCHAR2(200);
20+
PART1 VARCHAR2(200);
21+
PART2 VARCHAR2(200);
22+
DBLINK VARCHAR2(200);
23+
PART1_TYPE NUMBER;
24+
OBJECT_NUMBER NUMBER;
25+
begin
26+
27+
name := the_object;
28+
if trim(the_owner) is not null then name := trim(the_owner)||'.'||name; end if;
29+
if trim(a_procedurename) is not null then name := name||'.'||a_procedurename; end if;
30+
31+
CONTEXT := 1; --plsql
32+
33+
DBMS_UTILITY.NAME_RESOLVE(
34+
NAME => NAME,
35+
CONTEXT => CONTEXT,
36+
SCHEMA => SCHEMA,
37+
PART1 => PART1,
38+
PART2 => PART2,
39+
DBLINK => DBLINK,
40+
PART1_TYPE => PART1_TYPE,
41+
OBJECT_NUMBER => OBJECT_NUMBER
42+
);
43+
the_owner := SCHEMA;
44+
the_object := PART1;
45+
A_Procedurename := Part2;
46+
return true;
47+
48+
exception
49+
when others then --replace with correct exception
50+
return false;
51+
end;
52+
53+
54+
55+
function single_test_is_valid(a_single_test IN OUT NOCOPY single_test) return boolean
56+
is
57+
NAME VARCHAR2(200);
58+
CONTEXT NUMBER;
59+
SCHEMA VARCHAR2(200);
60+
PART1 VARCHAR2(200);
61+
PART2 VARCHAR2(200);
62+
DBLINK VARCHAR2(200);
63+
PART1_TYPE NUMBER;
64+
OBJECT_NUMBER NUMBER;
65+
Begin
66+
If A_Single_Test.Test_Procedure Is Null Then Return False; End If;
67+
68+
if not do_resolve(a_single_test.owner_name,a_single_test.object_name, a_single_test.test_procedure) then return false; end if;
69+
70+
if a_single_test.setup_procedure is not null then
71+
if not do_resolve(a_single_test.owner_name,a_single_test.object_name, a_single_test.setup_procedure) then return false; end if;
72+
end if;
73+
74+
if a_single_test.teardown_procedure is not null then
75+
if not do_resolve(a_single_test.owner_name,a_single_test.object_name, a_single_test.teardown_procedure) then return false; end if;
76+
end if;
77+
78+
Return True;
79+
80+
End Single_Test_Is_Valid;
81+
1482
end ut_types;

source/ut_types.pks

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,47 @@ create or replace package ut_types as
44
tr_failure constant number(1) :=2; -- one or more asserts failed
55
tr_error constant number(1) :=3; -- exception was raised
66
subtype test_result is binary_integer range 1..3;
7+
8+
--oracle 12 types in DBMS_STANDARD. uncomment in earlier versions
9+
--subtype dbms_id is varchar2(30);
10+
--subtype dbms_quoted_id is varchar2(32);
711

812
function test_result_to_char(a_test_result test_result) return varchar2;
913

14+
1015
type assert_result is record
1116
(
12-
result test_result,
13-
message varchar2(4000)
17+
result test_result,
18+
message varchar2(4000 char)
1419
);
1520

1621
type assert_list is table of assert_result;
1722

1823
type single_test is record
1924
(
20-
owner_name varchar2(30),
21-
object_name varchar2(30),
22-
setup_procedure varchar2(30),
23-
teardown_procedure varchar2(30),
24-
test_procedure varchar2(30)
25+
owner_name dbms_quoted_id,
26+
object_name dbms_quoted_id,
27+
setup_procedure dbms_quoted_id,
28+
teardown_procedure dbms_quoted_id,
29+
test_procedure dbms_quoted_id
2530
);
31+
function single_test_is_valid(a_single_test IN OUT NOCOPY single_test) return boolean;
2632

2733
type test_execution_result is record
2834
(
29-
test single_test,
30-
start_time timestamp,
31-
end_time timestamp,
32-
result test_result,
35+
test single_test,
36+
start_time timestamp with time zone,
37+
end_time timestamp with time zone,
38+
result test_result,
3339
assert_results assert_list
3440
);
3541

3642
type test_list is table of single_test;
37-
43+
3844
type test_suite is record
3945
(
40-
suite_name varchar2(50),
41-
tests test_list
42-
46+
suite_name varchar2(50 char),
47+
tests test_list
4348
);
4449

4550
-- may want to this be a record that contains this list.
@@ -49,12 +54,12 @@ create or replace package ut_types as
4954

5055
type test_suite_reporter is record
5156
(
52-
owner_name varchar2(30),
53-
package_name varchar2(30),
54-
begin_suite_procedure varchar2(30) not null default 'begin_suite',
55-
end_suite_procedure varchar2(30) not null default 'end_suite',
56-
begin_test_procedure varchar2(30) not null default 'begin_test',
57-
end_test_procedure varchar2(30) not null default 'end_test'
57+
owner_name dbms_quoted_id,
58+
package_name dbms_quoted_id,
59+
begin_suite_procedure dbms_quoted_id not null default 'begin_suite',
60+
end_suite_procedure dbms_quoted_id not null default 'end_suite',
61+
begin_test_procedure dbms_quoted_id not null default 'begin_test',
62+
end_test_procedure dbms_quoted_id not null default 'end_test'
5863
);
5964

6065
type test_suite_reporters is table of test_suite_reporter;

0 commit comments

Comments
 (0)