parallelized_specs 0.0.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.
@@ -0,0 +1,149 @@
1
+ # ---- requirements
2
+ $LOAD_PATH << File.expand_path("../lib", File.dirname(__FILE__))
3
+ require 'rubygems'
4
+
5
+ FAKE_RAILS_ROOT = '/tmp/pspecs/fixtures'
6
+
7
+ require 'tempfile'
8
+ require 'parallel_specs'
9
+ require 'parallel_specs/spec_runtime_logger'
10
+ require 'parallel_specs/spec_summary_logger'
11
+ require 'parallel_cucumber'
12
+ require 'parallel_tests/runtime_logger'
13
+
14
+ OutputLogger = Struct.new(:output) do
15
+ attr_reader :flock, :flush
16
+ def puts(s=nil)
17
+ self.output << s.to_s
18
+ end
19
+ end
20
+
21
+ def mocked_process
22
+ open('|cat /dev/null')
23
+ end
24
+
25
+ def size_of(group)
26
+ group.inject(0) { |sum, test| sum += File.stat(test).size }
27
+ end
28
+
29
+ # Uses /tmp/parallel_tests/application as the cwd so we can create and remove
30
+ # files as we want to. After execution it changes cwd back to the original one.
31
+ def use_temporary_directory_for
32
+ require 'fileutils'
33
+
34
+ dir = File.join("/tmp", "parallel_tests")
35
+ new_dir = File.join(dir, "application")
36
+
37
+ begin
38
+ # just in case the temporary dir already exists
39
+ FileUtils.rm_rf(dir) if File.exists?(dir)
40
+
41
+ # create the temporary directory
42
+ FileUtils.mkdir_p(new_dir)
43
+
44
+ # chdir changes cwd back to the original one after it is done
45
+ Dir.chdir(new_dir) do
46
+ yield
47
+ end
48
+ ensure
49
+ FileUtils.rm_rf(dir) if File.exists?(dir)
50
+ end
51
+ end
52
+
53
+ def test_tests_in_groups(klass, folder, suffix)
54
+ test_root = "#{FAKE_RAILS_ROOT}/#{folder}"
55
+
56
+ describe :tests_in_groups do
57
+ before :all do
58
+ system "rm -rf #{FAKE_RAILS_ROOT}; mkdir -p #{test_root}/temp"
59
+
60
+ @files = [0,1,2,3,4,5,6,7].map do |i|
61
+ size = 99
62
+ file = "#{test_root}/temp/x#{i}#{suffix}"
63
+ File.open(file, 'w') { |f| f.puts 'x' * size }
64
+ file
65
+ end
66
+
67
+ @log = klass.runtime_log
68
+ `mkdir -p #{File.dirname(@log)}`
69
+ `rm -f #{@log}`
70
+ end
71
+
72
+ after :all do
73
+ `rm -f #{klass.runtime_log}`
74
+ end
75
+
76
+ it "groups when given an array of files" do
77
+ list_of_files = Dir["#{test_root}/**/*#{suffix}"]
78
+ found = klass.with_runtime_info(list_of_files)
79
+ found.should =~ list_of_files.map{ |file| [file, File.stat(file).size]}
80
+ end
81
+
82
+ it "finds all tests" do
83
+ found = klass.tests_in_groups(test_root, 1)
84
+ all = [ Dir["#{test_root}/**/*#{suffix}"] ]
85
+ (found.flatten - all.flatten).should == []
86
+ end
87
+
88
+ it "partitions them into groups by equal size" do
89
+ groups = klass.tests_in_groups(test_root, 2)
90
+ groups.map{|g| size_of(g)}.should == [400, 400]
91
+ end
92
+
93
+ it 'should partition correctly with a group size of 4' do
94
+ groups = klass.tests_in_groups(test_root, 4)
95
+ groups.map{|g| size_of(g)}.should == [200, 200, 200, 200]
96
+ end
97
+
98
+ it 'should partition correctly with an uneven group size' do
99
+ groups = klass.tests_in_groups(test_root, 3)
100
+ groups.map{|g| size_of(g)}.should =~ [300, 300, 200]
101
+ end
102
+
103
+ def setup_runtime_log
104
+ File.open(@log,'w') do |f|
105
+ @files[1..-1].each{|file| f.puts "#{file}:#{@files.index(file)}"}
106
+ f.puts "#{@files[0]}:10"
107
+ end
108
+ end
109
+
110
+ it "partitions by runtime when runtime-data is available" do
111
+ klass.stub!(:puts)
112
+ setup_runtime_log
113
+
114
+ groups = klass.tests_in_groups(test_root, 2)
115
+ groups.size.should == 2
116
+ # 10 + 1 + 3 + 5 = 19
117
+ groups[0].should == [@files[0],@files[1],@files[3],@files[5]]
118
+ # 2 + 4 + 6 + 7 = 19
119
+ groups[1].should == [@files[2],@files[4],@files[6],@files[7]]
120
+ end
121
+
122
+ it "alpha-sorts partitions when runtime-data is available" do
123
+ klass.stub!(:puts)
124
+ setup_runtime_log
125
+
126
+ groups = klass.tests_in_groups(test_root, 2)
127
+ groups.size.should == 2
128
+
129
+ groups[0].should == groups[0].sort
130
+ groups[1].should == groups[1].sort
131
+ end
132
+
133
+ it "partitions by round-robin when not sorting" do
134
+ files = ["file1.rb", "file2.rb", "file3.rb", "file4.rb"]
135
+ klass.should_receive(:find_tests).and_return(files)
136
+ groups = klass.tests_in_groups(files, 2, :no_sort => true)
137
+ groups[0].should == ["file1.rb", "file3.rb"]
138
+ groups[1].should == ["file2.rb", "file4.rb"]
139
+ end
140
+
141
+ it "alpha-sorts partitions when not sorting by runtime" do
142
+ files = %w[q w e r t y u i o p a s d f g h j k l z x c v b n m]
143
+ klass.should_receive(:find_tests).and_return(files)
144
+ groups = klass.tests_in_groups(files, 2, :no_sort => true)
145
+ groups[0].should == groups[0].sort
146
+ groups[1].should == groups[1].sort
147
+ end
148
+ end
149
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: parallelized_specs
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Jake Sorce, Bryan Madsen
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-04-17 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: parallel
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ description:
35
+ email: jake@instructure.com
36
+ executables:
37
+ - parallel_test
38
+ - parallel_spec
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - Gemfile
45
+ - Gemfile.lock
46
+ - Rakefile
47
+ - Readme.md
48
+ - VERSION
49
+ - bin/parallel_spec
50
+ - bin/parallel_test
51
+ - lib/parallel_specs.rb
52
+ - lib/parallel_specs/spec_error_count_logger.rb
53
+ - lib/parallel_specs/spec_error_logger.rb
54
+ - lib/parallel_specs/spec_failures_logger.rb
55
+ - lib/parallel_specs/spec_logger_base.rb
56
+ - lib/parallel_specs/spec_runtime_logger.rb
57
+ - lib/parallel_specs/spec_start_finish_logger.rb
58
+ - lib/parallel_specs/spec_summary_logger.rb
59
+ - lib/parallel_tests.rb
60
+ - lib/parallel_tests/grouper.rb
61
+ - lib/parallel_tests/railtie.rb
62
+ - lib/parallel_tests/runtime_logger.rb
63
+ - lib/parallel_tests/tasks.rb
64
+ - lib/tasks/parallel_tests.rake
65
+ - parallelized_specs.gemspec
66
+ - spec/integration_spec.rb
67
+ - spec/parallel_specs/spec_failure_logger_spec.rb
68
+ - spec/parallel_specs/spec_runtime_logger_spec.rb
69
+ - spec/parallel_specs/spec_summary_logger_spec.rb
70
+ - spec/parallel_specs_spec.rb
71
+ - spec/parallel_tests/runtime_logger_spec.rb
72
+ - spec/parallel_tests_spec.rb
73
+ - spec/spec_helper.rb
74
+ homepage: http://github.com/jake/parallelized_specs
75
+ licenses: []
76
+
77
+ post_install_message:
78
+ rdoc_options: []
79
+
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ hash: 3
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ requirements: []
101
+
102
+ rubyforge_project:
103
+ rubygems_version: 1.8.22
104
+ signing_key:
105
+ specification_version: 3
106
+ summary: Run rspec tests in parallel
107
+ test_files: []
108
+
109
+ has_rdoc: