multicuke 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/multicuke/reports_index.rb +56 -0
- data/lib/multicuke/runner.rb +30 -44
- data/lib/multicuke/version.rb +1 -1
- data/spec/dryrun_spec.rb +2 -2
- data/spec/fork_spec.rb +5 -1
- data/spec/runner_spec.rb +2 -3
- metadata +2 -1
@@ -0,0 +1,56 @@
|
|
1
|
+
module Multicuke
|
2
|
+
|
3
|
+
# Generate the index page reporting on the features and their status.
|
4
|
+
# Provides the links to the actual full Cucumber html reports.
|
5
|
+
class ReportsIndex
|
6
|
+
|
7
|
+
# Collection of ran features directories results used for reporting
|
8
|
+
attr_reader :features_dirs
|
9
|
+
|
10
|
+
def initialize(reports_path, features_dirs)
|
11
|
+
@features_dirs = features_dirs
|
12
|
+
@index_file_path = File.join(reports_path, "index.html")
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate
|
16
|
+
index_file = File.new(@index_file_path, "w")
|
17
|
+
|
18
|
+
b = Builder::XmlMarkup.new :target => index_file, :indent => 2
|
19
|
+
b.html {
|
20
|
+
b.head {
|
21
|
+
b.title("Cucumber reports")
|
22
|
+
b.style(css_content)
|
23
|
+
}
|
24
|
+
b.body {
|
25
|
+
b.h2("Features")
|
26
|
+
b.ul {
|
27
|
+
features_dirs.each { |features_dir|
|
28
|
+
b.li(:class => (features_dir.failed? ? "failed" : "success")) {
|
29
|
+
b.a(features_dir.human_name, :href => "#{features_dir.name}.html")
|
30
|
+
b.span("[#{features_dir.duration}]", :class => "duration")
|
31
|
+
b.span("Scenarios: #{features_dir.scenarios_results}, Steps: #{features_dir.steps_results}", :class => "result")
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
index_file.close
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def css_content
|
44
|
+
<<-CSS
|
45
|
+
body {font-family: "Lucida Grande", Helvetica, sans-serif; margin: 2em 8em 2em 8em;}
|
46
|
+
ul {list-style-type: square;}
|
47
|
+
li {margin: 1em 0 1em 0;}
|
48
|
+
li span {float: right; margin-left: 1em; padding: 0 0.3em;}
|
49
|
+
li.failed span.result{background: #DC6E6E;}
|
50
|
+
li.success span.result{background: #C1E799;}
|
51
|
+
span.duration {color: #999999;}
|
52
|
+
CSS
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
data/lib/multicuke/runner.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'builder'
|
3
3
|
require 'nokogiri'
|
4
|
-
require '
|
4
|
+
require 'multicuke/reports_index'
|
5
5
|
|
6
6
|
module Multicuke
|
7
7
|
|
@@ -38,12 +38,27 @@ module Multicuke
|
|
38
38
|
|
39
39
|
end
|
40
40
|
|
41
|
+
# Actual clas that will spawn one command process per directory of features collected
|
42
|
+
# according to configuration
|
41
43
|
class Runner
|
42
44
|
|
43
|
-
|
45
|
+
# Root path to your features directory
|
46
|
+
attr_accessor :features_root_path
|
47
|
+
|
48
|
+
# Optional name for directory containing the reports
|
44
49
|
attr_accessor :output_dir_name
|
50
|
+
|
51
|
+
# Optional full path for generated reports. Default to where it is run from.
|
45
52
|
attr_accessor :output_path
|
46
|
-
|
53
|
+
|
54
|
+
# Optional features directories to exclude
|
55
|
+
attr_accessor :excluded_dirs
|
56
|
+
|
57
|
+
# Full final path where html reports will be generated
|
58
|
+
attr_reader :reports_path
|
59
|
+
|
60
|
+
# Optional. If true will generate index file but not launch processes. Used for testing.
|
61
|
+
attr_accessor :dry_run
|
47
62
|
|
48
63
|
def initialize
|
49
64
|
yield self if block_given?
|
@@ -57,15 +72,20 @@ module Multicuke
|
|
57
72
|
|
58
73
|
def start
|
59
74
|
FileUtils.mkdir_p reports_path
|
60
|
-
|
61
|
-
|
75
|
+
launch_process_per_dir
|
76
|
+
collect_results
|
77
|
+
ReportsIndex.new(reports_path, features_dirs).generate
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
62
81
|
|
82
|
+
def launch_process_per_dir
|
63
83
|
unless dry_run
|
64
84
|
features_dirs.each { |features_dir|
|
65
85
|
report_file_path = File.join(reports_path, "#{features_dir.name}.html")
|
66
|
-
feature_full_path = File.join(
|
86
|
+
feature_full_path = File.join(features_root_path, "#{features_dir.name}")
|
67
87
|
fork {
|
68
|
-
command = "bundle exec cucumber #{feature_full_path} -r #{
|
88
|
+
command = "bundle exec cucumber #{feature_full_path} -r #{features_root_path} --format html --out #{report_file_path}"
|
69
89
|
p "RUNNING #{command}"
|
70
90
|
system command
|
71
91
|
}
|
@@ -73,7 +93,9 @@ module Multicuke
|
|
73
93
|
p Process.waitall
|
74
94
|
}
|
75
95
|
end
|
96
|
+
end
|
76
97
|
|
98
|
+
def collect_results
|
77
99
|
features_dirs.each { |features_dir|
|
78
100
|
feature_file = File.join(reports_path, "#{features_dir.name}.html")
|
79
101
|
File.open(feature_file) { |file|
|
@@ -92,42 +114,6 @@ module Multicuke
|
|
92
114
|
features_dir.failed = failed
|
93
115
|
} if File.exists?(feature_file)
|
94
116
|
}
|
95
|
-
|
96
|
-
b = Builder::XmlMarkup.new :target => index_file, :indent => 2
|
97
|
-
b.html {
|
98
|
-
b.head {
|
99
|
-
b.title("Cucumber reports")
|
100
|
-
b.style(css_content)
|
101
|
-
}
|
102
|
-
b.body {
|
103
|
-
b.h2("Features")
|
104
|
-
b.ul {
|
105
|
-
features_dirs.each { |features_dir|
|
106
|
-
b.li(:class => (features_dir.failed? ? "failed" : "success")) {
|
107
|
-
b.a(features_dir.human_name, :href => "#{features_dir.name}.html")
|
108
|
-
b.span("[#{features_dir.duration}]", :class => "duration")
|
109
|
-
b.span("Scenarios: #{features_dir.scenarios_results}, Steps: #{features_dir.steps_results}", :class => "result")
|
110
|
-
}
|
111
|
-
}
|
112
|
-
}
|
113
|
-
}
|
114
|
-
}
|
115
|
-
|
116
|
-
index_file.close
|
117
|
-
end
|
118
|
-
|
119
|
-
private
|
120
|
-
|
121
|
-
def css_content
|
122
|
-
<<-CSS
|
123
|
-
body {font-family: "Lucida Grande", Helvetica, sans-serif; margin: 2em 8em 2em 8em;}
|
124
|
-
ul {list-style-type: square;}
|
125
|
-
li {margin: 1em 0 1em 0;}
|
126
|
-
li span {float: right; margin-left: 1em; padding: 0 0.3em;}
|
127
|
-
li.failed span.result{background: #DC6E6E;}
|
128
|
-
li.success span.result{background: #C1E799;}
|
129
|
-
span.duration {color: #999999;}
|
130
|
-
CSS
|
131
117
|
end
|
132
118
|
|
133
119
|
def match_excluded_dirs(path)
|
@@ -140,7 +126,7 @@ module Multicuke
|
|
140
126
|
|
141
127
|
def find_features_dirs
|
142
128
|
@features_dirs = []
|
143
|
-
Dir.glob(File.join(
|
129
|
+
Dir.glob(File.join(features_root_path, "*")).reject{ |path|
|
144
130
|
File.file?(path) || match_excluded_dirs(path)
|
145
131
|
}.map { |feature_path|
|
146
132
|
File.basename(feature_path)
|
data/lib/multicuke/version.rb
CHANGED
data/spec/dryrun_spec.rb
CHANGED
@@ -10,7 +10,7 @@ module Multicuke
|
|
10
10
|
|
11
11
|
it "generates index file in output folder" do
|
12
12
|
runner = Multicuke::Runner.new do |r|
|
13
|
-
r.
|
13
|
+
r.features_root_path = File.expand_path("../features", __FILE__)
|
14
14
|
r.output_dir_name = "cuke_reports"
|
15
15
|
r.dry_run = true
|
16
16
|
r.output_path = RESULTS_DIR_PATH
|
@@ -25,7 +25,7 @@ module Multicuke
|
|
25
25
|
|
26
26
|
it "write link to each features on index file" do
|
27
27
|
runner = Multicuke::Runner.new do |r|
|
28
|
-
r.
|
28
|
+
r.features_root_path = File.expand_path("../features", __FILE__)
|
29
29
|
r.excluded_dirs = ["steps_definition"]
|
30
30
|
r.dry_run = true
|
31
31
|
r.output_path = RESULTS_DIR_PATH
|
data/spec/fork_spec.rb
CHANGED
@@ -4,9 +4,13 @@ module Multicuke
|
|
4
4
|
|
5
5
|
describe "Forking" do
|
6
6
|
|
7
|
+
before(:each) do
|
8
|
+
FileUtils.rm_r(Dir.glob("#{RESULTS_DIR_PATH}/*"), :force => true)
|
9
|
+
end
|
10
|
+
|
7
11
|
it "generates test results files" do
|
8
12
|
runner = Multicuke::Runner.new do |r|
|
9
|
-
r.
|
13
|
+
r.features_root_path = File.expand_path("../features", __FILE__)
|
10
14
|
r.excluded_dirs = ["steps_definition"]
|
11
15
|
r.output_path = RESULTS_DIR_PATH
|
12
16
|
end
|
data/spec/runner_spec.rb
CHANGED
@@ -5,18 +5,17 @@ module Multicuke
|
|
5
5
|
describe Runner do
|
6
6
|
it "initializes with provided configuration" do
|
7
7
|
runner = Multicuke::Runner.new do |r|
|
8
|
-
r.
|
8
|
+
r.features_root_path = "my_feature_path"
|
9
9
|
r.output_dir_name = "my_reports"
|
10
10
|
r.output_path = "my_output_path"
|
11
11
|
r.dry_run = true
|
12
12
|
r.excluded_dirs = ["my_first_dir", "my_second_dir"]
|
13
13
|
end
|
14
14
|
|
15
|
-
runner.
|
15
|
+
runner.features_root_path.should == "my_feature_path"
|
16
16
|
runner.output_dir_name.should == "my_reports"
|
17
17
|
runner.output_path.should == "my_output_path"
|
18
18
|
runner.dry_run.should be_true
|
19
|
-
runner.reports_path.should == "my_output_path/my_reports"
|
20
19
|
runner.excluded_dirs.should include("my_first_dir", "my_second_dir")
|
21
20
|
end
|
22
21
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multicuke
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -23,6 +23,7 @@ files:
|
|
23
23
|
- README.md
|
24
24
|
- Rakefile
|
25
25
|
- lib/multicuke.rb
|
26
|
+
- lib/multicuke/reports_index.rb
|
26
27
|
- lib/multicuke/runner.rb
|
27
28
|
- lib/multicuke/version.rb
|
28
29
|
- multicuke.gemspec
|