allure-cucumber 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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: []