gurke 3.3.1 → 3.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/gurke/reporter.rb +13 -11
- data/lib/gurke/reporters/compact_reporter.rb +2 -2
- data/lib/gurke/reporters/team_city_reporter.rb +15 -47
- data/lib/gurke/version.rb +1 -1
- data/spec/gurke/reporters/compact_reporter_spec.rb +215 -0
- data/spec/gurke/reporters/team_city_reporter_spec.rb +88 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0397cd73d54c76350b72961da6af3a7735b4bfc134e2c4ec85d1aa0698d83fef
|
4
|
+
data.tar.gz: ba610c4ef198dc90e5962386a410fc886ec8eebad749dfba177ca0011da61308
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f62c44c16c881ed3ceac307cf380fd1c7a07a92f0cd499a016d494acb7cc1e0939641f9a6e3153b6d553f2fc409ed22a4ae24d889e195123e76cdae06fce0791
|
7
|
+
data.tar.gz: e476dc728f92ebd45dcb594a9a7a60914b580c4e4c346533bfa1d6640724dc645791e3bd985760d7e286ae00f309238fc4235d2e44e2286e0a8f1bd95180d130
|
data/CHANGELOG.md
CHANGED
data/lib/gurke/reporter.rb
CHANGED
@@ -275,28 +275,30 @@ module Gurke
|
|
275
275
|
|
276
276
|
protected
|
277
277
|
|
278
|
-
def format_exception(ex, backtrace: true)
|
279
|
-
s =
|
278
|
+
def format_exception(ex, backtrace: true, indent: 0)
|
279
|
+
s = StringIO.new
|
280
|
+
s << (' ' * indent) << ex.class.to_s << ': ' << ex.message.strip << "\n"
|
280
281
|
|
281
|
-
if backtrace
|
282
|
+
if backtrace && ex.respond_to?(:backtrace)
|
282
283
|
if ex.backtrace.nil?
|
283
|
-
s << ' <no backtrace available>'
|
284
|
+
s << (' ' * indent) << ' <no backtrace available>'
|
284
285
|
elsif ex.backtrace.empty?
|
285
|
-
s << ' <backtrace empty>'
|
286
|
+
s << (' ' * indent) << ' <backtrace empty>'
|
286
287
|
else
|
287
288
|
ex.backtrace.each do |bt|
|
288
|
-
s << ' ' << bt.strip << "\n"
|
289
|
+
s << (' ' * indent) << ' ' << bt.strip << "\n"
|
289
290
|
end
|
290
291
|
end
|
291
292
|
end
|
292
293
|
|
293
|
-
if ex.respond_to?(:cause) && ex.cause &&
|
294
|
-
|
295
|
-
|
296
|
-
|
294
|
+
if ex.respond_to?(:cause) && ex.cause && ex.cause.respond_to?(:message)
|
295
|
+
s << (' ' * indent) << 'caused by: '
|
296
|
+
s << format_exception(
|
297
|
+
ex.cause, backtrace: backtrace, indent: indent
|
298
|
+
).strip
|
297
299
|
end
|
298
300
|
|
299
|
-
s
|
301
|
+
s.string
|
300
302
|
end
|
301
303
|
end
|
302
304
|
end
|
@@ -71,8 +71,8 @@ module Gurke::Reporters
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
exout = format_exception(result.exception, backtrace: true)
|
75
|
-
io.puts red exout
|
74
|
+
exout = format_exception(result.exception, backtrace: true, indent: 6)
|
75
|
+
io.puts red exout
|
76
76
|
io.puts
|
77
77
|
end
|
78
78
|
|
@@ -13,21 +13,27 @@ module Gurke::Reporters
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def before_scenario(scenario)
|
16
|
-
@status_reported = false
|
17
|
-
@retry = false
|
18
|
-
|
19
16
|
publish :testStarted, name: scenario.name
|
20
17
|
|
21
18
|
super
|
22
19
|
end
|
23
20
|
|
24
|
-
def retry_scenario(scenario)
|
25
|
-
@retry = true
|
26
|
-
|
27
|
-
super
|
28
|
-
end
|
29
|
-
|
30
21
|
def after_scenario(scenario)
|
22
|
+
if scenario.failed?
|
23
|
+
publish :testFailed,
|
24
|
+
name: scenario.name,
|
25
|
+
message: scenario.exception.inspect,
|
26
|
+
backtrace: scenario.exception.backtrace.join('\n')
|
27
|
+
elsif scenario.pending?
|
28
|
+
publish :testIgnored,
|
29
|
+
name: scenario.name,
|
30
|
+
message: 'Step definition missing'
|
31
|
+
else
|
32
|
+
publish :testIgnored,
|
33
|
+
name: scenario.name,
|
34
|
+
message: 'Aborted.'
|
35
|
+
end
|
36
|
+
|
31
37
|
publish :testFinished, name: scenario.name
|
32
38
|
|
33
39
|
super
|
@@ -39,46 +45,8 @@ module Gurke::Reporters
|
|
39
45
|
super
|
40
46
|
end
|
41
47
|
|
42
|
-
protected
|
43
|
-
|
44
|
-
def step_pending(step, *)
|
45
|
-
super
|
46
|
-
|
47
|
-
report :testIgnored,
|
48
|
-
name: step.scenario.name,
|
49
|
-
message: 'Step definition missing'
|
50
|
-
end
|
51
|
-
|
52
|
-
def step_failed(step, *args)
|
53
|
-
super(step, *args, exception: false)
|
54
|
-
|
55
|
-
unless step.scenario.retryable? && !retry?
|
56
|
-
# do not report test as failed if it will be retries
|
57
|
-
report :testFailed,
|
58
|
-
name: step.scenario.name,
|
59
|
-
message: step.exception.inspect,
|
60
|
-
backtrace: step.exception.backtrace.join('\n')
|
61
|
-
end
|
62
|
-
|
63
|
-
print_exception(step.exception)
|
64
|
-
end
|
65
|
-
|
66
48
|
private
|
67
49
|
|
68
|
-
def status_reported?
|
69
|
-
@status_reported
|
70
|
-
end
|
71
|
-
|
72
|
-
def retry?
|
73
|
-
@retry
|
74
|
-
end
|
75
|
-
|
76
|
-
def report(*args)
|
77
|
-
return if status_reported?
|
78
|
-
|
79
|
-
publish(*args)
|
80
|
-
end
|
81
|
-
|
82
50
|
def publish(message_name, args)
|
83
51
|
args = [] << message_name.to_s << escaped_array_of(args)
|
84
52
|
args = args.flatten.reject(&:nil?)
|
data/lib/gurke/version.rb
CHANGED
@@ -0,0 +1,215 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable MissingCopEnableDirective
|
4
|
+
# rubocop:disable Style/Semicolon
|
5
|
+
|
6
|
+
require 'spec_helper'
|
7
|
+
|
8
|
+
RSpec.describe Gurke::Reporters::CompactReporter do
|
9
|
+
let(:output) { StringIO.new }
|
10
|
+
let(:reporter) { described_class.new(output) }
|
11
|
+
subject { output.string }
|
12
|
+
|
13
|
+
describe '#before_feature' do
|
14
|
+
let(:feature) { double('feature') }
|
15
|
+
|
16
|
+
subject { reporter.before_feature(feature); super() }
|
17
|
+
|
18
|
+
it { is_expected.to eq '' }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#start_background' do
|
22
|
+
let(:feature) { double('feature') }
|
23
|
+
|
24
|
+
subject { reporter.start_background(feature); super() }
|
25
|
+
|
26
|
+
it { is_expected.to eq '' }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#before_scenario' do
|
30
|
+
let(:scenario) { double('scenario') }
|
31
|
+
|
32
|
+
subject { reporter.before_scenario(scenario); super() }
|
33
|
+
|
34
|
+
it { is_expected.to eq '' }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#before_step' do
|
38
|
+
let(:step) { double('step') }
|
39
|
+
|
40
|
+
subject { reporter.before_step(step); super() }
|
41
|
+
|
42
|
+
it { is_expected.to eq '' }
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#after_step' do
|
46
|
+
let(:feature) { double('feature') }
|
47
|
+
let(:scenario) { double('scenario') }
|
48
|
+
let(:step) { double('step') }
|
49
|
+
let(:result) { double('result') }
|
50
|
+
let(:backgrounds) { [] }
|
51
|
+
let(:exception) { nil }
|
52
|
+
|
53
|
+
let(:steps) do
|
54
|
+
[step]
|
55
|
+
end
|
56
|
+
|
57
|
+
before do
|
58
|
+
allow(result).to receive(:step).and_return(step)
|
59
|
+
allow(result).to receive(:scenario).and_return(scenario)
|
60
|
+
allow(result).to receive(:state).and_return(state)
|
61
|
+
allow(result).to receive(:exception).and_return(exception)
|
62
|
+
end
|
63
|
+
|
64
|
+
before do
|
65
|
+
allow(step).to receive(:name).and_return 'the scenario is passing'
|
66
|
+
allow(step).to receive(:keyword).and_return 'Given'
|
67
|
+
end
|
68
|
+
|
69
|
+
before do
|
70
|
+
allow(scenario).to receive(:feature).and_return(feature)
|
71
|
+
allow(scenario).to receive(:steps).and_return(steps)
|
72
|
+
|
73
|
+
allow(scenario).to receive(:name).and_return 'Running the scenario'
|
74
|
+
allow(scenario).to receive(:file).and_return \
|
75
|
+
File.join(Dir.getwd, 'features', 'file.feature')
|
76
|
+
allow(scenario).to receive(:line).and_return 5
|
77
|
+
end
|
78
|
+
|
79
|
+
before do
|
80
|
+
allow(feature).to receive(:backgrounds).and_return(backgrounds)
|
81
|
+
|
82
|
+
allow(feature).to receive(:name).and_return 'Demo feature'
|
83
|
+
allow(feature).to receive(:file).and_return \
|
84
|
+
File.join(Dir.getwd, 'features', 'file.feature')
|
85
|
+
allow(feature).to receive(:line).and_return 1
|
86
|
+
allow(feature).to receive(:description).and_return \
|
87
|
+
"As a developer\nI would like have this spec passed\nIn order to work on"
|
88
|
+
end
|
89
|
+
|
90
|
+
subject { reporter.after_step(result, scenario); super() }
|
91
|
+
|
92
|
+
context 'with step passing' do
|
93
|
+
let(:state) { :passed }
|
94
|
+
|
95
|
+
it { is_expected.to eq '' }
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'with step pending' do
|
99
|
+
let(:state) { :pending }
|
100
|
+
|
101
|
+
it { is_expected.to eq '' }
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'with step pending' do
|
105
|
+
let(:state) { nil }
|
106
|
+
|
107
|
+
it { is_expected.to eq '' }
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'with step failing' do
|
111
|
+
let(:state) { :failed }
|
112
|
+
|
113
|
+
before do
|
114
|
+
e = double 'exception'
|
115
|
+
c = double 'exception'
|
116
|
+
|
117
|
+
allow(e).to receive(:class).and_return(RuntimeError)
|
118
|
+
allow(e).to receive(:message).and_return('An error occurred')
|
119
|
+
allow(e).to receive(:backtrace).and_return([
|
120
|
+
'/path/to/file.rb:5:in `block (4 levels) in <top (required)>\'',
|
121
|
+
'/path/to/file.rb:24:in in `fail_with\''
|
122
|
+
])
|
123
|
+
|
124
|
+
allow(e).to receive(:cause).and_return(c)
|
125
|
+
|
126
|
+
allow(c).to receive(:class).and_return(IOError)
|
127
|
+
allow(c).to receive(:message).and_return('Socket closed')
|
128
|
+
allow(c).to receive(:backtrace).and_return([
|
129
|
+
'script.rb:5:in `a\'',
|
130
|
+
'script.rb:10:in `b\''
|
131
|
+
])
|
132
|
+
|
133
|
+
expect(result).to receive(:exception).and_return e
|
134
|
+
end
|
135
|
+
|
136
|
+
it do
|
137
|
+
is_expected.to eq unindent <<~TEXT
|
138
|
+
.E
|
139
|
+
.Feature: Demo feature # features/file.feature:1
|
140
|
+
. Scenario: Running the scenario # features/file.feature:5
|
141
|
+
. Given the scenario is passing
|
142
|
+
. RuntimeError: An error occurred
|
143
|
+
. /path/to/file.rb:5:in `block (4 levels) in <top (required)>'
|
144
|
+
. /path/to/file.rb:24:in in `fail_with'
|
145
|
+
. caused by: IOError: Socket closed
|
146
|
+
. script.rb:5:in `a'
|
147
|
+
. script.rb:10:in `b'
|
148
|
+
.
|
149
|
+
.
|
150
|
+
TEXT
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
describe '#retry_scenario' do
|
156
|
+
let(:scenario) { double('scenario') }
|
157
|
+
|
158
|
+
subject { reporter.retry_scenario(scenario); super() }
|
159
|
+
|
160
|
+
it { is_expected.to eq '' }
|
161
|
+
end
|
162
|
+
|
163
|
+
describe '#after_scenario' do
|
164
|
+
let(:scenario) { double('scenario') }
|
165
|
+
|
166
|
+
subject { reporter.after_scenario(scenario); super() }
|
167
|
+
|
168
|
+
before do
|
169
|
+
allow(scenario).to receive(:failed?).and_return(false)
|
170
|
+
allow(scenario).to receive(:passed?).and_return(true)
|
171
|
+
allow(scenario).to receive(:pending?).and_return(false)
|
172
|
+
end
|
173
|
+
|
174
|
+
it { is_expected.to eq '.' }
|
175
|
+
|
176
|
+
context '<failed>' do
|
177
|
+
before do
|
178
|
+
allow(scenario).to receive(:failed?).and_return(true)
|
179
|
+
end
|
180
|
+
|
181
|
+
it { is_expected.to eq '' }
|
182
|
+
end
|
183
|
+
|
184
|
+
context '<pending>' do
|
185
|
+
before do
|
186
|
+
allow(scenario).to receive(:pending?).and_return(true)
|
187
|
+
end
|
188
|
+
|
189
|
+
it { is_expected.to eq '?' }
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
describe '#after_feature' do
|
194
|
+
let(:feature) { double('feature') }
|
195
|
+
|
196
|
+
subject { reporter.after_feature(feature); super() }
|
197
|
+
|
198
|
+
it { is_expected.to eq '' }
|
199
|
+
end
|
200
|
+
|
201
|
+
describe '#after_features' do
|
202
|
+
let(:features) { [] }
|
203
|
+
|
204
|
+
subject { reporter.after_features(features); super() }
|
205
|
+
|
206
|
+
it do
|
207
|
+
is_expected.to eq unindent <<~TEXT
|
208
|
+
.
|
209
|
+
.
|
210
|
+
.0 scenarios: 0 passed, 0 failing, 0 pending
|
211
|
+
.
|
212
|
+
TEXT
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# rubocop:disable MissingCopEnableDirective
|
4
|
+
# rubocop:disable Style/Semicolon
|
5
|
+
|
6
|
+
require 'spec_helper'
|
7
|
+
|
8
|
+
RSpec.describe Gurke::Reporters::TeamCityReporter do
|
9
|
+
let(:output) { StringIO.new }
|
10
|
+
let(:reporter) { described_class.new(output) }
|
11
|
+
subject { output.string }
|
12
|
+
|
13
|
+
describe '#before_feature' do
|
14
|
+
let(:feature) { double('feature') }
|
15
|
+
|
16
|
+
before do
|
17
|
+
allow(feature).to receive(:name).and_return 'Demo feature'
|
18
|
+
allow(feature).to receive(:file).and_return \
|
19
|
+
File.join(Dir.getwd, 'features', 'file.feature')
|
20
|
+
allow(feature).to receive(:line).and_return 1
|
21
|
+
allow(feature).to receive(:description).and_return \
|
22
|
+
"As a developer\nI would like have this spec passed\nIn order to work on"
|
23
|
+
end
|
24
|
+
|
25
|
+
subject { reporter.before_feature(feature); super() }
|
26
|
+
|
27
|
+
it 'include a testSuiteStarted command' do
|
28
|
+
is_expected.to include <<~TXT
|
29
|
+
##teamcity[testSuiteStarted name='Demo feature']
|
30
|
+
TXT
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#before_scenario' do
|
35
|
+
let(:scenario) { double('scenario') }
|
36
|
+
|
37
|
+
before do
|
38
|
+
allow(scenario).to receive(:name).and_return 'Running the scenario'
|
39
|
+
allow(scenario).to receive(:file).and_return \
|
40
|
+
File.join(Dir.getwd, 'features', 'file.feature')
|
41
|
+
allow(scenario).to receive(:line).and_return 5
|
42
|
+
end
|
43
|
+
|
44
|
+
subject { reporter.before_scenario(scenario); super() }
|
45
|
+
|
46
|
+
it do
|
47
|
+
is_expected.to include <<~TXT
|
48
|
+
##teamcity[testStarted name='Running the scenario']
|
49
|
+
TXT
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#after_scenario' do
|
54
|
+
let(:scenario) { double('scenario') }
|
55
|
+
|
56
|
+
before do
|
57
|
+
allow(scenario).to receive(:name).and_return 'Running the scenario'
|
58
|
+
allow(scenario).to receive(:passed?).and_return(true)
|
59
|
+
allow(scenario).to receive(:failed?).and_return(false)
|
60
|
+
allow(scenario).to receive(:pending?).and_return(false)
|
61
|
+
allow(scenario).to receive(:aborted?).and_return(false)
|
62
|
+
end
|
63
|
+
|
64
|
+
subject { reporter.after_scenario(scenario); super() }
|
65
|
+
|
66
|
+
it do
|
67
|
+
is_expected.to include <<~TXT
|
68
|
+
##teamcity[testFinished name='Running the scenario']
|
69
|
+
TXT
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#after_feature' do
|
74
|
+
let(:feature) { double('feature') }
|
75
|
+
|
76
|
+
before do
|
77
|
+
allow(feature).to receive(:name).and_return 'Demo feature'
|
78
|
+
end
|
79
|
+
|
80
|
+
subject { reporter.after_feature(feature); super() }
|
81
|
+
|
82
|
+
it do
|
83
|
+
is_expected.to include <<~TXT
|
84
|
+
##teamcity[testSuiteFinished name='Demo feature']
|
85
|
+
TXT
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gurke
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.
|
4
|
+
version: 3.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Graichen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -118,7 +118,9 @@ files:
|
|
118
118
|
- lib/gurke/tag.rb
|
119
119
|
- lib/gurke/version.rb
|
120
120
|
- spec/gurke/feature_list_spec.rb
|
121
|
+
- spec/gurke/reporters/compact_reporter_spec.rb
|
121
122
|
- spec/gurke/reporters/default_reporter_spec.rb
|
123
|
+
- spec/gurke/reporters/team_city_reporter_spec.rb
|
122
124
|
- spec/gurke/run_list_spec.rb
|
123
125
|
- spec/gurke/scenario_spec.rb
|
124
126
|
- spec/gurke/step_definition_spec.rb
|
@@ -164,7 +166,9 @@ test_files:
|
|
164
166
|
- features/support/steps/cli_steps.rb
|
165
167
|
- features/support/steps/file_steps.rb
|
166
168
|
- spec/gurke/feature_list_spec.rb
|
169
|
+
- spec/gurke/reporters/compact_reporter_spec.rb
|
167
170
|
- spec/gurke/reporters/default_reporter_spec.rb
|
171
|
+
- spec/gurke/reporters/team_city_reporter_spec.rb
|
168
172
|
- spec/gurke/run_list_spec.rb
|
169
173
|
- spec/gurke/scenario_spec.rb
|
170
174
|
- spec/gurke/step_definition_spec.rb
|