parallel_tests 1.0.9 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|