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

Skip to content

Commit ec2bb11

Browse files
authored
Merge pull request #99 from Pazus/feature/teamcity-reporter
Teamcity reporter
2 parents 2a18482 + 026cc62 commit ec2bb11

8 files changed

Lines changed: 289 additions & 3 deletions

source/core/types/ut_test_object.tpb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ create or replace type body ut_test_object is
1111

1212
self.rollback_type := a_rollback_type;
1313
end;
14+
15+
member function execution_time return number is
16+
l_sec number;
17+
begin
18+
l_sec := extract(day from(end_time - start_time)) * 24 * 60 * 60 +
19+
extract(hour from(end_time - start_time)) * 60 * 60 + extract(minute from(end_time - start_time)) * 60 +
20+
extract(second from(end_time - start_time));
21+
return l_sec;
22+
end;
1423

1524
end;
16-
/
25+
/

source/core/types/ut_test_object.tps

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ create or replace type ut_test_object force under ut_composite_object
1212
not instantiable member procedure do_execute(self in out nocopy ut_test_object),
1313

1414
member procedure set_ignore_flag(self in out nocopy ut_test_object, a_ignore_flag boolean),
15-
member procedure set_rollback_type(self in out nocopy ut_test_object, a_rollback_type integer)
15+
member procedure set_rollback_type(self in out nocopy ut_test_object, a_rollback_type integer),
16+
17+
member function execution_time return number
1618
)
1719
not instantiable not final
1820
/

source/install.sql

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ whenever oserror exit failure rollback
125125

126126
@@reporters/ut_dbms_output_suite_reporter.tps
127127
@@reporters/ut_dbms_output_suite_reporter.tpb
128+
@@reporters/ut_teamcity_reporter.tps
129+
@@reporters/ut_teamcity_reporter_printer.pks
130+
@@reporters/ut_teamcity_reporter_printer.pkb
131+
@@reporters/ut_teamcity_reporter.tpb
128132

129133
@@legacy/ut_assert.pks
130134
@@legacy/ut_assert.pkb
@@ -133,10 +137,12 @@ whenever oserror exit failure rollback
133137

134138

135139
prompt Validating installation
140+
-- erors only. ignore warnings
136141
select * from user_errors
137142
where name not like 'BIN$%' --not recycled
138143
and (name like 'UT%' or name in ('BE_FALSE','BE_LIKE','BE_NOT_NULL','BE_NULL','BE_TRUE','EQUAL','MATCH')) -- utplsql objects
139-
and attribute = 'ERROR'; -- erors only. ignore warnings
144+
and attribute = 'ERROR'
145+
/
140146

141147
declare
142148
l_cnt integer;
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
create or replace type body ut_teamcity_reporter is
2+
3+
constructor function ut_teamcity_reporter return self as result is
4+
begin
5+
self.name := $$plsql_unit;
6+
return;
7+
end;
8+
9+
overriding member procedure before_suite(self in out nocopy ut_teamcity_reporter, a_suite in ut_object) is
10+
l_test_object ut_test_object := treat(a_suite as ut_test_object);
11+
begin
12+
13+
ut_teamcity_reporter_printer.test_suite_started(a_suite_name => coalesce(replace(l_test_object.name, '.')
14+
,l_test_object.object_name));
15+
end before_suite;
16+
17+
overriding member procedure after_suite(self in out nocopy ut_teamcity_reporter, a_suite in ut_object) is
18+
l_test_object ut_test_object := treat(a_suite as ut_test_object);
19+
begin
20+
ut_teamcity_reporter_printer.test_suite_finished(a_suite_name => coalesce(replace(l_test_object.name, '.')
21+
,l_test_object.object_name));
22+
end after_suite;
23+
24+
overriding member procedure before_suite_item(self in out nocopy ut_teamcity_reporter, a_suite in ut_object, a_item_index pls_integer) is
25+
l_suite ut_test_suite;
26+
l_item ut_test_object;
27+
l_test ut_test;
28+
l_test_full_name varchar2(4000);
29+
begin
30+
l_suite := treat(a_suite as ut_test_suite);
31+
l_item := treat(l_suite.items(a_item_index) as ut_test_object);
32+
33+
if l_item is of(ut_test) then
34+
l_test := treat(l_item as ut_test);
35+
l_test_full_name := nvl(replace(l_suite.name, '.'), l_suite.object_name) || ':' ||
36+
nvl(replace(l_test.name, '.'), l_test.object_name);
37+
ut_teamcity_reporter_printer.test_started(a_test_name => l_test_full_name);
38+
end if;
39+
40+
end before_suite_item;
41+
42+
overriding member procedure after_suite_item(self in out nocopy ut_teamcity_reporter, a_suite in ut_object, a_item_index pls_integer) is
43+
l_suite ut_test_suite;
44+
l_item ut_test_object;
45+
l_test ut_test;
46+
l_index pls_integer;
47+
l_assert ut_assert_result;
48+
l_test_full_name varchar2(4000);
49+
l_assert_full_name varchar2(4000);
50+
begin
51+
l_suite := treat(a_suite as ut_test_suite);
52+
l_item := treat(l_suite.items(a_item_index) as ut_test_object);
53+
54+
if l_item is of(ut_test) then
55+
56+
l_test := treat(l_item as ut_test);
57+
58+
l_test_full_name := nvl(replace(l_suite.name, '.'), l_suite.object_name) || ':' ||
59+
nvl(replace(l_item.name, '.'), l_test.object_name);
60+
61+
if l_test.result = ut_utils.tr_ignore then
62+
ut_teamcity_reporter_printer.test_ignored(l_test_full_name);
63+
else
64+
65+
if l_test.items is not null and l_test.items.count > 0 then
66+
for i in 1 .. l_test.items.count loop
67+
68+
l_assert := treat(l_test.items(i) as ut_assert_result);
69+
70+
if nvl(l_assert.result, ut_utils.tr_error) != ut_utils.tr_success then
71+
ut_teamcity_reporter_printer.test_failed(a_test_name => l_test_full_name
72+
,a_msg => l_assert.message
73+
,a_expected => l_assert.expected_value_string
74+
,a_actual => l_assert.actual_value_string);
75+
exit;
76+
end if;
77+
78+
end loop;
79+
elsif l_test.result = ut_utils.tr_failure then
80+
ut_teamcity_reporter_printer.test_failed(a_test_name => l_test_full_name, a_msg => 'Test failed');
81+
elsif l_test.result = ut_utils.tr_error then
82+
ut_teamcity_reporter_printer.test_failed(a_test_name => l_test_full_name, a_msg => 'Error occured');
83+
end if;
84+
85+
ut_teamcity_reporter_printer.test_finished(l_test_full_name
86+
,a_test_duration_milisec => trunc(l_test.execution_time * 1e3));
87+
88+
end if;
89+
90+
end if;
91+
end after_suite_item;
92+
93+
end;
94+
/
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
create or replace type ut_teamcity_reporter under ut_reporter
2+
(
3+
constructor function ut_teamcity_reporter return self as result,
4+
5+
overriding member procedure before_suite(self in out nocopy ut_teamcity_reporter, a_suite in ut_object),
6+
7+
overriding member procedure after_suite(self in out nocopy ut_teamcity_reporter, a_suite in ut_object),
8+
9+
overriding member procedure before_suite_item(self in out nocopy ut_teamcity_reporter, a_suite in ut_object, a_item_index pls_integer),
10+
11+
overriding member procedure after_suite_item(self in out nocopy ut_teamcity_reporter, a_suite in ut_object, a_item_index pls_integer)
12+
)
13+
not final
14+
/
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
create or replace package body ut_teamcity_reporter_printer is
2+
3+
subtype t_prop_index is varchar2(2000 char);
4+
type t_props is table of varchar2(32767) index by t_prop_index;
5+
6+
function escape_value(a_value in varchar2) return varchar2 is
7+
begin
8+
return regexp_replace(a_value, '(''|"|' || chr(13) || '|' || chr(10) || '|[|])', '|\1');
9+
end;
10+
11+
procedure message(a_command in varchar2, a_props t_props default cast(null as t_props)) is
12+
l_message varchar2(32767);
13+
l_index t_prop_index;
14+
l_value varchar2(32767);
15+
begin
16+
l_message := '##teamcity[' || a_command || ' timestamp=''' ||
17+
regexp_replace(to_char(systimestamp, 'YYYY-MM-DD"T"HH24:MI:ss.FFTZHTZM'), '(\.\d{3})\d+(\+)', '\1\2') || '''';
18+
19+
l_index := a_props.first;
20+
while l_index is not null loop
21+
if a_props(l_index) is not null then
22+
l_value := escape_value(a_props(l_index));
23+
l_message := l_message || ' ' || l_index || '=''' || l_value || '''';
24+
end if;
25+
l_index := a_props.next(l_index);
26+
end loop;
27+
l_message := l_message || ']';
28+
sys.dbms_output.put_line(l_message);
29+
30+
end message;
31+
32+
procedure block_opened(a_name varchar2, a_flow_id varchar2 default null) is
33+
l_props t_props;
34+
begin
35+
l_props('name') := a_name;
36+
l_props('flowId') := a_flow_id;
37+
message('blockOpened', l_props);
38+
end;
39+
40+
procedure block_closed(a_name varchar2, a_flow_id varchar2 default null) is
41+
l_props t_props;
42+
begin
43+
l_props('name') := a_name;
44+
l_props('flowId') := a_flow_id;
45+
message('blockClosed', l_props);
46+
end;
47+
48+
procedure test_suite_started(a_suite_name varchar2, a_flow_id varchar2 default null) is
49+
l_props t_props;
50+
begin
51+
l_props('name') := a_suite_name;
52+
l_props('flowId') := a_flow_id;
53+
message('testSuiteStarted', l_props);
54+
end;
55+
procedure test_suite_finished(a_suite_name varchar2, a_flow_id varchar2 default null) is
56+
l_props t_props;
57+
begin
58+
l_props('name') := a_suite_name;
59+
l_props('flowId') := a_flow_id;
60+
message('testSuiteFinished', l_props);
61+
end;
62+
63+
procedure test_started(a_test_name varchar2, a_capture_standard_output boolean default null, a_flow_id varchar2 default null) is
64+
l_props t_props;
65+
begin
66+
l_props('name') := a_test_name;
67+
l_props('captureStandardOutput') := case a_capture_standard_output
68+
when true then
69+
'true'
70+
when false then
71+
'false'
72+
else
73+
null
74+
end;
75+
l_props('flowId') := a_flow_id;
76+
message('testStarted', l_props);
77+
end;
78+
79+
procedure test_finished(a_test_name varchar2, a_test_duration_milisec number default null, a_flow_id varchar2 default null) is
80+
l_props t_props;
81+
begin
82+
l_props('name') := a_test_name;
83+
l_props('duration') := a_test_duration_milisec;
84+
l_props('flowId') := a_flow_id;
85+
message('testFinished', l_props);
86+
end;
87+
88+
procedure test_ignored(a_test_name varchar2, a_flow_id varchar2 default null) is
89+
l_props t_props;
90+
begin
91+
l_props('name') := a_test_name;
92+
l_props('flowId') := a_flow_id;
93+
message('testIgnored', l_props);
94+
end;
95+
procedure test_failed(a_test_name varchar2, a_msg in varchar2 default null, a_details varchar2 default null, a_flow_id varchar2 default null, a_actual varchar2 default null, a_expected varchar2 default null) is
96+
l_props t_props;
97+
begin
98+
l_props('name') := a_test_name;
99+
l_props('message') := a_msg;
100+
l_props('details') := a_details;
101+
l_props('flowId') := a_flow_id;
102+
103+
if a_actual is not null and a_expected is not null then
104+
l_props('actual') := a_actual;
105+
l_props('expected') := a_expected;
106+
end if;
107+
108+
message('testFailed', l_props);
109+
end;
110+
procedure test_std_out(a_test_name varchar2, a_out in varchar2, a_flow_id in varchar2 default null) is
111+
l_props t_props;
112+
begin
113+
l_props('name') := a_test_name;
114+
l_props('out') := a_out;
115+
l_props('flowId') := a_flow_id;
116+
message('testStdOut', l_props);
117+
end;
118+
procedure test_std_err(a_test_name varchar2, a_out in varchar2, a_flow_id in varchar2 default null) is
119+
l_props t_props;
120+
begin
121+
l_props('name') := a_test_name;
122+
l_props('out') := a_out;
123+
l_props('flowId') := a_flow_id;
124+
message('testStdErr', l_props);
125+
end;
126+
127+
procedure custom_message(a_text in varchar2, a_status in varchar2, a_error_deatils in varchar2 default null, a_flow_id in varchar2 default null) is
128+
l_props t_props;
129+
begin
130+
l_props('text') := a_text;
131+
l_props('status') := a_status;
132+
l_props('errorDetails') := a_error_deatils;
133+
l_props('flowId') := a_flow_id;
134+
message('message', l_props);
135+
end;
136+
137+
end ut_teamcity_reporter_printer;
138+
/
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
create or replace package ut_teamcity_reporter_printer is
2+
3+
procedure block_opened(a_name varchar2, a_flow_id varchar2 default null);
4+
procedure block_closed(a_name varchar2, a_flow_id varchar2 default null);
5+
6+
procedure test_suite_started(a_suite_name varchar2, a_flow_id varchar2 default null);
7+
procedure test_suite_finished(a_suite_name varchar2, a_flow_id varchar2 default null);
8+
9+
procedure test_started(a_test_name varchar2, a_capture_standard_output boolean default null, a_flow_id varchar2 default null);
10+
procedure test_finished(a_test_name varchar2, a_test_duration_milisec number default null, a_flow_id varchar2 default null);
11+
procedure test_ignored(a_test_name varchar2, a_flow_id varchar2 default null);
12+
procedure test_failed(a_test_name varchar2, a_msg in varchar2 default null, a_details varchar2 default null, a_flow_id varchar2 default null, a_actual varchar2 default null, a_expected varchar2 default null);
13+
procedure test_std_out(a_test_name varchar2, a_out in varchar2, a_flow_id in varchar2 default null);
14+
procedure test_std_err(a_test_name varchar2, a_out in varchar2, a_flow_id in varchar2 default null);
15+
16+
procedure custom_message(a_text in varchar2, a_status in varchar2, a_error_deatils in varchar2 default null, a_flow_id in varchar2 default null);
17+
18+
end ut_teamcity_reporter_printer;
19+
/

source/uninstall.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
drop package ut_teamcity_reporter_printer;
2+
13
drop package ut_suite_manager;
24

35
drop package ut_assert;
@@ -76,6 +78,8 @@ drop package ut_metadata;
7678

7779
drop package ut_utils;
7880

81+
drop type ut_teamcity_reporter;
82+
7983
drop type ut_dbms_output_suite_reporter;
8084

8185
drop type ut_reporter_decorator;

0 commit comments

Comments
 (0)