parallel_tests 1.0.9 → 1.1.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 +4 -4
- data/Readme.md +7 -3
- data/bin/parallel_cucumber +5 -1
- data/bin/parallel_rspec +5 -1
- data/bin/parallel_spinach +5 -1
- data/bin/parallel_test +5 -2
- data/lib/parallel_tests.rb +0 -1
- metadata +3 -51
- data/.gitignore +0 -4
- data/.rspec +0 -2
- data/.travis.yml +0 -10
- data/Gemfile +0 -9
- data/Gemfile.lock +0 -53
- data/Rakefile +0 -10
- data/ReadmeRails2.md +0 -48
- data/lib/parallel_tests/cli.rb +0 -206
- data/lib/parallel_tests/cucumber/failures_logger.rb +0 -25
- data/lib/parallel_tests/cucumber/runner.rb +0 -37
- data/lib/parallel_tests/cucumber/scenario_line_logger.rb +0 -51
- data/lib/parallel_tests/cucumber/scenarios.rb +0 -34
- data/lib/parallel_tests/gherkin/io.rb +0 -41
- data/lib/parallel_tests/gherkin/listener.rb +0 -87
- data/lib/parallel_tests/gherkin/runner.rb +0 -116
- data/lib/parallel_tests/gherkin/runtime_logger.rb +0 -28
- data/lib/parallel_tests/grouper.rb +0 -73
- data/lib/parallel_tests/railtie.rb +0 -8
- data/lib/parallel_tests/rspec/failures_logger.rb +0 -54
- data/lib/parallel_tests/rspec/logger_base.rb +0 -55
- data/lib/parallel_tests/rspec/runner.rb +0 -73
- data/lib/parallel_tests/rspec/runtime_logger.rb +0 -59
- data/lib/parallel_tests/rspec/summary_logger.rb +0 -19
- data/lib/parallel_tests/spinach/runner.rb +0 -19
- data/lib/parallel_tests/tasks.rb +0 -157
- data/lib/parallel_tests/test/runner.rb +0 -186
- data/lib/parallel_tests/test/runtime_logger.rb +0 -98
- data/lib/parallel_tests/version.rb +0 -3
- data/parallel_tests.gemspec +0 -14
- data/spec/integration_spec.rb +0 -437
- data/spec/parallel_tests/cli_spec.rb +0 -149
- data/spec/parallel_tests/cucumber/failure_logger_spec.rb +0 -43
- data/spec/parallel_tests/cucumber/runner_spec.rb +0 -25
- data/spec/parallel_tests/cucumber/scenarios_spec.rb +0 -69
- data/spec/parallel_tests/gherkin/listener_spec.rb +0 -96
- data/spec/parallel_tests/gherkin/runner_behaviour.rb +0 -216
- data/spec/parallel_tests/grouper_spec.rb +0 -61
- data/spec/parallel_tests/rspec/failures_logger_spec.rb +0 -82
- data/spec/parallel_tests/rspec/logger_base_spec.rb +0 -35
- data/spec/parallel_tests/rspec/runner_spec.rb +0 -201
- data/spec/parallel_tests/rspec/runtime_logger_spec.rb +0 -131
- data/spec/parallel_tests/rspec/summary_logger_spec.rb +0 -37
- data/spec/parallel_tests/spinach/runner_spec.rb +0 -12
- data/spec/parallel_tests/tasks_spec.rb +0 -178
- data/spec/parallel_tests/test/runner_spec.rb +0 -407
- data/spec/parallel_tests/test/runtime_logger_spec.rb +0 -112
- data/spec/parallel_tests_spec.rb +0 -137
- data/spec/spec_helper.rb +0 -182
@@ -1,149 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "parallel_tests/cli"
|
3
|
-
require "parallel_tests/rspec/runner"
|
4
|
-
|
5
|
-
|
6
|
-
describe ParallelTests::CLI do
|
7
|
-
subject { ParallelTests::CLI.new }
|
8
|
-
|
9
|
-
describe "#parse_options" do
|
10
|
-
let(:defaults){ {:files => []} }
|
11
|
-
|
12
|
-
def call(*args)
|
13
|
-
subject.send(:parse_options!, *args)
|
14
|
-
end
|
15
|
-
|
16
|
-
it "parses regular count" do
|
17
|
-
call(["-n3"]).should == defaults.merge(:count => 3)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "parses count 0 as non-parallel" do
|
21
|
-
call(["-n0"]).should == defaults.merge(:non_parallel => true)
|
22
|
-
end
|
23
|
-
|
24
|
-
it "parses non-parallel as non-parallel" do
|
25
|
-
call(["--non-parallel"]).should == defaults.merge(:non_parallel => true)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "finds the correct type when multiple are given" do
|
29
|
-
call(["--type", "test", "-t", "rspec"])
|
30
|
-
subject.instance_variable_get(:@runner).should == ParallelTests::RSpec::Runner
|
31
|
-
end
|
32
|
-
|
33
|
-
it "parses nice as nice" do
|
34
|
-
call(["--nice"]).should == defaults.merge(:nice => true)
|
35
|
-
end
|
36
|
-
|
37
|
-
context "parse only-group" do
|
38
|
-
it "group_by should be set to filesize" do
|
39
|
-
call(["--only-group", '1']).should == defaults.merge(:group_by=>:filesize, :only_group => [1])
|
40
|
-
end
|
41
|
-
|
42
|
-
it "raise error when group_by isn't filesize" do
|
43
|
-
expect{
|
44
|
-
call(["--only-group", '1', '--group-by', 'steps'])
|
45
|
-
}.to raise_error(RuntimeError)
|
46
|
-
end
|
47
|
-
|
48
|
-
context "with group_by default to filesize" do
|
49
|
-
let(:defaults_with_filesize){defaults.merge(:group_by => :filesize)}
|
50
|
-
|
51
|
-
it "with multiple groups" do
|
52
|
-
call(["--only-group", '4,5']).should == defaults_with_filesize.merge(:only_group => [4,5])
|
53
|
-
end
|
54
|
-
|
55
|
-
it "with a single group" do
|
56
|
-
call(["--only-group", '4']).should == defaults_with_filesize.merge(:only_group => [4])
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe "#load_runner" do
|
63
|
-
it "requires and loads default runner" do
|
64
|
-
subject.should_receive(:require).with("parallel_tests/test/runner")
|
65
|
-
subject.send(:load_runner, "test").should == ParallelTests::Test::Runner
|
66
|
-
end
|
67
|
-
|
68
|
-
it "requires and loads rspec runner" do
|
69
|
-
subject.should_receive(:require).with("parallel_tests/rspec/runner")
|
70
|
-
subject.send(:load_runner, "rspec").should == ParallelTests::RSpec::Runner
|
71
|
-
end
|
72
|
-
|
73
|
-
it "requires and loads runner with underscores" do
|
74
|
-
subject.should_receive(:require).with("parallel_tests/my_test_runner/runner")
|
75
|
-
subject.send(:load_runner, "my_test_runner").should == ParallelTests::MyTestRunner::Runner
|
76
|
-
end
|
77
|
-
|
78
|
-
it "fails to load unfindable runner" do
|
79
|
-
expect{
|
80
|
-
subject.send(:load_runner, "foo").should == ParallelTests::RSpec::Runner
|
81
|
-
}.to raise_error(LoadError)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
describe "#final_fail_message" do
|
86
|
-
before do
|
87
|
-
subject.instance_variable_set(:@runner, ParallelTests::Test::Runner)
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'returns a plain fail message if colors are nor supported' do
|
91
|
-
subject.should_receive(:use_colors?).and_return(false)
|
92
|
-
subject.send(:final_fail_message).should == "Tests Failed"
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'returns a colorized fail message if colors are supported' do
|
96
|
-
subject.should_receive(:use_colors?).and_return(true)
|
97
|
-
subject.send(:final_fail_message).should == "\e[31mTests Failed\e[0m"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe "#run_tests_in_parallel" do
|
102
|
-
context "specific groups to run" do
|
103
|
-
let(:results){ {:stdout => "", :exit_status => 0} }
|
104
|
-
before do
|
105
|
-
subject.should_receive(:load_runner).with("my_test_runner").and_return(ParallelTests::MyTestRunner::Runner)
|
106
|
-
ParallelTests::MyTestRunner::Runner.stub(:test_file_name).and_return("test")
|
107
|
-
ParallelTests::MyTestRunner::Runner.should_receive(:tests_in_groups).and_return([
|
108
|
-
['aaa','bbb'],
|
109
|
-
['ccc', 'ddd'],
|
110
|
-
['eee', 'fff']
|
111
|
-
])
|
112
|
-
subject.should_receive(:report_results).and_return(nil)
|
113
|
-
end
|
114
|
-
|
115
|
-
it "calls run_tests once when one group specified" do
|
116
|
-
subject.should_receive(:run_tests).once.and_return(results)
|
117
|
-
subject.run(['-n', '3', '--only-group', '1', '-t', 'my_test_runner'])
|
118
|
-
end
|
119
|
-
|
120
|
-
it "calls run_tests twice when two groups are specified" do
|
121
|
-
subject.should_receive(:run_tests).twice.and_return(results)
|
122
|
-
subject.run(['-n', '3', '--only-group', '1,2', '-t', 'my_test_runner'])
|
123
|
-
end
|
124
|
-
|
125
|
-
it "run only one group specified" do
|
126
|
-
options = {:count=>3, :only_group=>[2], :files=>[], :group_by=>:filesize}
|
127
|
-
subject.should_receive(:run_tests).once.with(['ccc', 'ddd'], 0, 1, options).and_return(results)
|
128
|
-
subject.run(['-n', '3', '--only-group', '2', '-t', 'my_test_runner'])
|
129
|
-
end
|
130
|
-
|
131
|
-
it "run twice with multiple groups" do
|
132
|
-
options = {:count=>3, :only_group=>[2,3], :files=>[], :group_by=>:filesize}
|
133
|
-
subject.should_receive(:run_tests).once.ordered.with(['ccc', 'ddd'], 0, 1, options).and_return(results)
|
134
|
-
subject.should_receive(:run_tests).once.ordered.with(['eee', 'fff'], 1, 1, options).and_return(results)
|
135
|
-
subject.run(['-n', '3', '--only-group', '2,3', '-t', 'my_test_runner'])
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
module ParallelTests
|
144
|
-
module MyTestRunner
|
145
|
-
class Runner
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'parallel_tests/gherkin/io'
|
3
|
-
require 'parallel_tests/cucumber/failures_logger'
|
4
|
-
|
5
|
-
describe ParallelTests::Cucumber::FailuresLogger do
|
6
|
-
|
7
|
-
before do
|
8
|
-
@output = OutputLogger.new([])
|
9
|
-
@output.stub(:write)
|
10
|
-
|
11
|
-
@logger1 = ParallelTests::Cucumber::FailuresLogger.new(nil, @output, nil)
|
12
|
-
@logger2 = ParallelTests::Cucumber::FailuresLogger.new(nil, @output, nil)
|
13
|
-
@logger3 = ParallelTests::Cucumber::FailuresLogger.new(nil, @output, nil)
|
14
|
-
|
15
|
-
@feature1 = mock('feature', :file => "feature/path/to/feature1.feature")
|
16
|
-
@feature2 = mock('feature', :file => "feature/path/to/feature2.feature")
|
17
|
-
@feature3 = mock('feature', :file => "feature/path/to/feature3.feature")
|
18
|
-
|
19
|
-
@logger1.instance_variable_set("@lines", [1, 2, 3])
|
20
|
-
@logger2.instance_variable_set("@lines", [2, 4, 6])
|
21
|
-
@logger3.instance_variable_set("@lines", [3, 6, 9])
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should produce a list of lines for failing scenarios" do
|
25
|
-
@logger1.after_feature(@feature1)
|
26
|
-
@logger2.after_feature(@feature2)
|
27
|
-
@logger3.after_feature(@feature3)
|
28
|
-
|
29
|
-
output_file_contents = @output.output.join("\n").concat("\n")
|
30
|
-
|
31
|
-
output_file_contents.should == <<END
|
32
|
-
feature/path/to/feature1.feature:1
|
33
|
-
feature/path/to/feature1.feature:2
|
34
|
-
feature/path/to/feature1.feature:3
|
35
|
-
feature/path/to/feature2.feature:2
|
36
|
-
feature/path/to/feature2.feature:4
|
37
|
-
feature/path/to/feature2.feature:6
|
38
|
-
feature/path/to/feature3.feature:3
|
39
|
-
feature/path/to/feature3.feature:6
|
40
|
-
feature/path/to/feature3.feature:9
|
41
|
-
END
|
42
|
-
end
|
43
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "parallel_tests/gherkin/runner_behaviour"
|
3
|
-
require "parallel_tests/cucumber/runner"
|
4
|
-
|
5
|
-
describe ParallelTests::Cucumber::Runner do
|
6
|
-
test_tests_in_groups(ParallelTests::Cucumber::Runner, 'features', ".feature")
|
7
|
-
|
8
|
-
it_should_behave_like 'gherkin runners' do
|
9
|
-
let(:runner_name) {'cucumber'}
|
10
|
-
let(:runner_class){ParallelTests::Cucumber::Runner}
|
11
|
-
|
12
|
-
describe :summarize_results do
|
13
|
-
def call(*args)
|
14
|
-
runner_class().summarize_results(*args)
|
15
|
-
end
|
16
|
-
|
17
|
-
it "collates failing scenarios" do
|
18
|
-
results = ["Failing Scenarios:", "cucumber features/failure:1", "cucumber features/failure:2",
|
19
|
-
"Failing Scenarios:", "cucumber features/failure:3", "cucumber features/failure:4",
|
20
|
-
"Failing Scenarios:", "cucumber features/failure:5", "cucumber features/failure:6"]
|
21
|
-
call(results).should == "Failing Scenarios:\ncucumber features/failure:1\ncucumber features/failure:2\ncucumber features/failure:3\ncucumber features/failure:4\ncucumber features/failure:5\ncucumber features/failure:6\n\n"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
require 'parallel_tests/cucumber/scenarios'
|
3
|
-
|
4
|
-
module ParallelTests
|
5
|
-
module Cucumber
|
6
|
-
describe Scenarios do
|
7
|
-
describe '.all' do
|
8
|
-
context 'by default' do
|
9
|
-
let(:feature_file) do
|
10
|
-
Tempfile.new('grouper.feature').tap do |feature|
|
11
|
-
feature.write <<-EOS
|
12
|
-
Feature: Grouping by scenario
|
13
|
-
|
14
|
-
Scenario: First
|
15
|
-
Given I do nothing
|
16
|
-
|
17
|
-
Scenario: Second
|
18
|
-
Given I don't do anything
|
19
|
-
EOS
|
20
|
-
feature.rewind
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'returns all the scenarios' do
|
25
|
-
scenarios = Scenarios.all([feature_file.path])
|
26
|
-
scenarios.should eq %W(#{feature_file.path}:3 #{feature_file.path}:6)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'with tags' do
|
31
|
-
let(:feature_file) do
|
32
|
-
Tempfile.new('grouper.feature').tap do |feature|
|
33
|
-
feature.write <<-EOS
|
34
|
-
Feature: Grouping by scenario
|
35
|
-
|
36
|
-
@wip
|
37
|
-
Scenario: First
|
38
|
-
Given I do nothing
|
39
|
-
|
40
|
-
Scenario: Second
|
41
|
-
Given I don't do anything
|
42
|
-
|
43
|
-
@ignore
|
44
|
-
Scenario: Third
|
45
|
-
Given I am ignored
|
46
|
-
EOS
|
47
|
-
feature.rewind
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'ignores those scenarios' do
|
52
|
-
scenarios = Scenarios.all([feature_file.path], :ignore_tag_pattern => '@ignore, @wip')
|
53
|
-
scenarios.should eq %W(#{feature_file.path}:7)
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'return scenarios with tag' do
|
57
|
-
scenarios = Scenarios.all([feature_file.path], :test_options => '-t @wip')
|
58
|
-
scenarios.should eq %W(#{feature_file.path}:4)
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'return scenarios with negative tag' do
|
62
|
-
scenarios = Scenarios.all([feature_file.path], :test_options => '-t @ignore,~@wip') # @ignore or not @wip
|
63
|
-
scenarios.should eq %W(#{feature_file.path}:7 #{feature_file.path}:11)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,96 +0,0 @@
|
|
1
|
-
require 'parallel_tests/gherkin/listener'
|
2
|
-
|
3
|
-
describe ParallelTests::Gherkin::Listener do
|
4
|
-
describe :collect do
|
5
|
-
before(:each) do
|
6
|
-
@listener = ParallelTests::Gherkin::Listener.new
|
7
|
-
@listener.uri("feature_file")
|
8
|
-
end
|
9
|
-
|
10
|
-
it "returns steps count" do
|
11
|
-
3.times {@listener.step(nil)}
|
12
|
-
@listener.collect.should == {"feature_file" => 3}
|
13
|
-
end
|
14
|
-
|
15
|
-
it "counts background steps separately" do
|
16
|
-
@listener.background("background")
|
17
|
-
5.times {@listener.step(nil)}
|
18
|
-
@listener.collect.should == {"feature_file" => 0}
|
19
|
-
|
20
|
-
@listener.scenario("scenario")
|
21
|
-
2.times {@listener.step(nil)}
|
22
|
-
@listener.collect.should == {"feature_file" => 2}
|
23
|
-
|
24
|
-
@listener.scenario("scenario")
|
25
|
-
@listener.collect.should == {"feature_file" => 2}
|
26
|
-
|
27
|
-
@listener.eof
|
28
|
-
@listener.collect.should == {"feature_file" => 12}
|
29
|
-
end
|
30
|
-
|
31
|
-
it "counts scenario outlines steps separately" do
|
32
|
-
@listener.scenario_outline("outline")
|
33
|
-
5.times {@listener.step(nil)}
|
34
|
-
@listener.examples(stub('examples', :rows => Array.new(3)))
|
35
|
-
@listener.collect.should == {"feature_file" => 15}
|
36
|
-
|
37
|
-
@listener.scenario("scenario")
|
38
|
-
2.times {@listener.step(nil)}
|
39
|
-
@listener.collect.should == {"feature_file" => 17}
|
40
|
-
|
41
|
-
@listener.scenario("scenario")
|
42
|
-
@listener.collect.should == {"feature_file" => 17}
|
43
|
-
|
44
|
-
@listener.eof
|
45
|
-
@listener.collect.should == {"feature_file" => 17}
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'counts scenarios that should not be ignored' do
|
49
|
-
@listener.ignore_tag_pattern = nil
|
50
|
-
@listener.scenario( stub('scenario', :tags =>[ stub('tag', :name => '@WIP' )]) )
|
51
|
-
@listener.step(nil)
|
52
|
-
@listener.eof
|
53
|
-
@listener.collect.should == {"feature_file" => 1}
|
54
|
-
|
55
|
-
@listener.ignore_tag_pattern = /@something_other_than_WIP/
|
56
|
-
@listener.scenario( stub('scenario', :tags =>[ stub('tag', :name => '@WIP' )]) )
|
57
|
-
@listener.step(nil)
|
58
|
-
@listener.eof
|
59
|
-
@listener.collect.should == {"feature_file" => 2}
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'does not count scenarios that should be ignored' do
|
63
|
-
@listener.ignore_tag_pattern = /@WIP/
|
64
|
-
@listener.scenario( stub('scenario', :tags =>[ stub('tag', :name => '@WIP' )]))
|
65
|
-
@listener.step(nil)
|
66
|
-
@listener.eof
|
67
|
-
@listener.collect.should == {"feature_file" => 0}
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'counts outlines that should not be ignored' do
|
71
|
-
@listener.ignore_tag_pattern = nil
|
72
|
-
@listener.scenario_outline( stub('scenario', :tags =>[ stub('tag', :name => '@WIP' )]) )
|
73
|
-
@listener.step(nil)
|
74
|
-
@listener.examples(stub('examples', :rows => Array.new(3)))
|
75
|
-
@listener.eof
|
76
|
-
@listener.collect.should == {"feature_file" => 3}
|
77
|
-
|
78
|
-
@listener.ignore_tag_pattern = /@something_other_than_WIP/
|
79
|
-
@listener.scenario_outline( stub('scenario', :tags =>[ stub('tag', :name => '@WIP' )]) )
|
80
|
-
@listener.step(nil)
|
81
|
-
@listener.examples(stub('examples', :rows => Array.new(3)))
|
82
|
-
@listener.eof
|
83
|
-
@listener.collect.should == {"feature_file" => 6}
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'does not count outlines that should be ignored' do
|
87
|
-
@listener.ignore_tag_pattern = /@WIP/
|
88
|
-
@listener.scenario_outline( stub('scenario', :tags =>[ stub('tag', :name => '@WIP' )]) )
|
89
|
-
@listener.step(nil)
|
90
|
-
@listener.examples(stub('examples', :rows => Array.new(3)))
|
91
|
-
@listener.eof
|
92
|
-
@listener.collect.should == {"feature_file" => 0}
|
93
|
-
end
|
94
|
-
|
95
|
-
end
|
96
|
-
end
|
@@ -1,216 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "parallel_tests/gherkin/runner"
|
3
|
-
|
4
|
-
shared_examples_for 'gherkin runners' do
|
5
|
-
describe :run_tests do
|
6
|
-
before do
|
7
|
-
ParallelTests.stub!(:bundler_enabled?).and_return false
|
8
|
-
File.stub!(:file?).with('.bundle/environment.rb').and_return false
|
9
|
-
File.stub!(:file?).with("script/#{runner_name}").and_return true
|
10
|
-
end
|
11
|
-
|
12
|
-
def call(*args)
|
13
|
-
runner_class().run_tests(*args)
|
14
|
-
end
|
15
|
-
|
16
|
-
def should_run_with(regex)
|
17
|
-
ParallelTests::Test::Runner.should_receive(:execute_command).with { |a, b, c, d| a =~ regex }
|
18
|
-
end
|
19
|
-
|
20
|
-
it "allows to override runner executable via PARALLEL_TESTS_EXECUTABLE" do
|
21
|
-
ENV['PARALLEL_TESTS_EXECUTABLE'] = 'script/custom_rspec'
|
22
|
-
should_run_with /script\/custom_rspec/
|
23
|
-
call(['xxx'], 1, 22, {})
|
24
|
-
ENV.delete('PARALLEL_TESTS_EXECUTABLE')
|
25
|
-
end
|
26
|
-
|
27
|
-
it "permits setting env options" do
|
28
|
-
ParallelTests::Test::Runner.should_receive(:execute_command).with { |a, b, c, options|
|
29
|
-
options[:env]["TEST"] == "ME"
|
30
|
-
}
|
31
|
-
call(['xxx'], 1, 22, {:env => {'TEST' => 'ME'}})
|
32
|
-
end
|
33
|
-
|
34
|
-
it "runs bundle exec {runner_name} when on bundler 0.9" do
|
35
|
-
ParallelTests.stub!(:bundler_enabled?).and_return true
|
36
|
-
should_run_with %r{bundle exec #{runner_name}}
|
37
|
-
call(['xxx'], 1, 22, {})
|
38
|
-
end
|
39
|
-
|
40
|
-
it "runs script/{runner_name} when script/{runner_name} is found" do
|
41
|
-
should_run_with %r{script/#{runner_name}}
|
42
|
-
call(['xxx'], 1, 22, {})
|
43
|
-
end
|
44
|
-
|
45
|
-
it "runs {runner_name} by default" do
|
46
|
-
File.stub!(:file?).with("script/#{runner_name}").and_return false
|
47
|
-
should_run_with %r{^#{runner_name}}
|
48
|
-
call(['xxx'], 1, 22, {})
|
49
|
-
end
|
50
|
-
|
51
|
-
it "uses bin/{runner_name} when present" do
|
52
|
-
File.stub(:exists?).with("bin/#{runner_name}").and_return true
|
53
|
-
should_run_with %r{bin/#{runner_name}}
|
54
|
-
call(['xxx'], 1, 22, {})
|
55
|
-
end
|
56
|
-
|
57
|
-
it "uses options passed in" do
|
58
|
-
should_run_with %r{script/#{runner_name} .* -p default}
|
59
|
-
call(['xxx'], 1, 22, :test_options => '-p default')
|
60
|
-
end
|
61
|
-
|
62
|
-
it "sanitizes dangerous file runner_names" do
|
63
|
-
should_run_with %r{xx\\ x}
|
64
|
-
call(['xx x'], 1, 22, {})
|
65
|
-
end
|
66
|
-
|
67
|
-
context "with parallel profile in config/{runner_name}.yml" do
|
68
|
-
before do
|
69
|
-
file_contents = 'parallel: -f progress'
|
70
|
-
Dir.stub(:glob).and_return ["config/#{runner_name}.yml"]
|
71
|
-
File.stub(:read).with("config/#{runner_name}.yml").and_return file_contents
|
72
|
-
end
|
73
|
-
|
74
|
-
it "uses parallel profile" do
|
75
|
-
should_run_with %r{script/#{runner_name} .* foo bar --profile parallel xxx}
|
76
|
-
call(['xxx'], 1, 22, :test_options => 'foo bar')
|
77
|
-
end
|
78
|
-
|
79
|
-
it "uses given profile via --profile" do
|
80
|
-
should_run_with %r{script/#{runner_name} .* --profile foo xxx$}
|
81
|
-
call(['xxx'], 1, 22, :test_options => '--profile foo')
|
82
|
-
end
|
83
|
-
|
84
|
-
it "uses given profile via -p" do
|
85
|
-
should_run_with %r{script/#{runner_name} .* -p foo xxx$}
|
86
|
-
call(['xxx'], 1, 22, :test_options => '-p foo')
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
it "does not use parallel profile if config/{runner_name}.yml does not contain it" do
|
91
|
-
file_contents = 'blob: -f progress'
|
92
|
-
should_run_with %r{script/#{runner_name} .* foo bar}
|
93
|
-
Dir.should_receive(:glob).and_return ["config/#{runner_name}.yml"]
|
94
|
-
File.should_receive(:read).with("config/#{runner_name}.yml").and_return file_contents
|
95
|
-
call(['xxx'], 1, 22, :test_options => 'foo bar')
|
96
|
-
end
|
97
|
-
|
98
|
-
it "does not use the parallel profile if config/{runner_name}.yml does not exist" do
|
99
|
-
should_run_with %r{script/#{runner_name}} # TODO this test looks useless...
|
100
|
-
Dir.should_receive(:glob).and_return []
|
101
|
-
call(['xxx'], 1, 22, {})
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
describe :line_is_result? do
|
106
|
-
it "should match lines with only one scenario" do
|
107
|
-
line = "1 scenario (1 failed)"
|
108
|
-
runner_class().line_is_result?(line).should be_true
|
109
|
-
end
|
110
|
-
|
111
|
-
it "should match lines with multiple scenarios" do
|
112
|
-
line = "2 scenarios (1 failed, 1 passed)"
|
113
|
-
runner_class().line_is_result?(line).should be_true
|
114
|
-
end
|
115
|
-
|
116
|
-
it "should match lines with only one step" do
|
117
|
-
line = "1 step (1 failed)"
|
118
|
-
runner_class().line_is_result?(line).should be_true
|
119
|
-
end
|
120
|
-
|
121
|
-
it "should match lines with multiple steps" do
|
122
|
-
line = "5 steps (1 failed, 4 passed)"
|
123
|
-
runner_class().line_is_result?(line).should be_true
|
124
|
-
end
|
125
|
-
|
126
|
-
it "should not match other lines" do
|
127
|
-
line = ' And I should have "2" emails # features/step_definitions/user_steps.rb:25'
|
128
|
-
runner_class().line_is_result?(line).should be_false
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
describe :find_results do
|
133
|
-
it "finds multiple results in test output" do
|
134
|
-
output = <<EOF
|
135
|
-
And I should not see "/en/" # features/step_definitions/webrat_steps.rb:87
|
136
|
-
|
137
|
-
7 scenarios (3 failed, 4 passed)
|
138
|
-
33 steps (3 failed, 2 skipped, 28 passed)
|
139
|
-
/apps/rs/features/signup.feature:2
|
140
|
-
Given I am on "/" # features/step_definitions/common_steps.rb:12
|
141
|
-
When I click "register" # features/step_definitions/common_steps.rb:6
|
142
|
-
And I should have "2" emails # features/step_definitions/user_steps.rb:25
|
143
|
-
|
144
|
-
4 scenarios (4 passed)
|
145
|
-
40 steps (40 passed)
|
146
|
-
|
147
|
-
And I should not see "foo" # features/step_definitions/webrat_steps.rb:87
|
148
|
-
|
149
|
-
1 scenario (1 passed)
|
150
|
-
1 step (1 passed)
|
151
|
-
|
152
|
-
EOF
|
153
|
-
runner_class().find_results(output).should == ["7 scenarios (3 failed, 4 passed)", "33 steps (3 failed, 2 skipped, 28 passed)", "4 scenarios (4 passed)", "40 steps (40 passed)", "1 scenario (1 passed)", "1 step (1 passed)"]
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
describe :summarize_results do
|
158
|
-
def call(*args)
|
159
|
-
runner_class().summarize_results(*args)
|
160
|
-
end
|
161
|
-
|
162
|
-
it "sums up results for scenarios and steps separately from each other" do
|
163
|
-
results = ["7 scenarios (3 failed, 4 passed)", "33 steps (3 failed, 2 skipped, 28 passed)", "4 scenarios (4 passed)",
|
164
|
-
"40 steps (40 passed)", "1 scenario (1 passed)", "1 step (1 passed)"]
|
165
|
-
call(results).should == "12 scenarios (3 failed, 9 passed)\n74 steps (3 failed, 2 skipped, 69 passed)"
|
166
|
-
end
|
167
|
-
|
168
|
-
it "adds same results with plurals" do
|
169
|
-
results = ["1 scenario (1 passed)", "2 steps (2 passed)",
|
170
|
-
"2 scenarios (2 passed)", "7 steps (7 passed)"]
|
171
|
-
call(results).should == "3 scenarios (3 passed)\n9 steps (9 passed)"
|
172
|
-
end
|
173
|
-
|
174
|
-
it "adds non-similar results" do
|
175
|
-
results = ["1 scenario (1 passed)", "1 step (1 passed)",
|
176
|
-
"2 scenarios (1 failed, 1 pending)", "2 steps (1 failed, 1 pending)"]
|
177
|
-
call(results).should == "3 scenarios (1 failed, 1 pending, 1 passed)\n3 steps (1 failed, 1 pending, 1 passed)"
|
178
|
-
end
|
179
|
-
|
180
|
-
it "does not pluralize 1" do
|
181
|
-
call(["1 scenario (1 passed)", "1 step (1 passed)"]).should == "1 scenario (1 passed)\n1 step (1 passed)"
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
describe 'grouping by scenarios for cucumber' do
|
186
|
-
def call(*args)
|
187
|
-
ParallelTests::Gherkin::Runner.send(:run_tests, *args)
|
188
|
-
end
|
189
|
-
|
190
|
-
it 'groups cucumber invocation by feature files to achieve correct cucumber hook behaviour' do
|
191
|
-
|
192
|
-
test_files = %w(features/a.rb:23 features/a.rb:44 features/b.rb:12)
|
193
|
-
|
194
|
-
ParallelTests::Test::Runner.should_receive(:execute_command).with do |a,b,c,d|
|
195
|
-
argv = a.split("--").last.split(" ")[2..-1].sort
|
196
|
-
argv == ["features/a.rb:23:44", "features/b.rb:12"]
|
197
|
-
end
|
198
|
-
|
199
|
-
call(test_files, 1, 2, { :group_by => :scenarios })
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
describe ".find_tests" do
|
204
|
-
def call(*args)
|
205
|
-
ParallelTests::Gherkin::Runner.send(:find_tests, *args)
|
206
|
-
end
|
207
|
-
|
208
|
-
it "doesn't find bakup files with the same name as test files" do
|
209
|
-
with_files(['a/x.feature','a/x.feature.bak']) do |root|
|
210
|
-
call(["#{root}/"]).should == [
|
211
|
-
"#{root}/a/x.feature",
|
212
|
-
]
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|