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

Skip to content

Commit d0c9af9

Browse files
authored
Merge pull request #146 from jgebal/feature/junit_reporter
Added XUnit reporter
2 parents a3f604e + a092151 commit d0c9af9

19 files changed

Lines changed: 229 additions & 75 deletions

client_source/sqlplus/ut_run.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ Parameters:
2424
A textual pretty-print of unit test results (usually use for console output)
2525
-f=ut_teamcity_reporter
2626
A teamcity Unit Test reporter, that can be used to visualize progress of test execution as the job progresses.
27-
-f=ut_junit_reporter
28-
A junit xml format (as defined at: http://stackoverflow.com/a/9691131 and at https://gist.github.com/kuzuha/232902acab1344d6b578)
29-
Usually used for consumption by Continuous Integration servers like Jenkins/Hudson or Teamcity
27+
-f=ut_xunit_reporter
28+
A XUnit xml format (as defined at: http://stackoverflow.com/a/9691131 and at https://gist.github.com/kuzuha/232902acab1344d6b578)
29+
Usually used by Continuous Integration servers like Jenkins/Hudson or Teamcity to display test results.
3030
If no -f option is provided, the ut_documentation_reporter will be used.
3131
3232
-o=output - file name to save the output provided by the reporter.

examples/developer_examples/ut_custom_reporter.tpb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ create or replace type body ut_custom_reporter is
44
begin
55
self.name := $$plsql_unit;
66
self.lvl := 0;
7-
self.failed_test_count := 0;
8-
self.test_count := 0;
9-
self.igonred_test_count := 0;
107
self.tab_size := a_tab_size;
118
self.output := a_output;
9+
self.failed_test_running_count := 0;
1210
return;
1311
end;
1412

readme.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ The following table is a work in progress right now, and **will** change. If y
5555
| Multiple Output Reporters can be used during test execution | No | Yes |
5656
| DBMS_OUTPUT | Yes | Yes (format changed) |
5757
| Stored in Table | Yes | On Roadmap |
58-
| JUnit XML Format | No | On Roadmap |
58+
| XUnit XML Format | No | Yes |
5959
| HTML Format | Yes | On Roadmap |
6060
| File | Yes | On Roadmap |
61-
| Realtime test execution results | No | On Roadmap |
61+
| Realtime test execution results | No | Yes |
6262
| Custom Output reporter | Yes | Yes |
6363

6464
<sup>1</sup> Annotations are specially formatted comments in your package specification. This enables *declarative* test configuration that is coupled with the source code. See Documentation for more details.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
create or replace type body ut_results_counter as
2+
constructor function ut_results_counter(self in out nocopy ut_results_counter) return self as result is
3+
begin
4+
self.ignored_count := 0;
5+
self.success_count := 0;
6+
self.failure_count := 0;
7+
self.errored_count := 0;
8+
return;
9+
end;
10+
11+
constructor function ut_results_counter(self in out nocopy ut_results_counter, a_status integer) return self as result is
12+
begin
13+
self.ignored_count := case when a_status = ut_utils.tr_ignore then 1 else 0 end;
14+
self.success_count := case when a_status = ut_utils.tr_success then 1 else 0 end;
15+
self.failure_count := case when a_status = ut_utils.tr_failure then 1 else 0 end;
16+
self.errored_count := case when a_status = ut_utils.tr_error then 1 else 0 end;
17+
return;
18+
end;
19+
20+
member procedure sum_counter_values(self in out nocopy ut_results_counter, a_item ut_results_counter) is
21+
begin
22+
self.ignored_count := self.ignored_count + a_item.ignored_count;
23+
self.success_count := self.success_count + a_item.success_count;
24+
self.failure_count := self.failure_count + a_item.failure_count;
25+
self.errored_count := self.errored_count + a_item.errored_count;
26+
end;
27+
28+
member function total_count return integer is
29+
begin
30+
return self.ignored_count + self.success_count + self.failure_count + self.errored_count;
31+
end;
32+
33+
member function result_status return integer is
34+
begin
35+
return
36+
case
37+
when self.errored_count > 0 then ut_utils.tr_error
38+
when self.failure_count > 0 then ut_utils.tr_failure
39+
when self.success_count > 0 then ut_utils.tr_success
40+
when self.ignored_count > 0 then ut_utils.tr_ignore
41+
else ut_utils.tr_error
42+
end;
43+
end;
44+
45+
end;
46+
/
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
create or replace type ut_results_counter as object(
2+
ignored_count integer,
3+
success_count integer,
4+
failure_count integer,
5+
errored_count integer,
6+
constructor function ut_results_counter(self in out nocopy ut_results_counter) return self as result,
7+
constructor function ut_results_counter(self in out nocopy ut_results_counter, a_status integer) return self as result,
8+
member procedure sum_counter_values(self in out nocopy ut_results_counter, a_item ut_results_counter),
9+
member function total_count return integer,
10+
member function result_status return integer
11+
)
12+
/

source/core/types/ut_run.tpb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ create or replace type body ut_run as
44
begin
55
self.self_type := $$plsql_unit;
66
self.items := a_items;
7+
self.results_count := ut_results_counter();
78
return;
89
end;
910

@@ -26,7 +27,7 @@ create or replace type body ut_run as
2627
l_completed_without_errors := self.items(i).do_execute(a_listener);
2728
end loop;
2829

29-
self.calc_execution_result;
30+
self.calc_execution_result();
3031

3132
self.end_time := current_timestamp;
3233

@@ -35,16 +36,16 @@ create or replace type body ut_run as
3536
return l_completed_without_errors;
3637
end;
3738

38-
member procedure calc_execution_result(self in out nocopy ut_run) is
39+
overriding member procedure calc_execution_result(self in out nocopy ut_run) is
3940
l_result integer(1);
4041
begin
4142
if self.items is not null and self.items.count > 0 then
42-
l_result := ut_utils.tr_ignore;
4343
for i in 1 .. self.items.count loop
44-
l_result := greatest(self.items(i).result, l_result);
45-
exit when l_result = ut_utils.tr_error;
44+
self.results_count.sum_counter_values( self.items(i).results_count );
4645
end loop;
46+
l_result := self.results_count.result_status();
4747
else
48+
--if suite is empty then it's successful (no errors)
4849
l_result := ut_utils.tr_success;
4950
end if;
5051

source/core/types/ut_run.tps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ create or replace type ut_run under ut_suite_item (
66
constructor function ut_run( self in out nocopy ut_run, a_items ut_suite_items ) return self as result,
77
overriding member function do_execute(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base) return boolean,
88
overriding member procedure do_execute(self in out nocopy ut_run, a_listener in out nocopy ut_event_listener_base),
9-
member procedure calc_execution_result(self in out nocopy ut_run)
9+
overriding member procedure calc_execution_result(self in out nocopy ut_run)
1010
)
1111
/

source/core/types/ut_suite.tpb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ create or replace type body ut_suite as
107107
l_completed_without_errors := self.after_all.do_execute(self, a_listener);
108108
end if;
109109

110-
self.calc_execution_result;
110+
self.calc_execution_result();
111111

112112
self.rollback_to_savepoint(l_suite_savepoint);
113113

@@ -119,21 +119,21 @@ create or replace type body ut_suite as
119119
return l_completed_without_errors;
120120
end;
121121

122-
member procedure calc_execution_result(self in out nocopy ut_suite) is
122+
overriding member procedure calc_execution_result(self in out nocopy ut_suite) is
123123
l_result integer(1);
124124
begin
125125
if self.items is not null and self.items.count > 0 then
126-
l_result := ut_utils.tr_ignore;
127126
for i in 1 .. self.items.count loop
128-
l_result := greatest(self.items(i).result, l_result);
129-
exit when l_result = ut_utils.tr_error;
127+
self.results_count.sum_counter_values( self.items(i).results_count );
130128
end loop;
129+
l_result := self.results_count.result_status();
131130
else
131+
--if suite is empty then it's successful (no errors)
132132
l_result := ut_utils.tr_success;
133133
end if;
134134

135-
self.result := l_result;
136-
end;
135+
self.result := l_result;
136+
end;
137137

138138
end;
139139
/

source/core/types/ut_suite.tps

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,6 @@ create or replace type ut_suite under ut_suite_item (
3636
member procedure add_item(self in out nocopy ut_suite, a_item ut_suite_item),
3737
overriding member function do_execute(self in out nocopy ut_suite, a_listener in out nocopy ut_event_listener_base) return boolean,
3838
overriding member procedure do_execute(self in out nocopy ut_suite, a_listener in out nocopy ut_event_listener_base),
39-
member procedure calc_execution_result(self in out nocopy ut_suite)
39+
overriding member procedure calc_execution_result(self in out nocopy ut_suite)
4040
)
4141
/

source/core/types/ut_suite_item.tpb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ create or replace type body ut_suite_item as
1212
self.path := nvl(lower(trim(a_path)), self.object_name);
1313
self.rollback_type := a_rollback_type;
1414
self.ignore_flag := ut_utils.boolean_to_int(a_ignore_flag);
15+
self.results_count := ut_results_counter();
1516
end;
1617

1718
member procedure set_ignore_flag(self in out nocopy ut_suite_item, a_ignore_flag boolean) is

0 commit comments

Comments
 (0)