allure-cucumber 0.4.4 → 0.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 213d515aaef5e471ee15dfb3a204f64aa8aa82a3
4
- data.tar.gz: 74f5ec0d9571106fecceb3c5ef585e3c5b727498
3
+ metadata.gz: f342ba639e4ecb153d62562f75c474a849027308
4
+ data.tar.gz: a50a28d657b4b31178282d0c83d7416478a6ad0a
5
5
  SHA512:
6
- metadata.gz: 8908351075d48e8834a1bc54abbfccda4ee8c7e60ccf7f0793866d8b8bb3cea4c6130def70c9d4e9fe398a2b833564c4c64c5ca20ddb8d041a3fe62558d6c261
7
- data.tar.gz: e5100f6e83f4fdd668e913bfa3ec4e19824712ca870993ce58d815ccc50c3fc9c519bbb4d6990dce3a8fcabecc1dcdfe7a8a22d4ed37357957b17c70c3aa083f
6
+ metadata.gz: 2afa46d2a3f3cc34d6e162b9bdb897536e4433322d730966b48dee8f03b9654398654e09e412544903b44e62d44f1a27bf207f41dbebd9f83555e66fc235e65d
7
+ data.tar.gz: 8aa900d31952970d60b4dacbd6bad816d9ef6c47f6ee902a9927ceaca2ef417d9457531cb9a402fdb585fa349e3a4d9c66eb4a3ea4c00bf221b401843e449887
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ["lib"]
18
18
 
19
- spec.add_dependency 'cucumber'
19
+ spec.add_dependency 'cucumber' , '>= 2.0.0'
20
20
  spec.add_dependency 'allure-ruby-adaptor-api'
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.5"
@@ -3,7 +3,12 @@ module AllureCucumber
3
3
 
4
4
  def attach_file(title, file)
5
5
  @tracker = AllureCucumber::FeatureTracker.tracker
6
- AllureRubyAdaptorApi::Builder.add_attachment(@tracker.feature_name, @tracker.scenario_name, :step => @tracker.step_name, :file => file, :title => title)
6
+ if @tracker.scenario_name
7
+ AllureRubyAdaptorApi::Builder.add_attachment(@tracker.feature_name, @tracker.scenario_name, :step => @tracker.step_name, :file => file, :title => title)
8
+ else
9
+ # TODO: This is possible for background steps.
10
+ puts "Cannot attach #{title} to step #{@tracker.step_name} as scenario name is undefined"
11
+ end
7
12
  end
8
13
 
9
14
  end
@@ -2,7 +2,7 @@ module AllureCucumber
2
2
 
3
3
  class FeatureTracker
4
4
 
5
- attr_accessor :feature_name, :scenario_name, :step_name, :scenario_started_at
5
+ attr_accessor :feature_name, :scenario_name, :step_name
6
6
  @@tracker = nil
7
7
 
8
8
  def self.create
@@ -6,146 +6,100 @@ module AllureCucumber
6
6
  class Formatter
7
7
 
8
8
  include AllureCucumber::DSL
9
+
10
+ TEST_HOOK_NAMES_TO_IGNORE = ['Before hook', 'After hook']
9
11
 
12
+ POSSIBLE_STATUSES = ['passed', 'failed', 'pending', 'skipped', 'undefined']
13
+
10
14
  def initialize(step_mother, io, options)
11
15
  dir = Pathname.new(AllureCucumber::Config.output_dir)
12
16
  FileUtils.rm_rf(dir)
17
+ FileUtils.mkdir_p(dir)
13
18
  @tracker = AllureCucumber::FeatureTracker.create
19
+ @deferred_before_test_steps = []
20
+ @deferred_after_test_steps = []
14
21
  end
15
22
 
23
+ # Start the test suite
16
24
  def before_feature(feature)
17
- @has_background = false
18
25
  feature_identifier = ENV['FEATURE_IDENTIFIER'] && "#{ENV['FEATURE_IDENTIFIER']} - "
19
26
  @tracker.feature_name = "#{feature_identifier}#{feature.name.gsub(/\n/, " ")}"
20
- AllureRubyAdaptorApi::Builder.start_suite(@tracker.feature_name, :severity => :normal)
21
- end
22
-
23
- def before_background(*args)
24
- @in_background = true
25
- @has_background = true
26
- @background_before_steps = []
27
- @background_after_steps = []
28
- end
29
-
30
- def after_background(*args)
31
- @in_background = false
27
+ AllureRubyAdaptorApi::Builder.start_suite(@tracker.feature_name)
32
28
  end
33
29
 
30
+ # Find sceanrio type
34
31
  def before_feature_element(feature_element)
35
- @scenario_outline = feature_element.instance_of?(Cucumber::Ast::ScenarioOutline)
36
- end
37
-
38
- def scenario_name(keyword, name, file_colon_line, source_indent)
39
- unless @scenario_outline
40
- @tracker.scenario_name = (name.nil? || name == "") ? "Unnamed scenario" : name.gsub(/\n/, " ")
41
- AllureRubyAdaptorApi::Builder.start_test(@tracker.feature_name, @tracker.scenario_name, :feature => @tracker.feature_name, :story => @tracker.scenario_name)
42
- @tracker.scenario_started_at = Time.now
43
- post_background_steps if @has_background
44
- else
45
- @scenario_outline_name = (name.nil? || name == "") ? "Unnamed scenario" : name.gsub(/\n/, " ")
46
- end
32
+ @scenario_outline = feature_element.instance_of?(Cucumber::Core::Ast::ScenarioOutline)
47
33
  end
48
34
 
49
- def before_steps(steps)
50
- @example_before_steps = []
51
- @example_after_steps = []
52
- @exception = nil
35
+ def scenario_name(keyword, name, *args)
36
+ scenario_name = (name.nil? || name == "") ? "Unnamed scenario" : name.gsub(/\n/, " ")
37
+ @scenario_outline ? @scenario_outline_name = scenario_name : @tracker.scenario_name = scenario_name
53
38
  end
54
39
 
55
- def before_step(step)
56
- unless step.background?
57
- unless @scenario_outline
58
- @tracker.step_name = step.name
59
- AllureRubyAdaptorApi::Builder.start_step(@tracker.feature_name, @tracker.scenario_name, @tracker.step_name)
60
- attach_multiline_arg(step.multiline_arg)
61
- else
62
- @example_before_steps << step
63
- end
64
- else
65
- @background_before_steps << step
66
- end
40
+ def before_examples(*args)
41
+ @header_row = true
42
+ @row_count = 0
67
43
  end
68
-
69
- def after_step(step)
70
- unless step.background?
71
- unless @scenario_outline
72
- AllureRubyAdaptorApi::Builder.stop_step(@tracker.feature_name, @tracker.scenario_name, @tracker.step_name, step.status.to_sym)
73
- else
74
- @example_after_steps << step
75
- end
76
- else
77
- @background_after_steps << step
44
+
45
+ # Start the test for normal scenarios
46
+ def before_steps(steps)
47
+ if !@scenario_outline
48
+ start_test
78
49
  end
79
50
  end
80
51
 
52
+ # Stop the test for normal scenarios
81
53
  def after_steps(steps)
82
- return if @in_background || @scenario_outline
83
- result = { :status => steps.status, :exception => steps.exception, :started_at => @tracker.scenario_started_at, :finished_at => Time.now }
84
- AllureRubyAdaptorApi::Builder.stop_test(@tracker.feature_name, @tracker.scenario_name, result)
85
- end
86
-
87
- def before_examples(*args)
88
- @header_row = true
89
- @in_examples = true
54
+ if !@scenario_outline
55
+ result = test_result(steps)
56
+ stop_test(result)
57
+ end
90
58
  end
91
-
92
- def before_examples(*args)
93
- @header_row = true
94
- @in_examples = true
59
+
60
+ # Start the test for scenario examples
61
+ def before_table_row(table_row)
62
+ if @scenario_outline && !@header_row && !@in_multiline_arg
63
+ @row_count += 1
64
+ @tracker.scenario_name = "Example #{@row_count} : #{@scenario_outline_name}"
65
+ start_test
66
+ end
95
67
  end
96
68
 
97
- def before_outline_table(outline_table)
98
- headers = outline_table.headers
99
- rows = outline_table.rows
100
- @current_row = -1
101
- @table = []
102
- rows.each do |element|
103
- row_hash = {}
104
- element.each_with_index do |item, index|
105
- row_hash[headers[index]] = item
69
+ # Stop the test for scenario examples
70
+ def after_table_row(table_row)
71
+ unless @multiline_arg
72
+ if @scenario_outline && !@header_row
73
+ result = test_result(table_row)
74
+ stop_test(result)
106
75
  end
107
- @table << row_hash
76
+ @header_row = false
108
77
  end
109
78
  end
110
79
 
111
- def before_table_row(table_row)
112
- return unless @in_examples
113
- unless @header_row
114
- @scenario_status = :passed
115
- @exception = nil
116
- @tracker.scenario_name = "#{@scenario_outline_name} Example: #{table_row.name}"
117
- AllureRubyAdaptorApi::Builder.start_test(@tracker.feature_name, @tracker.scenario_name, :feature => @tracker.feature_name, :story => @tracker.scenario_name)
118
- @tracker.scenario_started_at = Time.now
119
- post_background_steps if @has_background
120
- @current_row += 1
121
- @example_before_steps.each do |step|
122
- @tracker.step_name = transform_step_name_for_outline(step.name, @current_row)
123
- AllureRubyAdaptorApi::Builder.start_step(@tracker.feature_name, @tracker.scenario_name, @tracker.step_name)
124
- attach_multiline_arg(step.multiline_arg)
125
- end
80
+ def before_test_step(test_step)
81
+ if !TEST_HOOK_NAMES_TO_IGNORE.include?(test_step.name)
82
+ if @tracker.scenario_name
83
+ @tracker.step_name = test_step.name
84
+ start_step
85
+ else
86
+ @deferred_before_test_steps << {:step => test_step, :timestamp => Time.now}
87
+ end
126
88
  end
127
89
  end
128
90
 
129
- def after_table_row(table_row)
130
- return unless @in_examples or Cucumber::Ast::OutlineTable::ExampleRow === table_row
131
- unless @header_row
132
- @example_after_steps.each do |step|
133
- @tracker.step_name = transform_step_name_for_outline(step.name, @current_row)
134
- if table_row.status == :failed
135
- @exception = table_row.exception
136
- @scenario_status = :failed
137
- end
138
- AllureRubyAdaptorApi::Builder.stop_step(@tracker.feature_name, @tracker.scenario_name, @tracker.step_name, step.status.to_sym)
91
+ def after_test_step(test_step, result)
92
+ if !TEST_HOOK_NAMES_TO_IGNORE.include?(test_step.name)
93
+ if @tracker.scenario_name
94
+ status = step_status(result)
95
+ stop_step(status)
96
+ else
97
+ @deferred_after_test_steps << {:step => test_step, :result => result, :timestamp => Time.now}
139
98
  end
140
- AllureRubyAdaptorApi::Builder.stop_test(@tracker.feature_name, @tracker.scenario_name, {:status => @scenario_status, :exception => @exception, :started_at => @tracker.scenario_started_at, :finished_at => Time.now })
141
99
  end
142
- @header_row = false if @header_row
143
100
  end
144
101
 
145
- def after_outline_table(*args)
146
- @in_examples = false
147
- end
148
-
102
+ # Stop the suite
149
103
  def after_feature(feature)
150
104
  AllureRubyAdaptorApi::Builder.stop_suite(@tracker.feature_name)
151
105
  end
@@ -154,35 +108,96 @@ module AllureCucumber
154
108
  AllureRubyAdaptorApi::Builder.build!
155
109
  end
156
110
 
111
+ def before_multiline_arg(multiline_arg)
112
+ @in_multiline_arg = true
113
+ # For background steps defer multiline attachment
114
+ if @tracker.scenario_name.nil?
115
+ @deferred_before_test_steps[-1].merge!({:multiline_arg => multiline_arg})
116
+ else
117
+ attach_multiline_arg_to_file(multiline_arg)
118
+ end
119
+ end
120
+
121
+ def after_multiline_arg(multiline_arg)
122
+ @in_multiline_arg = false
123
+ end
124
+
157
125
  private
126
+
127
+ def step_status(result)
128
+ POSSIBLE_STATUSES.each do |status|
129
+ return cucumber_status_to_allure_status(status) if result.send("#{status}?")
130
+ end
131
+ end
158
132
 
159
- def transform_step_name_for_outline(step_name, row_num)
160
- transformed_name = ''
161
- @table[row_num].each do |k, v|
162
- transformed_name == '' ? transformed_name = step_name.gsub(k, v) : transformed_name = transformed_name.gsub(k,v)
133
+ def test_result(result)
134
+ status = cucumber_status_to_allure_status(result.status)
135
+ exception = status == 'failed' && result.exception.nil? ? Exception.new("Some steps were undefined") : result.exception
136
+ if exception
137
+ return {:status => status, :exception => exception}
138
+ else
139
+ return {:status => status}
163
140
  end
164
- transformed_name
141
+ end
142
+
143
+ def cucumber_status_to_allure_status(status)
144
+ case status.to_s
145
+ when "undefined"
146
+ return "failed"
147
+ when "skipped"
148
+ return "pending"
149
+ else
150
+ return status.to_s
151
+ end
152
+ end
153
+
154
+ def attach_multiline_arg_to_file(multiline_arg)
155
+ dir = File.expand_path(AllureCucumber::Config.output_dir)
156
+ out_file = "#{dir}/#{UUID.new.generate}.txt"
157
+ File.open(out_file, "w+") { |file| file.write(multiline_arg.to_s.gsub(/\e\[(\d+)(;\d+)*m/,'')) }
158
+ attach_file("multiline_arg", File.open(out_file))
165
159
  end
166
160
 
167
- def attach_multiline_arg(multiline_arg)
168
- if multiline_arg
169
- File.open('tmp_file.txt', 'w'){ |file| file.write(multiline_arg.to_s.gsub(/\e\[(\d+)(;\d+)*m/,'')) }
170
- attach_file("table", File.open('tmp_file.txt'))
161
+ def start_test
162
+ if @tracker.scenario_name
163
+ AllureRubyAdaptorApi::Builder.start_test(@tracker.feature_name, @tracker.scenario_name, :feature => @tracker.feature_name, :story => @tracker.scenario_name)
164
+ post_deferred_steps
171
165
  end
172
166
  end
173
167
 
174
- def post_background_steps
175
- @background_before_steps.each do |step|
176
- @tracker.step_name = "Background : #{step.name}"
177
- AllureRubyAdaptorApi::Builder.start_step(@tracker.feature_name, @tracker.scenario_name, @tracker.step_name)
178
- attach_multiline_arg(step.multiline_arg)
168
+ def post_deferred_steps
169
+ @deferred_before_test_steps.size.times do |index|
170
+ @tracker.step_name = @deferred_before_test_steps[index][:step].name
171
+ start_step
172
+ multiline_arg = @deferred_before_test_steps[index][:multiline_arg]
173
+ attach_multiline_arg_to_file(multiline_arg) if multiline_arg
174
+ if index < @deferred_after_test_steps.size
175
+ result = step_status(@deferred_after_test_steps[index][:result])
176
+ stop_step(result)
177
+ end
179
178
  end
180
- @background_before_steps.each do |step|
181
- @tracker.step_name = "Background : #{step.name}"
182
- AllureRubyAdaptorApi::Builder.stop_step(@tracker.feature_name, @tracker.scenario_name, @tracker.step_name, step.status.to_sym)
183
- attach_multiline_arg(step.multiline_arg)
184
- end
179
+ end
180
+
181
+ def stop_test(result)
182
+ if @deferred_before_test_steps != []
183
+ result[:started_at] = @deferred_before_test_steps[0][:timestamp]
184
+ end
185
+ if @tracker.scenario_name
186
+ AllureRubyAdaptorApi::Builder.stop_test(@tracker.feature_name, @tracker.scenario_name, result)
187
+ @tracker.scenario_name = nil
188
+ @deferred_before_test_steps = []
189
+ @deferred_after_test_steps = []
190
+ end
191
+ end
192
+
193
+ def start_step(step_name = @tracker.step_name)
194
+ AllureRubyAdaptorApi::Builder.start_step(@tracker.feature_name, @tracker.scenario_name, step_name)
195
+ end
196
+
197
+ def stop_step(status, step_name = @tracker.step_name)
198
+ AllureRubyAdaptorApi::Builder.stop_step(@tracker.feature_name, @tracker.scenario_name, step_name, status)
185
199
  end
186
200
 
187
201
  end
188
202
  end
203
+
@@ -1,5 +1,5 @@
1
1
  module AllureCucumber
2
2
  module Version
3
- STRING = '0.4.4'
3
+ STRING = '0.5.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: allure-cucumber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Imran Khan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-04 00:00:00.000000000 Z
11
+ date: 2015-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cucumber
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 2.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 2.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: allure-ruby-adaptor-api
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -104,8 +104,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
104
  version: '0'
105
105
  requirements: []
106
106
  rubyforge_project:
107
- rubygems_version: 2.4.3
107
+ rubygems_version: 2.4.8
108
108
  signing_key:
109
109
  specification_version: 4
110
- summary: allure-cucumber-0.4.4
110
+ summary: allure-cucumber-0.5.0
111
111
  test_files: []