parallel_tests 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -107,6 +107,7 @@ inspired by [pivotal labs](http://pivotallabs.com/users/miked/blog/articles/849-
107
107
  - [Charles Finkel](http://charlesfinkel.com/)
108
108
  - [Jason Morrison](http://jayunit.net)
109
109
  - [Joakim Kolsjö](http://www.rubyblocks.se)
110
+ - [Kevin Scaldeferri](http://kevin.scaldeferri.com/blog/)
110
111
  - [Kpumuk](http://kpumuk.info/)
111
112
  - [Maksim Horbu](http://github.com/mhorbul)
112
113
  - [Rohan Deshpande](http://github.com/rdeshpande)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.3.4
@@ -2,8 +2,8 @@ require File.join(File.dirname(__FILE__), 'parallel_tests')
2
2
 
3
3
  class ParallelCucumber < ParallelTests
4
4
  def self.run_tests(test_files, process_number, options)
5
- color = ($stdout.tty? ? 'export AUTOTEST=1 ;' : '')#display color when we are in a terminal
6
- cmd = "export RAILS_ENV=test ; #{color} #{executable} #{options} #{test_files*' '}"
5
+ color = ($stdout.tty? ? 'AUTOTEST=1 ; export AUTOTEST ;' : '')#display color when we are in a terminal
6
+ cmd = "RAILS_ENV=test ; export RAILS_ENV ; #{color} #{executable} #{options} #{test_files*' '}"
7
7
  execute_command(cmd, process_number)
8
8
  end
9
9
 
@@ -22,7 +22,7 @@ class ParallelCucumber < ParallelTests
22
22
  def self.line_is_result?(line)
23
23
  line =~ /^\d+ (steps|scenarios)/
24
24
  end
25
-
25
+
26
26
  def self.line_is_failure?(line)
27
27
  line =~ /^\d+ (steps|scenarios).*(\d{2,}|[1-9]) failed/
28
28
  end
@@ -4,8 +4,8 @@ class ParallelSpecs < ParallelTests
4
4
  def self.run_tests(test_files, process_number, options)
5
5
  spec_opts = ['spec/parallel_spec.opts', 'spec/spec.opts'].detect{|f| File.file?(f) }
6
6
  spec_opts = (spec_opts ? "-O #{spec_opts}" : nil)
7
- color = ($stdout.tty? ? 'export RSPEC_COLOR=1 ;' : '')#display color when we are in a terminal
8
- cmd = "export RAILS_ENV=test ; #{color} #{executable} #{options} #{spec_opts} #{test_files*' '}"
7
+ color = ($stdout.tty? ? 'RSPEC_COLOR=1 ; export RSPEC_COLOR ;' : '')#display color when we are in a terminal
8
+ cmd = "RAILS_ENV=test ; export RAILS_ENV ; #{color} #{executable} #{options} #{spec_opts} #{test_files*' '}"
9
9
  execute_command(cmd, process_number)
10
10
  end
11
11
 
@@ -21,30 +21,25 @@ class ParallelTests
21
21
  def self.tests_in_groups(root, num)
22
22
  tests_with_sizes = slow_specs_first(find_tests_with_sizes(root))
23
23
 
24
- groups = []
25
- current_group = current_size = 0
24
+ # always add to smallest group
25
+ groups = Array.new(num){{:tests => [], :size => 0}}
26
26
  tests_with_sizes.each do |test, size|
27
- # inserts into next group if current is full and we are not in the last group
28
- if (0.5*size + current_size) > group_size(tests_with_sizes, num) and num > current_group + 1
29
- current_size = size
30
- current_group += 1
31
- else
32
- current_size += size
33
- end
34
- groups[current_group] ||= []
35
- groups[current_group] << test
27
+ smallest = groups.sort_by{|g| g[:size] }.first
28
+ smallest[:tests] << test
29
+ smallest[:size] += size
36
30
  end
37
- groups.compact
31
+
32
+ groups.map{|g| g[:tests] }
38
33
  end
39
34
 
40
35
  def self.run_tests(test_files, process_number, options)
41
36
  require_list = test_files.map { |filename| "\"#{filename}\"" }.join(",")
42
- cmd = "export RAILS_ENV=test ; ruby -Itest #{options} -e '[#{require_list}].each {|f| require f }'"
37
+ cmd = "RAILS_ENV=test ; export RAILS_ENV ; ruby -Itest #{options} -e '[#{require_list}].each {|f| require f }'"
43
38
  execute_command(cmd, process_number)
44
39
  end
45
40
 
46
41
  def self.execute_command(cmd, process_number)
47
- cmd = "export TEST_ENV_NUMBER=#{test_env_number(process_number)} ; #{cmd}"
42
+ cmd = "TEST_ENV_NUMBER=#{test_env_number(process_number)} ; export TEST_ENV_NUMBER; #{cmd}"
48
43
  f = open("|#{cmd}", 'r')
49
44
  all = ''
50
45
  while char = f.getc
@@ -78,11 +73,11 @@ class ParallelTests
78
73
  def self.slow_specs_first(tests)
79
74
  tests.sort_by{|test, size| size }.reverse
80
75
  end
81
-
76
+
82
77
  def self.line_is_result?(line)
83
78
  line =~ /\d+ failure/
84
79
  end
85
-
80
+
86
81
  def self.line_is_failure?(line)
87
82
  line =~ /(\d{2,}|[1-9]) (failure|error)/
88
83
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{parallel_tests}
8
- s.version = "0.3.3"
8
+ s.version = "0.3.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Michael Grosser"]
12
- s.date = %q{2010-03-23}
12
+ s.date = %q{2010-03-27}
13
13
  s.email = %q{grosser.michael@gmail.com}
14
14
  s.executables = ["parallel_test", "parallel_spec", "parallel_cucumber"]
15
15
  s.extra_rdoc_files = [
data/spec/spec_helper.rb CHANGED
@@ -38,26 +38,17 @@ def test_tests_in_groups(klass, folder, suffix)
38
38
 
39
39
  it "partitions them into groups by equal size" do
40
40
  groups = klass.tests_in_groups(test_root, 2)
41
- groups.size.should == 2
42
- size_of(groups[0]).should == 400
43
- size_of(groups[1]).should == 400
41
+ groups.map{|g| size_of(g)}.should == [400, 400]
44
42
  end
45
43
 
46
44
  it 'should partition correctly with a group size of 4' do
47
45
  groups = klass.tests_in_groups(test_root, 4)
48
- groups.size.should == 4
49
- size_of(groups[0]).should == 200
50
- size_of(groups[1]).should == 200
51
- size_of(groups[2]).should == 200
52
- size_of(groups[3]).should == 200
46
+ groups.map{|g| size_of(g)}.should == [200, 200, 200, 200]
53
47
  end
54
48
 
55
49
  it 'should partition correctly with an uneven group size' do
56
50
  groups = klass.tests_in_groups(test_root, 3)
57
- groups.size.should == 3
58
- size_of(groups[0]).should == 300
59
- size_of(groups[1]).should == 300
60
- size_of(groups[2]).should == 200
51
+ groups.map{|g| size_of(g)}.should =~ [300, 300, 200]
61
52
  end
62
53
 
63
54
  it "partitions by runtime when runtime-data is available" do
@@ -68,11 +59,10 @@ def test_tests_in_groups(klass, folder, suffix)
68
59
 
69
60
  groups = klass.tests_in_groups(test_root, 2)
70
61
  groups.size.should == 2
71
- # 10 + 7 = 17
72
- groups[0].should == [@files[0],@files[7]]
73
- # 6+5+4+3+2+1 = 21
74
- # still room for optimization...
75
- groups[1].should == [@files[6],@files[5],@files[4],@files[3],@files[2],@files[1]]
62
+ # 10 + 5 + 3 + 1 = 19
63
+ groups[0].should == [@files[0],@files[5],@files[3],@files[1]]
64
+ # 7 + 6 + 4 + 2 = 19
65
+ groups[1].should == [@files[7],@files[6],@files[4],@files[2]]
76
66
  end
77
67
  end
78
68
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 3
9
- version: 0.3.3
8
+ - 4
9
+ version: 0.3.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Michael Grosser
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-23 00:00:00 +01:00
17
+ date: 2010-03-27 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency