allure-cucumber 0.6.1 → 2.10.0.beta2
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 +5 -5
- data/README.md +22 -26
- data/lib/allure-cucumber.rb +18 -44
- data/lib/allure_cucumber/ast_transformer.rb +41 -0
- data/lib/allure_cucumber/config.rb +28 -0
- data/lib/allure_cucumber/cucumber_model.rb +137 -0
- data/lib/allure_cucumber/formatter.rb +109 -0
- data/lib/allure_cucumber/tag_parser.rb +78 -0
- metadata +26 -83
- data/.gitignore +0 -18
- data/Gemfile +0 -4
- data/LICENSE +0 -13
- data/Rakefile +0 -3
- data/allure-cucumber.gemspec +0 -26
- data/features/docs/acceptance_tests/dsl_attach_file.feature +0 -458
- data/features/docs/acceptance_tests/embed_attach_file.feature +0 -460
- data/features/lib/support/aruba.rb +0 -7
- data/features/lib/support/env.rb +0 -1
- data/fixtures/minimal_cucumber_app/features/lib/support/env.rb +0 -0
- data/lib/allure-cucumber/dsl.rb +0 -17
- data/lib/allure-cucumber/feature_tracker.rb +0 -19
- data/lib/allure-cucumber/formatter.rb +0 -259
- data/lib/allure-cucumber/version.rb +0 -5
data/features/lib/support/env.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'bundler/setup'
|
File without changes
|
data/lib/allure-cucumber/dsl.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
module AllureCucumber
|
2
|
-
module DSL
|
3
|
-
|
4
|
-
def attach_file(title, file, attach_to_step=true)
|
5
|
-
@tracker = AllureCucumber::FeatureTracker.tracker
|
6
|
-
options = {:file => file, :title => title}
|
7
|
-
options.merge!(:step => @tracker.step_name) if attach_to_step
|
8
|
-
if @tracker.scenario_name
|
9
|
-
AllureRubyAdaptorApi::Builder.add_attachment(@tracker.feature_name, @tracker.scenario_name, options)
|
10
|
-
else
|
11
|
-
# TODO: This is possible for background steps.
|
12
|
-
puts "Cannot attach #{title} to step #{@tracker.step_name} as scenario name is undefined"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module AllureCucumber
|
2
|
-
|
3
|
-
class FeatureTracker
|
4
|
-
|
5
|
-
attr_accessor :feature_name, :scenario_name, :step_name, :step_id
|
6
|
-
@@tracker = nil
|
7
|
-
|
8
|
-
def self.create
|
9
|
-
@@tracker = FeatureTracker.new unless @@tracker
|
10
|
-
private_class_method :new
|
11
|
-
@@tracker
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.tracker
|
15
|
-
@@tracker
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
@@ -1,259 +0,0 @@
|
|
1
|
-
require 'pathname'
|
2
|
-
require 'uuid'
|
3
|
-
require 'allure-ruby-adaptor-api'
|
4
|
-
|
5
|
-
module AllureCucumber
|
6
|
-
class Formatter
|
7
|
-
|
8
|
-
include AllureCucumber::DSL
|
9
|
-
|
10
|
-
TEST_HOOK_NAMES_TO_IGNORE = ['Before hook', 'After hook']
|
11
|
-
ALLOWED_SEVERITIES = ['blocker', 'critical', 'normal', 'minor', 'trivial']
|
12
|
-
POSSIBLE_STATUSES = ['passed', 'failed', 'pending', 'skipped', 'undefined']
|
13
|
-
|
14
|
-
def initialize(step_mother, path_or_io, options)
|
15
|
-
AllureCucumber::Config.output_dir = path_or_io if path_or_io.is_a?(String)
|
16
|
-
dir = Pathname.new(AllureCucumber::Config.output_dir)
|
17
|
-
FileUtils.rm_rf(dir) unless AllureCucumber::Config.clean_dir == false
|
18
|
-
FileUtils.mkdir_p(dir)
|
19
|
-
@tracker = AllureCucumber::FeatureTracker.create
|
20
|
-
@deferred_before_test_steps = []
|
21
|
-
@deferred_after_test_steps = []
|
22
|
-
@scenario_tags = {}
|
23
|
-
end
|
24
|
-
|
25
|
-
# Start the test suite
|
26
|
-
def before_feature(feature)
|
27
|
-
feature_identifier = ENV['FEATURE_IDENTIFIER'] && "#{ENV['FEATURE_IDENTIFIER']} - "
|
28
|
-
@tracker.feature_name = "#{feature_identifier}#{feature.name.gsub(/\n/, " ")}"
|
29
|
-
AllureRubyAdaptorApi::Builder.start_suite(@tracker.feature_name)
|
30
|
-
end
|
31
|
-
|
32
|
-
# Find sceanrio type
|
33
|
-
def before_feature_element(feature_element)
|
34
|
-
@scenario_outline = feature_element.instance_of?(Cucumber::Core::Ast::ScenarioOutline)
|
35
|
-
end
|
36
|
-
|
37
|
-
def scenario_name(keyword, name, *args)
|
38
|
-
scenario_name = (name.nil? || name == "") ? "Unnamed scenario" : name.gsub(/\n/, " ")
|
39
|
-
@scenario_outline ? @scenario_outline_name = scenario_name : @tracker.scenario_name = scenario_name
|
40
|
-
end
|
41
|
-
|
42
|
-
# Analyze Cucumber Scenario Tags
|
43
|
-
def after_tags(tags)
|
44
|
-
tags.each do |tag|
|
45
|
-
if AllureCucumber::Config.tms_prefix && tag.name.include?(AllureCucumber::Config.tms_prefix)
|
46
|
-
@scenario_tags[:testId] = remove_tag_prefix(tag.name, AllureCucumber::Config.tms_prefix)
|
47
|
-
end
|
48
|
-
|
49
|
-
if tag.name.include?(AllureCucumber::Config.issue_prefix)
|
50
|
-
@scenario_tags[:issue] = remove_tag_prefix(tag.name, AllureCucumber::Config.issue_prefix)
|
51
|
-
end
|
52
|
-
|
53
|
-
if tag.name.include?(AllureCucumber::Config.severity_prefix) && ALLOWED_SEVERITIES.include?(remove_tag_prefix(tag.name, AllureCucumber::Config.severity_prefix))
|
54
|
-
@scenario_tags[:severity] = remove_tag_prefix(tag.name, AllureCucumber::Config.severity_prefix).downcase.to_sym
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def before_examples(*args)
|
60
|
-
@header_row = true
|
61
|
-
end
|
62
|
-
|
63
|
-
def before_scenario(scenario)
|
64
|
-
# not used now, but keeping for later.
|
65
|
-
end
|
66
|
-
|
67
|
-
# Start the test for normal scenarios
|
68
|
-
def before_steps(steps)
|
69
|
-
if !@scenario_outline
|
70
|
-
start_test
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# Stop the test for normal scenarios
|
75
|
-
def after_steps(steps)
|
76
|
-
if !@scenario_outline
|
77
|
-
@result = test_result(steps)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def after_scenario(scenario)
|
82
|
-
@result[:status] = cucumber_status_to_allure_status(scenario.status)
|
83
|
-
stop_test(@result)
|
84
|
-
end
|
85
|
-
|
86
|
-
def after_feature_element(feature_element)
|
87
|
-
after_scenario(feature_element)
|
88
|
-
end
|
89
|
-
|
90
|
-
# Start the test for scenario examples
|
91
|
-
def before_table_row(table_row)
|
92
|
-
if @scenario_outline && !@header_row && !@in_multiline_arg
|
93
|
-
@tracker.scenario_name = "#{@scenario_outline_name}: #{table_row.values.join(' | ')}"
|
94
|
-
start_test
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
# Stop the test for scenario examples
|
99
|
-
def after_table_row(table_row)
|
100
|
-
unless @multiline_arg
|
101
|
-
if @scenario_outline && !@header_row
|
102
|
-
@result = test_result(table_row)
|
103
|
-
stop_test(@result)
|
104
|
-
end
|
105
|
-
@header_row = false
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def before_test_step(test_step)
|
110
|
-
if !TEST_HOOK_NAMES_TO_IGNORE.include?(test_step.name)
|
111
|
-
if @tracker.scenario_name
|
112
|
-
step_location = test_step.location.lines.first.to_s
|
113
|
-
step_name = test_step.name
|
114
|
-
@tracker.step_id = "#{@tracker.feature_name}-#{@tracker.scenario_name}-#{step_name}-#{step_location}"
|
115
|
-
@tracker.step_name = step_name
|
116
|
-
start_step
|
117
|
-
else
|
118
|
-
@deferred_before_test_steps << {:step => test_step, :timestamp => Time.now}
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
def after_test_step(test_step, result)
|
124
|
-
if test_step.name == 'Before hook'
|
125
|
-
if (!@before_hook_exception) && result.methods.include?(:exception)
|
126
|
-
@before_hook_exception = result.exception
|
127
|
-
end
|
128
|
-
elsif test_step.name != 'After hook'
|
129
|
-
if @tracker.scenario_name
|
130
|
-
status = step_status(result)
|
131
|
-
stop_step(status)
|
132
|
-
else
|
133
|
-
@deferred_after_test_steps << {:step => test_step, :result => result, :timestamp => Time.now}
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
# Stop the suite
|
139
|
-
def after_feature(feature)
|
140
|
-
AllureRubyAdaptorApi::Builder.stop_suite(@tracker.feature_name)
|
141
|
-
end
|
142
|
-
|
143
|
-
def after_features(features)
|
144
|
-
AllureRubyAdaptorApi::Builder.build!
|
145
|
-
end
|
146
|
-
|
147
|
-
def before_multiline_arg(multiline_arg)
|
148
|
-
@in_multiline_arg = true
|
149
|
-
# For background steps defer multiline attachment
|
150
|
-
if @tracker.scenario_name.nil?
|
151
|
-
@deferred_before_test_steps[-1].merge!({:multiline_arg => multiline_arg})
|
152
|
-
else
|
153
|
-
attach_multiline_arg_to_file(multiline_arg)
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
def after_multiline_arg(multiline_arg)
|
158
|
-
@in_multiline_arg = false
|
159
|
-
end
|
160
|
-
|
161
|
-
def embed(src, mime_type, label)
|
162
|
-
file = File.open(src)
|
163
|
-
file.close
|
164
|
-
attach_file(label, file)
|
165
|
-
end
|
166
|
-
|
167
|
-
private
|
168
|
-
|
169
|
-
def remove_tag_prefix(tag, prefix)
|
170
|
-
tag.gsub(prefix,'')
|
171
|
-
end
|
172
|
-
|
173
|
-
def step_status(result)
|
174
|
-
POSSIBLE_STATUSES.each do |status|
|
175
|
-
return cucumber_status_to_allure_status(status) if result.send("#{status}?")
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
def test_result(result)
|
180
|
-
status = cucumber_status_to_allure_status(result.status)
|
181
|
-
if @before_hook_exception
|
182
|
-
exception = @before_hook_exception
|
183
|
-
else
|
184
|
-
exception = status == 'failed' && result.exception.nil? ? Exception.new("Some steps were undefined") : result.exception
|
185
|
-
end
|
186
|
-
if exception
|
187
|
-
return {:status => status, :exception => exception}
|
188
|
-
else
|
189
|
-
return {:status => status}
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
def cucumber_status_to_allure_status(status)
|
194
|
-
case status.to_s
|
195
|
-
when "undefined"
|
196
|
-
return "broken"
|
197
|
-
when "skipped"
|
198
|
-
return "canceled"
|
199
|
-
else
|
200
|
-
return status.to_s
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def attach_multiline_arg_to_file(multiline_arg)
|
205
|
-
dir = File.expand_path(AllureCucumber::Config.output_dir)
|
206
|
-
out_file = "#{dir}/#{UUID.new.generate}.txt"
|
207
|
-
File.open(out_file, "w+") { |file| file.write(multiline_arg.to_s.gsub(/\e\[(\d+)(;\d+)*m/,'')) }
|
208
|
-
attach_file("multiline_arg", File.open(out_file))
|
209
|
-
end
|
210
|
-
|
211
|
-
def start_test
|
212
|
-
if @tracker.scenario_name
|
213
|
-
@scenario_tags[:feature] = @tracker.feature_name
|
214
|
-
@scenario_tags[:story] = @tracker.scenario_name
|
215
|
-
AllureRubyAdaptorApi::Builder.start_test(@tracker.feature_name, @tracker.scenario_name, @scenario_tags)
|
216
|
-
post_deferred_steps
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
def post_deferred_steps
|
221
|
-
@deferred_before_test_steps.size.times do |index|
|
222
|
-
step_location = @deferred_before_test_steps[index][:step].location.lines.first.to_s
|
223
|
-
step_name = @deferred_before_test_steps[index][:step].name
|
224
|
-
@tracker.step_id = "#{@tracker.feature_name}-#{@tracker.scenario_name}-#{step_name}-#{step_location}"
|
225
|
-
@tracker.step_name = step_name
|
226
|
-
start_step
|
227
|
-
multiline_arg = @deferred_before_test_steps[index][:multiline_arg]
|
228
|
-
attach_multiline_arg_to_file(multiline_arg) if multiline_arg
|
229
|
-
if index < @deferred_after_test_steps.size
|
230
|
-
result = step_status(@deferred_after_test_steps[index][:result])
|
231
|
-
stop_step(result)
|
232
|
-
end
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
|
-
def stop_test(result)
|
237
|
-
if @deferred_before_test_steps != []
|
238
|
-
result[:started_at] = @deferred_before_test_steps[0][:timestamp]
|
239
|
-
end
|
240
|
-
if @tracker.scenario_name
|
241
|
-
AllureRubyAdaptorApi::Builder.stop_test(@tracker.feature_name, @tracker.scenario_name, result)
|
242
|
-
@tracker.scenario_name = nil
|
243
|
-
@deferred_before_test_steps = []
|
244
|
-
@deferred_after_test_steps = []
|
245
|
-
@scenario_tags = {}
|
246
|
-
@before_hook_exception = nil
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
def start_step(step_name = @tracker.step_name, step_id = @tracker.step_id)
|
251
|
-
AllureRubyAdaptorApi::Builder.start_step(@tracker.feature_name, @tracker.scenario_name, step_name, step_id)
|
252
|
-
end
|
253
|
-
|
254
|
-
def stop_step(status, step_name = @tracker.step_name, step_id = @tracker.step_id)
|
255
|
-
AllureRubyAdaptorApi::Builder.stop_step(@tracker.feature_name, @tracker.scenario_name, step_name, step_id, status)
|
256
|
-
end
|
257
|
-
|
258
|
-
end
|
259
|
-
end
|