allure-cucumber 2.13.4 → 2.13.5.rc.1
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/README.md +8 -2
- data/lib/allure-cucumber.rb +1 -1
- data/lib/allure_cucumber/formatter.rb +25 -29
- data/lib/allure_cucumber/models/cucumber_model.rb +130 -0
- data/lib/allure_cucumber/models/scenario.rb +103 -0
- data/lib/allure_cucumber/models/step.rb +33 -0
- data/lib/allure_cucumber/{tag_parser.rb → models/tag_parser.rb} +11 -13
- metadata +14 -13
- data/lib/allure_cucumber/ast_transformer.rb +0 -40
- data/lib/allure_cucumber/cucumber_model.rb +0 -135
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 660dd75c5884bb993804ca888ccb2babc2e997bf38a3c4c12105dfffe9948394
|
4
|
+
data.tar.gz: 06fd91978393b639e8d92b6b87b7ce752778d254a5a50caf19565d34fefd9f31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dec76bf5806c56bfaa484797b2e27e794dae083ab48cbd741e654cd72adf9e19e280723be0d96c3a6b218c826dc4caa757883e22427eb81273ea39f1bca561b6
|
7
|
+
data.tar.gz: 2fdc18e522ead6101e5fab6d73e973861bc576167a778b268cc3eaf32e0e45a9866df8f93860705c09c33cd2dfbe04694bb6258508414578f32fa193e40badd0
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# Allure Cucumber Adaptor
|
2
|
+
|
2
3
|
[](https://www.rubydoc.info/gems/allure-cucumber)
|
3
4
|
|
4
5
|
This repository contains Allure adaptor for [Cucumber](http://cukes.info/) framework.
|
@@ -14,15 +15,20 @@ gem 'allure-cucumber'
|
|
14
15
|
And then execute:
|
15
16
|
|
16
17
|
```bash
|
17
|
-
|
18
|
+
bundle
|
18
19
|
```
|
19
20
|
|
20
21
|
Or install it yourself as:
|
21
22
|
|
22
23
|
```bash
|
23
|
-
|
24
|
+
gem install allure-cucumber
|
24
25
|
```
|
25
26
|
|
27
|
+
## Cucumber versions
|
28
|
+
|
29
|
+
allure-cucumber versions <= 2.13.4 support only cucumber 3 and lower\
|
30
|
+
allure-cucumber versions >= 2.13.5 only support cucumber 4 and are not backwards compatible with cucumber 3 and lower
|
31
|
+
|
26
32
|
## Configuration
|
27
33
|
|
28
34
|
Common allure configuration is set via `Allure.configure` method. To change id, add the following in `features/support/env.rb` file:
|
data/lib/allure-cucumber.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require "cucumber/core"
|
4
|
+
|
5
|
+
require_relative "models/cucumber_model"
|
4
6
|
|
5
7
|
module AllureCucumber
|
6
8
|
# Main formatter class. Translates cucumber event to allure lifecycle
|
7
9
|
class CucumberFormatter
|
8
|
-
include AllureCucumberModel
|
9
|
-
|
10
10
|
# @return [Hash] hook handler methods
|
11
11
|
HOOK_HANDLERS = {
|
12
12
|
"Before hook" => :start_prepare_fixture,
|
@@ -25,6 +25,8 @@ module AllureCucumber
|
|
25
25
|
c.results_directory = config.out_stream if config.out_stream.is_a?(String)
|
26
26
|
end
|
27
27
|
|
28
|
+
@cucumber_model = AllureCucumberModel.new(config)
|
29
|
+
|
28
30
|
config.on_event(:test_run_started, &method(:on_test_run_started))
|
29
31
|
config.on_event(:test_case_started, &method(:on_test_case_started))
|
30
32
|
config.on_event(:test_step_started, &method(:on_test_step_started))
|
@@ -33,48 +35,46 @@ module AllureCucumber
|
|
33
35
|
end
|
34
36
|
|
35
37
|
# Clean test result directory before starting run
|
36
|
-
# @param [Cucumber::Events::TestRunStarted
|
38
|
+
# @param [Cucumber::Events::TestRunStarted] _event
|
37
39
|
# @return [void]
|
38
40
|
def on_test_run_started(_event)
|
39
41
|
lifecycle.clean_results_dir
|
40
42
|
end
|
41
43
|
|
42
44
|
# Handle test case started event
|
43
|
-
# @param [Cucumber::
|
45
|
+
# @param [Cucumber::Events::TestCaseStarted] event
|
44
46
|
# @return [void]
|
45
47
|
def on_test_case_started(event)
|
46
48
|
lifecycle.start_test_container(Allure::TestResultContainer.new(name: event.test_case.name))
|
47
|
-
lifecycle.start_test_case(test_result(event.test_case))
|
49
|
+
lifecycle.start_test_case(cucumber_model.test_result(event.test_case))
|
48
50
|
end
|
49
51
|
|
50
52
|
# Handle test step started event
|
51
|
-
# @param [Cucumber::
|
53
|
+
# @param [Cucumber::Events::TestStepStarted] event
|
52
54
|
# @return [void]
|
53
55
|
def on_test_step_started(event)
|
54
|
-
|
56
|
+
event.test_step.hook? ? handle_hook_started(event.test_step) : handle_step_started(event.test_step)
|
55
57
|
end
|
56
58
|
|
57
59
|
# Handle test step finished event
|
58
|
-
# @param [Cucumber::
|
60
|
+
# @param [Cucumber::Events::TestStepFinished] event
|
59
61
|
# @return [void]
|
60
62
|
def on_test_step_finished(event)
|
61
|
-
return if prepare_world_hook?(event.test_step)
|
62
|
-
|
63
63
|
update_block = proc do |step|
|
64
64
|
step.stage = Allure::Stage::FINISHED
|
65
65
|
step.status = ALLURE_STATUS.fetch(event.result.to_sym, Allure::Status::BROKEN)
|
66
66
|
end
|
67
|
-
step_type =
|
67
|
+
step_type = event.test_step.hook? ? "fixture" : "test_step"
|
68
68
|
|
69
69
|
lifecycle.public_send("update_#{step_type}", &update_block)
|
70
70
|
lifecycle.public_send("stop_#{step_type}")
|
71
71
|
end
|
72
72
|
|
73
73
|
# Handle test case finished event
|
74
|
-
# @param [Cucumber::
|
74
|
+
# @param [Cucumber::Events::TestCaseFinished] event
|
75
75
|
# @return [void]
|
76
76
|
def on_test_case_finished(event)
|
77
|
-
failure_details = failure_details(event.result)
|
77
|
+
failure_details = cucumber_model.failure_details(event.result)
|
78
78
|
status = ALLURE_STATUS.fetch(event.result.to_sym, Allure::Status::BROKEN)
|
79
79
|
lifecycle.update_test_case do |test_case|
|
80
80
|
test_case.stage = Allure::Stage::FINISHED
|
@@ -89,30 +89,26 @@ module AllureCucumber
|
|
89
89
|
|
90
90
|
private
|
91
91
|
|
92
|
-
|
93
|
-
# @return [Boolean]
|
94
|
-
def hook?(test_step)
|
95
|
-
HOOK_HANDLERS.key?(test_step.text)
|
96
|
-
end
|
92
|
+
attr_accessor :cucumber_model
|
97
93
|
|
98
|
-
#
|
99
|
-
# @return [
|
100
|
-
def
|
101
|
-
|
94
|
+
# Get thread specific lifecycle
|
95
|
+
# @return [Allure::AllureLifecycle]
|
96
|
+
def lifecycle
|
97
|
+
Allure.lifecycle
|
102
98
|
end
|
103
99
|
|
104
100
|
# @param [Cucumber::Core::Test::Step] test_step
|
105
101
|
# @return [void]
|
106
102
|
def handle_step_started(test_step)
|
107
|
-
|
103
|
+
step = cucumber_model.step_result(test_step)
|
104
|
+
lifecycle.start_test_step(step[:allure_step])
|
105
|
+
step[:attachments].each { |att| lifecycle.write_attachment(att[:source], att[:allure_attachment]) }
|
108
106
|
end
|
109
107
|
|
110
|
-
# @param [Cucumber::Core::Test::
|
108
|
+
# @param [Cucumber::Core::Test::HookStep] hook_step
|
111
109
|
# @return [void]
|
112
|
-
def handle_hook_started(
|
113
|
-
|
114
|
-
|
115
|
-
lifecycle.public_send(HOOK_HANDLERS[test_step.text], fixture_result(test_step))
|
110
|
+
def handle_hook_started(hook_step)
|
111
|
+
lifecycle.public_send(HOOK_HANDLERS[hook_step.text], cucumber_model.fixture_result(hook_step))
|
116
112
|
end
|
117
113
|
end
|
118
114
|
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "csv"
|
4
|
+
require "cucumber/core"
|
5
|
+
require "cucumber/formatter/ast_lookup"
|
6
|
+
|
7
|
+
require_relative "scenario"
|
8
|
+
require_relative "step"
|
9
|
+
require_relative "tag_parser"
|
10
|
+
|
11
|
+
module AllureCucumber
|
12
|
+
# Support class for transforming cucumber test entities in to allure model entities
|
13
|
+
class AllureCucumberModel
|
14
|
+
include TagParser
|
15
|
+
|
16
|
+
# @param [Cucumber::Configuration] config
|
17
|
+
def initialize(config)
|
18
|
+
@ast_lookup = Cucumber::Formatter::AstLookup.new(config)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Convert to allure test result
|
22
|
+
# @param [Cucumber::Core::Test::Case] test_case
|
23
|
+
# @return [Allure::TestResult]
|
24
|
+
def test_result(test_case)
|
25
|
+
scenario = Scenario.new(test_case, ast_lookup)
|
26
|
+
|
27
|
+
Allure::TestResult.new(
|
28
|
+
name: scenario.name,
|
29
|
+
description: scenario.description,
|
30
|
+
description_html: scenario.description,
|
31
|
+
history_id: scenario.id,
|
32
|
+
full_name: "#{scenario.feature_name}: #{scenario.name}",
|
33
|
+
labels: labels(scenario),
|
34
|
+
links: links(scenario),
|
35
|
+
parameters: parameters(scenario),
|
36
|
+
status_details: Allure::StatusDetails.new(**status_detail_tags(scenario.tags)),
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Convert to allure step result
|
41
|
+
# @param [Cucumber::Core::Test::Step] test_step
|
42
|
+
# @return [Hash]
|
43
|
+
def step_result(test_step)
|
44
|
+
step = Step.new(ast_lookup.step_source(test_step))
|
45
|
+
attachments = step_attachments(step)
|
46
|
+
allure_step = Allure::StepResult.new(
|
47
|
+
name: step.name,
|
48
|
+
attachments: attachments.map { |att| att[:allure_attachment] },
|
49
|
+
)
|
50
|
+
|
51
|
+
{ allure_step: allure_step, attachments: attachments }
|
52
|
+
end
|
53
|
+
|
54
|
+
# Convert to allure step result
|
55
|
+
# @param [Cucumber::Core::Test::HookStep] hook_step
|
56
|
+
# @return [Allure::StepResult]
|
57
|
+
def fixture_result(hook_step)
|
58
|
+
Allure::FixtureResult.new(name: hook_step.location.to_s.split("/").last)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Get failure details
|
62
|
+
# @param [Cucumber::Core::Test::Result] result
|
63
|
+
# @return [Hash<Symbol, String>]
|
64
|
+
def failure_details(result)
|
65
|
+
return { message: result.exception.message, trace: result.exception.backtrace.join("\n") } if result.failed?
|
66
|
+
return { message: result.message, trace: result.backtrace.join("\n") } if result.undefined?
|
67
|
+
|
68
|
+
{}
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
attr_reader :ast_lookup, :lifecycle
|
74
|
+
|
75
|
+
# @param [Scenario] scenario
|
76
|
+
# @return [Array<Allure::Label>]
|
77
|
+
def labels(scenario)
|
78
|
+
labels = []
|
79
|
+
labels << Allure::ResultUtils.framework_label("cucumber")
|
80
|
+
labels << Allure::ResultUtils.feature_label(scenario.feature_name)
|
81
|
+
labels << Allure::ResultUtils.package_label(scenario.feature_folder)
|
82
|
+
labels << Allure::ResultUtils.suite_label(scenario.feature_name)
|
83
|
+
labels << Allure::ResultUtils.story_label(scenario.name)
|
84
|
+
labels << Allure::ResultUtils.test_class_label(scenario.feature_file_name)
|
85
|
+
unless scenario.tags.empty?
|
86
|
+
labels.push(*tag_labels(scenario.tags))
|
87
|
+
labels << severity(scenario.tags)
|
88
|
+
end
|
89
|
+
|
90
|
+
labels
|
91
|
+
end
|
92
|
+
|
93
|
+
# @param [Cucumber::Core::Test::Case] test_case
|
94
|
+
# @return [Array<Allure::Link>]
|
95
|
+
def links(test_case)
|
96
|
+
tms_links(test_case.tags) + issue_links(test_case.tags)
|
97
|
+
end
|
98
|
+
|
99
|
+
# @param [AllureCucumber::Scenario] scenario
|
100
|
+
# @return [Array<Allure::Parameter>]
|
101
|
+
def parameters(scenario)
|
102
|
+
scenario.examples.map { |k, v| Allure::Parameter.new(k, v) }
|
103
|
+
end
|
104
|
+
|
105
|
+
# @param [Step] step
|
106
|
+
# @return [Array<Allure::Attachment>]
|
107
|
+
def step_attachments(step)
|
108
|
+
[data_table_attachment(step), docstring_attachment(step)].compact
|
109
|
+
end
|
110
|
+
|
111
|
+
# @param [Step] step
|
112
|
+
# @return [Allure::Attachment]
|
113
|
+
def data_table_attachment(step)
|
114
|
+
return unless step.data_table
|
115
|
+
|
116
|
+
attachment = Allure::ResultUtils.prepare_attachment("data-table", Allure::ContentType::CSV)
|
117
|
+
csv = step.data_table.rows.each_with_object([]) { |row, arr| arr.push(row.cells.map(&:value).to_csv) }.join("")
|
118
|
+
{ source: csv, allure_attachment: attachment }
|
119
|
+
end
|
120
|
+
|
121
|
+
# @param [Step] step
|
122
|
+
# @return [String]
|
123
|
+
def docstring_attachment(step)
|
124
|
+
return unless step.doc_string
|
125
|
+
|
126
|
+
attachment = Allure::ResultUtils.prepare_attachment("docstring", Allure::ContentType::TXT)
|
127
|
+
{ source: step.doc_string.content, allure_attachment: attachment }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "digest"
|
4
|
+
|
5
|
+
module AllureCucumber
|
6
|
+
# Cucumber scenario wrapper class
|
7
|
+
class Scenario
|
8
|
+
# @param [Cucumber::Core::Test::Case] test_case
|
9
|
+
# @param [Cucumber::Formatter::AstLookup] ast_lookup
|
10
|
+
def initialize(test_case, ast_lookup)
|
11
|
+
@test_case = test_case
|
12
|
+
@feature = ast_lookup.gherkin_document(test_case.location.file).feature
|
13
|
+
@scenario_source = ast_lookup.scenario_source(test_case)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Unique scenario id
|
17
|
+
# @return [String]
|
18
|
+
def id
|
19
|
+
@id ||= Digest::MD5.hexdigest(test_case.inspect)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Feature name scenario belongs to
|
23
|
+
# @return [String]
|
24
|
+
def feature_name
|
25
|
+
@feature_name ||= feature.name
|
26
|
+
end
|
27
|
+
|
28
|
+
# Scenario name
|
29
|
+
# @return [String]
|
30
|
+
def name
|
31
|
+
@name ||= scenario_outline? ? "#{scenario.name}, #{example_row}" : scenario.name
|
32
|
+
end
|
33
|
+
|
34
|
+
# Scenario description or it's location
|
35
|
+
# @return [String]
|
36
|
+
def description
|
37
|
+
@description ||= begin
|
38
|
+
scenario.description.empty? ? "Location - #{test_case.location}" : scenario.description.strip
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Scenario outline row parameters
|
43
|
+
# @return [Hash<String, String>]
|
44
|
+
def examples
|
45
|
+
@examples ||= scenario_outline? ? outline_parameters : {}
|
46
|
+
end
|
47
|
+
|
48
|
+
# Scenario tags
|
49
|
+
# @return [Array<String>]
|
50
|
+
def tags
|
51
|
+
@tags ||= test_case.tags.map(&:name)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Feature file name
|
55
|
+
# @return [String]
|
56
|
+
def feature_file_name
|
57
|
+
@feature_file_name ||= test_case.location.file.split("/").last.gsub(".feature", "")
|
58
|
+
end
|
59
|
+
|
60
|
+
# Feature folder
|
61
|
+
# @return [String]
|
62
|
+
def feature_folder
|
63
|
+
@feature_folder ||= test_case.location.file.split("/")[-2]
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
attr_reader :test_case, :scenario_source, :feature
|
69
|
+
|
70
|
+
# Is scenario outline
|
71
|
+
# @return [Boolean]
|
72
|
+
def scenario_outline?
|
73
|
+
scenario_source.type == :ScenarioOutline
|
74
|
+
end
|
75
|
+
|
76
|
+
# Cucumber scenario object
|
77
|
+
# @return [
|
78
|
+
# Cucumber::Messages::GherkinDocument::Feature::Scenario,
|
79
|
+
# Cucumber::Messages::GherkinDocument::Feature::ScenarioOutline
|
80
|
+
# ]
|
81
|
+
def scenario
|
82
|
+
@scenario ||= scenario_outline? ? scenario_source.scenario_outline : scenario_source.scenario
|
83
|
+
end
|
84
|
+
|
85
|
+
# Scenario outline example row
|
86
|
+
# @return [String]
|
87
|
+
def example_row
|
88
|
+
@example_row ||= begin
|
89
|
+
"Examples (##{scenario_source.examples.table_body.index { |row| row.id == scenario_source.row.id } + 1})"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Scenario outline row parameters
|
94
|
+
# @return [Hash<String, String>]
|
95
|
+
def outline_parameters
|
96
|
+
@outline_parameters ||= begin
|
97
|
+
names = scenario_source.examples.table_header.cells.map(&:value)
|
98
|
+
values = scenario_source.row.cells.map(&:value)
|
99
|
+
names.zip(values).to_h
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AllureCucumber
|
4
|
+
# Cucumber step wrapper class
|
5
|
+
class Step
|
6
|
+
# @param [Cucumber::Formatter::AstLookup::StepSource] step_source
|
7
|
+
def initialize(step_source)
|
8
|
+
@step = step_source.step
|
9
|
+
end
|
10
|
+
|
11
|
+
# Step name
|
12
|
+
# @return [String]
|
13
|
+
def name
|
14
|
+
@name ||= "#{step.keyword}#{step.text}"
|
15
|
+
end
|
16
|
+
|
17
|
+
# Step data table
|
18
|
+
# @return [Cucumber::Messages::GherkinDocument::Feature::Step::DataTable]
|
19
|
+
def data_table
|
20
|
+
@data_table ||= step.data_table
|
21
|
+
end
|
22
|
+
|
23
|
+
# Step docstring
|
24
|
+
# @return [String]
|
25
|
+
def doc_string
|
26
|
+
@doc_string ||= step.doc_string
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :step
|
32
|
+
end
|
33
|
+
end
|
@@ -1,19 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "config"
|
4
|
-
|
5
3
|
module AllureCucumber
|
6
4
|
# Cucumber tag parser helper methods
|
7
5
|
module TagParser
|
8
|
-
# @param [Array<
|
6
|
+
# @param [Array<String>] tags
|
9
7
|
# @return [Array<Allure::Label>]
|
10
8
|
def tag_labels(tags)
|
11
9
|
tags
|
12
|
-
.reject { |tag| reserved?(tag
|
13
|
-
.map { |tag| Allure::ResultUtils.tag_label(tag.
|
10
|
+
.reject { |tag| reserved?(tag) }
|
11
|
+
.map { |tag| Allure::ResultUtils.tag_label(tag.delete_prefix("@")) }
|
14
12
|
end
|
15
13
|
|
16
|
-
# @param [Array<
|
14
|
+
# @param [Array<String>] tags
|
17
15
|
# @return [Array<Allure::Link>]
|
18
16
|
def tms_links(tags)
|
19
17
|
return [] unless Allure::Config.link_tms_pattern
|
@@ -21,7 +19,7 @@ module AllureCucumber
|
|
21
19
|
matching_links(tags, :tms)
|
22
20
|
end
|
23
21
|
|
24
|
-
# @param [Array<
|
22
|
+
# @param [Array<String>] tags
|
25
23
|
# @return [Array<Allure::Link>]
|
26
24
|
def issue_links(tags)
|
27
25
|
return [] unless Allure::Config.link_issue_pattern
|
@@ -29,18 +27,18 @@ module AllureCucumber
|
|
29
27
|
matching_links(tags, :issue)
|
30
28
|
end
|
31
29
|
|
32
|
-
# @param [Array<
|
30
|
+
# @param [Array<String>] tags
|
33
31
|
# @return [Allure::Label]
|
34
32
|
def severity(tags)
|
35
33
|
severity_pattern = reserved_patterns[:severity]
|
36
34
|
severity = tags
|
37
|
-
.detect { |tag| tag.
|
35
|
+
.detect { |tag| tag.match?(severity_pattern) }
|
38
36
|
&.match(severity_pattern)&.[](:severity) || "normal"
|
39
37
|
|
40
38
|
Allure::ResultUtils.severity_label(severity)
|
41
39
|
end
|
42
40
|
|
43
|
-
# @param [Array<
|
41
|
+
# @param [Array<String>] tags
|
44
42
|
# @return [Hash<Symbol, Boolean>]
|
45
43
|
def status_detail_tags(tags)
|
46
44
|
{
|
@@ -52,14 +50,14 @@ module AllureCucumber
|
|
52
50
|
|
53
51
|
private
|
54
52
|
|
55
|
-
# @param [Array<
|
53
|
+
# @param [Array<String>] tags
|
56
54
|
# @param [Symbol] type
|
57
55
|
# @return [Array<Allure::Link>]
|
58
56
|
def matching_links(tags, type)
|
59
57
|
pattern = reserved_patterns[type]
|
60
58
|
tags
|
61
|
-
.select { |tag| tag.
|
62
|
-
.map { |tag| tag.
|
59
|
+
.select { |tag| tag.match?(pattern) }
|
60
|
+
.map { |tag| tag.match(pattern) { |match| Allure::ResultUtils.public_send("#{type}_link", match[type]) } }
|
63
61
|
end
|
64
62
|
|
65
63
|
# @return [Hash<Symbol, Regexp>]
|
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: 2.13.
|
4
|
+
version: 2.13.5.rc.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrejs Cunskis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: allure-ruby-commons
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.13.
|
19
|
+
version: 2.13.5.rc.1
|
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: 2.13.
|
26
|
+
version: 2.13.5.rc.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: cucumber
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 4.0.0.rc5
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 4.0.0.rc5
|
41
41
|
description: Cucumber adaptor to generate rich allure test reports
|
42
42
|
email: andrejs.cunskis@gmail.com
|
43
43
|
executables: []
|
@@ -46,11 +46,12 @@ extra_rdoc_files: []
|
|
46
46
|
files:
|
47
47
|
- README.md
|
48
48
|
- lib/allure-cucumber.rb
|
49
|
-
- lib/allure_cucumber/ast_transformer.rb
|
50
49
|
- lib/allure_cucumber/config.rb
|
51
|
-
- lib/allure_cucumber/cucumber_model.rb
|
52
50
|
- lib/allure_cucumber/formatter.rb
|
53
|
-
- lib/allure_cucumber/
|
51
|
+
- lib/allure_cucumber/models/cucumber_model.rb
|
52
|
+
- lib/allure_cucumber/models/scenario.rb
|
53
|
+
- lib/allure_cucumber/models/step.rb
|
54
|
+
- lib/allure_cucumber/models/tag_parser.rb
|
54
55
|
homepage: https://github.com/allure-framework/allure-ruby
|
55
56
|
licenses:
|
56
57
|
- Apache-2.0
|
@@ -71,9 +72,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
71
72
|
version: 2.5.0
|
72
73
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
74
|
requirements:
|
74
|
-
- - "
|
75
|
+
- - ">"
|
75
76
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
77
|
+
version: 1.3.1
|
77
78
|
requirements: []
|
78
79
|
rubygems_version: 3.1.2
|
79
80
|
signing_key:
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module AllureCucumber
|
4
|
-
# Cucumber::Core::Ast is removed in cucumber-core 4.0 version.
|
5
|
-
# This will have to be updated accordingly, once stable version rolls out
|
6
|
-
module AstTransformer
|
7
|
-
# Get scenario object
|
8
|
-
# @param [Cucumber::Core::Test::Case] test_case
|
9
|
-
# @return [Cucumber::Core::Ast::Scenario, Cucumber::Core::Ast::ScenarioOutline]
|
10
|
-
def scenario(test_case)
|
11
|
-
test_case.source.detect do |it|
|
12
|
-
it.is_a?(Cucumber::Core::Ast::Scenario) || it.is_a?(Cucumber::Core::Ast::ScenarioOutline)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# Get step object
|
17
|
-
# @param [Cucumber::Core::Test::Step] test_step
|
18
|
-
# @return [Cucumber::Core::Ast::Step]
|
19
|
-
def step(test_step)
|
20
|
-
test_step.source.detect { |it| it.is_a?(Cucumber::Core::Ast::Step) }
|
21
|
-
end
|
22
|
-
|
23
|
-
# Get scenario outline example row
|
24
|
-
# @param [Cucumber::Core::Test::Case] test_case
|
25
|
-
# @return [Cucumber::Core::Ast::ExamplesTable::Row]
|
26
|
-
def example_row(test_case)
|
27
|
-
test_case.source.detect { |it| it.is_a?(Cucumber::Core::Ast::ExamplesTable::Row) }
|
28
|
-
end
|
29
|
-
|
30
|
-
# Get step multiline argument
|
31
|
-
# @param [Cucumber::Core::Test::Step] test_step
|
32
|
-
# @return [Cucumber::Core::Ast::DataTable, String]
|
33
|
-
def multiline_arg(test_step)
|
34
|
-
multiline_arg = step(test_step).multiline_arg
|
35
|
-
return if multiline_arg.is_a?(Cucumber::Core::Ast::EmptyMultilineArgument)
|
36
|
-
|
37
|
-
multiline_arg
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,135 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "cucumber"
|
4
|
-
require "cucumber/core"
|
5
|
-
require "digest"
|
6
|
-
require "csv"
|
7
|
-
|
8
|
-
require_relative "ast_transformer"
|
9
|
-
require_relative "tag_parser"
|
10
|
-
|
11
|
-
module AllureCucumber
|
12
|
-
# Support class for transforming cucumber test entities in to allure model entities
|
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
|
33
|
-
|
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
|
43
|
-
|
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
|
51
|
-
|
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?
|
58
|
-
|
59
|
-
{}
|
60
|
-
end
|
61
|
-
|
62
|
-
# Get thread specific lifecycle
|
63
|
-
# @return [Allure::AllureLifecycle]
|
64
|
-
def lifecycle
|
65
|
-
Allure.lifecycle
|
66
|
-
end
|
67
|
-
|
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)
|
83
|
-
end
|
84
|
-
|
85
|
-
labels
|
86
|
-
end
|
87
|
-
|
88
|
-
# @param [Cucumber::Core::Test::Case] test_case
|
89
|
-
# @return [Array<Allure::Link>]
|
90
|
-
def links(test_case)
|
91
|
-
return [] unless test_case.tags
|
92
|
-
|
93
|
-
tms_links(test_case.tags) + issue_links(test_case.tags)
|
94
|
-
end
|
95
|
-
|
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
|
101
|
-
|
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
|
108
|
-
|
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
|
114
|
-
|
115
|
-
arg.data_table? ? data_table_attachment(arg) : docstring_attachment(arg)
|
116
|
-
end
|
117
|
-
|
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
|
126
|
-
|
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
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|