Skip to content

Commit d7d7f20

Browse files
andrcunsbaev
authored andcommitted
add rspec integration (fixes #3, via #21)
1 parent a348c6c commit d7d7f20

39 files changed

+1019
-181
lines changed

Gemfile.lock

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@ PATH
44
allure-cucumber (2.13.0)
55
allure-ruby-commons (= 2.13.0)
66
cucumber (~> 3.1)
7+
allure-rspec (2.13.0)
8+
allure-ruby-commons (= 2.13.0)
9+
rspec-core (~> 3.8)
710
allure-ruby (2.13.0)
811
allure-cucumber (= 2.13.0)
12+
allure-rspec (= 2.13.0)
913
allure-ruby-commons (= 2.13.0)
1014
allure-ruby-commons (2.13.0)
1115
json (>= 1.8, < 3)

README.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Allure ruby
22

3-
[![Yard Docs](http://img.shields.io/badge/yard-docs-blue.svg)](https://rubydoc.info/github/allure-framework/allure-ruby/master)\
3+
[![Yard Docs](https://img.shields.io/badge/yard-docs-blue.svg)](https://rubydoc.info/github/allure-framework/allure-ruby/master)
44
Ruby testing framework adaptors for generating allure compatible test reports.
55

66
## allure-ruby-commons
@@ -12,7 +12,7 @@ Ruby testing framework adaptors for generating allure compatible test reports.
1212
gem "allure-ruby-commons"
1313
```
1414

15-
[allure-ruby-commons docs](allure-ruby-commons/README.md)
15+
[allure-ruby-commons docs](https://github.com/allure-framework/allure-ruby/blob/master/allure-ruby-commons/README.md)
1616

1717
## allure-cucumber
1818

@@ -23,4 +23,15 @@ gem "allure-ruby-commons"
2323
gem "allure-cucumber"
2424
```
2525

26-
[allure-cucumber docs](allure-cucumber/README.md)
26+
[allure-cucumber docs](https://github.com/allure-framework/allure-ruby/blob/master/allure-cucumber/README.md)
27+
28+
## allure-rspec
29+
30+
[![Gem Version](https://badge.fury.io/rb/allure-rspec.svg)](https://badge.fury.io/rb/allure-rspec)
31+
![Downloads](https://ruby-gem-downloads-badge.herokuapp.com/allure-rspec)
32+
33+
```ruby
34+
gem "allure-cucumber"
35+
```
36+
37+
[allure-rspec docs](https://github.com/allure-framework/allure-ruby/blob/master/allure-rspec/README.md)

allure-cucumber/Rakefile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
require "rspec/core/rake_task"
44
require "rubocop/rake_task"
55

6-
RSpec::Core::RakeTask.new(:test) do |t|
7-
t.rspec_opts = "--color --require spec_helper --format documentation --tag ~reporter"
6+
RSpec::Core::RakeTask.new(:test, :tag) do |t, args|
7+
args[:tag].tap do |tag|
8+
t.rspec_opts = "--color --require spec_helper --format documentation #{tag ? "--tag #{tag}" : ''}"
9+
end
810
end
911

1012
RuboCop::RakeTask.new(:rubocop) do |task|

allure-cucumber/lib/allure_cucumber/cucumber_model.rb

Lines changed: 104 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -10,128 +10,126 @@
1010

1111
module AllureCucumber
1212
# Support class for transforming cucumber test entities in to allure model entities
13-
class AllureCucumberModel
14-
extend AstTransformer
15-
extend TagParser
16-
17-
class << self
18-
# Convert to allure test result
19-
# @param [Cucumber::Core::Test::Case] test_case
20-
# @return [TestResult]
21-
def test_result(test_case)
22-
Allure::TestResult.new(
23-
name: test_case.name,
24-
description: description(test_case),
25-
description_html: description(test_case),
26-
history_id: Digest::MD5.hexdigest(test_case.inspect),
27-
full_name: "#{test_case.feature.name}: #{test_case.name}",
28-
labels: labels(test_case),
29-
links: links(test_case),
30-
parameters: parameters(test_case) || [],
31-
status_details: Allure::StatusDetails.new(**status_detail_tags(test_case.tags.map(&:name))),
32-
)
33-
end
13+
module AllureCucumberModel
14+
include AstTransformer
15+
include TagParser
16+
17+
# Convert to allure test result
18+
# @param [Cucumber::Core::Test::Case] test_case
19+
# @return [TestResult]
20+
def test_result(test_case)
21+
Allure::TestResult.new(
22+
name: test_case.name,
23+
description: description(test_case),
24+
description_html: description(test_case),
25+
history_id: Digest::MD5.hexdigest(test_case.inspect),
26+
full_name: "#{test_case.feature.name}: #{test_case.name}",
27+
labels: labels(test_case),
28+
links: links(test_case),
29+
parameters: parameters(test_case) || [],
30+
status_details: Allure::StatusDetails.new(**status_detail_tags(test_case.tags.map(&:name))),
31+
)
32+
end
3433

35-
# Convert to allure step result
36-
# @param [Cucumber::Core::Test::Step] test_step
37-
# @return [StepResult]
38-
def step_result(test_step)
39-
Allure::StepResult.new(
40-
name: "#{step(test_step).keyword}#{test_step.text}",
41-
attachments: [multiline_arg_attachment(test_step)].compact,
42-
)
43-
end
34+
# Convert to allure step result
35+
# @param [Cucumber::Core::Test::Step] test_step
36+
# @return [StepResult]
37+
def step_result(test_step)
38+
Allure::StepResult.new(
39+
name: "#{step(test_step).keyword}#{test_step.text}",
40+
attachments: [multiline_arg_attachment(test_step)].compact,
41+
)
42+
end
4443

45-
# Convert to allure step result
46-
# @param [Cucumber::Core::Test::Step] test_step
47-
# @return [StepResult]
48-
def fixture_result(test_step)
49-
location = test_step.location.to_s.split("/").last
50-
Allure::FixtureResult.new(name: location)
51-
end
44+
# Convert to allure step result
45+
# @param [Cucumber::Core::Test::Step] test_step
46+
# @return [StepResult]
47+
def fixture_result(test_step)
48+
location = test_step.location.to_s.split("/").last
49+
Allure::FixtureResult.new(name: location)
50+
end
5251

53-
# Get failure details
54-
# @param [Cucumber::Core::Test::Result] result <description>
55-
# @return [Hash<Symbol, String>]
56-
def failure_details(result)
57-
return { message: result.exception.message, trace: result.exception.backtrace.join("\n") } if result.failed?
58-
return { message: result.message, trace: result.backtrace.join("\n") } if result.undefined?
52+
# Get failure details
53+
# @param [Cucumber::Core::Test::Result] result <description>
54+
# @return [Hash<Symbol, String>]
55+
def failure_details(result)
56+
return { message: result.exception.message, trace: result.exception.backtrace.join("\n") } if result.failed?
57+
return { message: result.message, trace: result.backtrace.join("\n") } if result.undefined?
5958

60-
{}
61-
end
59+
{}
60+
end
6261

63-
private
62+
# Get thread specific lifecycle
63+
# @return [Allure::AllureLifecycle]
64+
def lifecycle
65+
Allure.lifecycle
66+
end
6467

65-
# Get thread specific lifecycle
66-
# @return [Allure::AllureLifecycle]
67-
def lifecycle
68-
Allure.lifecycle
68+
private
69+
70+
# @param [Cucumber::Core::Test::Case] test_case
71+
# @return [Array<Allure::Label>]
72+
def labels(test_case)
73+
labels = []
74+
labels << Allure::ResultUtils.framework_label("cucumber")
75+
labels << Allure::ResultUtils.feature_label(test_case.feature.name)
76+
labels << Allure::ResultUtils.package_label(test_case.feature.name)
77+
labels << Allure::ResultUtils.suite_label(test_case.feature.name)
78+
labels << Allure::ResultUtils.story_label(test_case.name)
79+
labels << Allure::ResultUtils.test_class_label(test_case.name)
80+
unless test_case.tags.empty?
81+
labels.push(*tag_labels(test_case.tags))
82+
labels << severity(test_case.tags)
6983
end
7084

71-
# @param [Cucumber::Core::Test::Case] test_case
72-
# @return [Array<Allure::Label>]
73-
def labels(test_case)
74-
labels = []
75-
labels << Allure::ResultUtils.framework_label("cucumber")
76-
labels << Allure::ResultUtils.feature_label(test_case.feature.name)
77-
labels << Allure::ResultUtils.package_label(test_case.feature.name)
78-
labels << Allure::ResultUtils.suite_label(test_case.feature.name)
79-
labels << Allure::ResultUtils.story_label(test_case.name)
80-
labels << Allure::ResultUtils.test_class_label(test_case.name)
81-
unless test_case.tags.empty?
82-
labels.push(*tag_labels(test_case.tags))
83-
labels << severity(test_case.tags)
84-
end
85-
86-
labels
87-
end
85+
labels
86+
end
8887

89-
# @param [Cucumber::Core::Test::Case] test_case
90-
# @return [Array<Allure::Link>]
91-
def links(test_case)
92-
return [] unless test_case.tags
88+
# @param [Cucumber::Core::Test::Case] test_case
89+
# @return [Array<Allure::Link>]
90+
def links(test_case)
91+
return [] unless test_case.tags
9392

94-
tms_links(test_case.tags) + issue_links(test_case.tags)
95-
end
93+
tms_links(test_case.tags) + issue_links(test_case.tags)
94+
end
9695

97-
# @param [Cucumber::Core::Test::Case] test_case
98-
# @return [Array<Allure::Parameter>]
99-
def parameters(test_case)
100-
example_row(test_case)&.values&.map { |value| Allure::Parameter.new("argument", value) }
101-
end
96+
# @param [Cucumber::Core::Test::Case] test_case
97+
# @return [Array<Allure::Parameter>]
98+
def parameters(test_case)
99+
example_row(test_case)&.values&.map { |value| Allure::Parameter.new("argument", value) }
100+
end
102101

103-
# @param [Cucumber::Core::Test::Case] test_case
104-
# @return [String]
105-
def description(test_case)
106-
scenario = scenario(test_case)
107-
scenario.description.empty? ? "Location - #{scenario.file_colon_line}" : scenario.description.strip
108-
end
102+
# @param [Cucumber::Core::Test::Case] test_case
103+
# @return [String]
104+
def description(test_case)
105+
scenario = scenario(test_case)
106+
scenario.description.empty? ? "Location - #{scenario.file_colon_line}" : scenario.description.strip
107+
end
109108

110-
# @param [Cucumber::Core::Test::Step] test_step
111-
# @return [Allure::Attachment]
112-
def multiline_arg_attachment(test_step)
113-
arg = multiline_arg(test_step)
114-
return unless arg
109+
# @param [Cucumber::Core::Test::Step] test_step
110+
# @return [Allure::Attachment]
111+
def multiline_arg_attachment(test_step)
112+
arg = multiline_arg(test_step)
113+
return unless arg
115114

116-
arg.data_table? ? data_table_attachment(arg) : docstring_attachment(arg)
117-
end
115+
arg.data_table? ? data_table_attachment(arg) : docstring_attachment(arg)
116+
end
118117

119-
# @param [Cucumber::Core::Ast::DataTable] multiline_arg
120-
# @return [Allure::Attachment]
121-
def data_table_attachment(multiline_arg)
122-
attachment = lifecycle.prepare_attachment("data-table", Allure::ContentType::CSV)
123-
csv = multiline_arg.raw.each_with_object([]) { |row, arr| arr.push(row.to_csv) }.join("")
124-
lifecycle.write_attachment(csv, attachment)
125-
attachment
126-
end
118+
# @param [Cucumber::Core::Ast::DataTable] multiline_arg
119+
# @return [Allure::Attachment]
120+
def data_table_attachment(multiline_arg)
121+
attachment = lifecycle.prepare_attachment("data-table", Allure::ContentType::CSV)
122+
csv = multiline_arg.raw.each_with_object([]) { |row, arr| arr.push(row.to_csv) }.join("")
123+
lifecycle.write_attachment(csv, attachment)
124+
attachment
125+
end
127126

128-
# @param [String] multiline_arg
129-
# @return [String]
130-
def docstring_attachment(multiline_arg)
131-
attachment = lifecycle.prepare_attachment("docstring", Allure::ContentType::TXT)
132-
lifecycle.write_attachment(multiline_arg.content, attachment)
133-
attachment
134-
end
127+
# @param [String] multiline_arg
128+
# @return [String]
129+
def docstring_attachment(multiline_arg)
130+
attachment = lifecycle.prepare_attachment("docstring", Allure::ContentType::TXT)
131+
lifecycle.write_attachment(multiline_arg.content, attachment)
132+
attachment
135133
end
136134
end
137135
end

allure-cucumber/lib/allure_cucumber/formatter.rb

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
# frozen_string_literal: true
22

3-
require "fileutils"
43
require_relative "cucumber_model"
54

65
module AllureCucumber
76
# Main formatter class. Translates cucumber event to allure lifecycle
87
class CucumberFormatter
8+
include AllureCucumberModel
9+
910
# @return [Hash] hook handler methods
1011
HOOK_HANDLERS = {
1112
"Before hook" => :start_prepare_fixture,
@@ -22,20 +23,28 @@ class CucumberFormatter
2223
def initialize(config)
2324
Allure.configure do |c|
2425
c.results_directory = config.out_stream if config.out_stream.is_a?(String)
25-
FileUtils.rm_f(Dir.glob("#{c.results_directory}/*")) if c.clean_results_directory
2626
end
27+
28+
config.on_event(:test_run_started, &method(:on_test_run_started))
2729
config.on_event(:test_case_started, &method(:on_test_case_started))
2830
config.on_event(:test_step_started, &method(:on_test_step_started))
2931
config.on_event(:test_step_finished, &method(:on_test_step_finished))
3032
config.on_event(:test_case_finished, &method(:on_test_case_finished))
3133
end
3234

35+
# Clean test result directory before starting run
36+
# @param [Cucumber::Events::TestRunStarted<Type>] _event
37+
# @return [void]
38+
def on_test_run_started(_event)
39+
lifecycle.clean_results_dir
40+
end
41+
3342
# Handle test case started event
3443
# @param [Cucumber::Core::Events::TestCaseStarted] event
3544
# @return [void]
3645
def on_test_case_started(event)
3746
lifecycle.start_test_container(Allure::TestResultContainer.new(name: event.test_case.name))
38-
lifecycle.start_test_case(AllureCucumberModel.test_result(event.test_case))
47+
lifecycle.start_test_case(test_result(event.test_case))
3948
end
4049

4150
# Handle test step started event
@@ -65,7 +74,7 @@ def on_test_step_finished(event)
6574
# @param [Cucumber::Core::Events::TestCaseFinished] event
6675
# @return [void]
6776
def on_test_case_finished(event)
68-
failure_details = AllureCucumberModel.failure_details(event.result)
77+
failure_details = failure_details(event.result)
6978
status = ALLURE_STATUS.fetch(event.result.to_sym, Allure::Status::BROKEN)
7079
lifecycle.update_test_case do |test_case|
7180
test_case.stage = Allure::Stage::FINISHED
@@ -80,12 +89,6 @@ def on_test_case_finished(event)
8089

8190
private
8291

83-
# Get thread specific lifecycle
84-
# @return [Allure::AllureLifecycle]
85-
def lifecycle
86-
Allure.lifecycle
87-
end
88-
8992
# @param [Cucumber::Core::Test::Step] test_step <description>
9093
# @return [Boolean]
9194
def hook?(test_step)
@@ -101,15 +104,15 @@ def prepare_world_hook?(test_step)
101104
# @param [Cucumber::Core::Test::Step] test_step
102105
# @return [void]
103106
def handle_step_started(test_step)
104-
lifecycle.start_test_step(AllureCucumberModel.step_result(test_step))
107+
lifecycle.start_test_step(step_result(test_step))
105108
end
106109

107110
# @param [Cucumber::Core::Test::Step] test_step
108111
# @return [void]
109112
def handle_hook_started(test_step)
110113
return if prepare_world_hook?(test_step)
111114

112-
lifecycle.public_send(HOOK_HANDLERS[test_step.text], AllureCucumberModel.fixture_result(test_step))
115+
lifecycle.public_send(HOOK_HANDLERS[test_step.text], fixture_result(test_step))
113116
end
114117
end
115118
end

allure-cucumber/spec/integration/full_report_spec.rb

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
describe "allure-cucumber" do
44
include_context "cucumber runner"
55

6-
let(:allure_cli) { Allure::Util.allure_cli }
76
let(:results_dir) { Allure::Config.results_directory }
87

98
it "Generates allure json results files", integration: true do
@@ -25,12 +24,4 @@
2524
expect(result_json[:steps].size).to eq(4)
2625
end
2726
end
28-
29-
it "Allure commandline generates report", reporter: true do
30-
run_cucumber_cli("features/features")
31-
32-
expect(`#{allure_cli} generate -c #{results_dir} -o reports/allure-report`.chomp).to(
33-
eq("Report successfully generated to reports/allure-report"),
34-
)
35-
end
3627
end

0 commit comments

Comments
 (0)