Class: TestBalancer

Inherits:
Object
  • Object
show all
Defined in:
lib/test_balancer.rb,
lib/test_balancer/version.rb

Defined Under Namespace

Modules: Features, Specs Classes: Test

Constant Summary collapse

VERSION =
"0.0.1"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root) ⇒ TestBalancer

Returns a new instance of TestBalancer.



13
14
15
# File 'lib/test_balancer.rb', line 13

def initialize root
  @root = Pathname.new(root)
end

Instance Attribute Details

#rootObject (readonly)

Returns the value of attribute root.



11
12
13
# File 'lib/test_balancer.rb', line 11

def root
  @root
end

Instance Method Details

#allObject



17
18
19
# File 'lib/test_balancer.rb', line 17

def all
  @all ||= features + specs
end

#featuresObject



21
22
23
# File 'lib/test_balancer.rb', line 21

def features
  @features ||= Features.all(root)
end

#for(n) ⇒ Object

splits all tests into n groups based on their type (cucumber,spec,etc) TODO: add magic balancing based on execution time here



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/test_balancer.rb', line 31

def for n
  return [all.clone] if n == 1
  # debugger;1
  classes = all.map(&:class).uniq
  tests_by_class = all.group_by(&:class)
  groups_per_class = n / classes.length
  remainder = n - (groups_per_class * classes.length)

  groups = {}
  classes.each{ |klass, tests| groups[klass] = groups_per_class }
  
  p groups

  if remainder > 0 # add remainder to the largest class of tests
    # for now assume features are slower
    groups[TestBalancer::Features::Test] += remainder
    # klass = tests_by_class.sort_by{|(k,v)| v.length}.last.first
    # puts "#{klass} += #{remainder}"
    # groups[klass] += remainder
  end

  groups.values.inject(&:+) == n or raise "BUG!"

  p groups

  tests_by_class.each{|klass, tests|
    groups[klass] = tests.in_groups(groups[klass], false)
  }

  groups.values.flatten(1)
end

#specsObject



25
26
27
# File 'lib/test_balancer.rb', line 25

def specs
  @specs ||= Specs.all(root)
end