jperkins-deep_test 1.2.2

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.
Files changed (117) hide show
  1. data/CHANGELOG +47 -0
  2. data/README.rdoc +228 -0
  3. data/Rakefile +247 -0
  4. data/bin/deep_test +15 -0
  5. data/lib/deep_test.rb +91 -0
  6. data/lib/deep_test/database/mysql_setup_listener.rb +112 -0
  7. data/lib/deep_test/database/postgresql_setup_listener.rb +116 -0
  8. data/lib/deep_test/database/setup_listener.rb +125 -0
  9. data/lib/deep_test/deadlock_detector.rb +7 -0
  10. data/lib/deep_test/distributed/dispatch_controller.rb +53 -0
  11. data/lib/deep_test/distributed/drb_client_connection_info.rb +15 -0
  12. data/lib/deep_test/distributed/filename_resolver.rb +40 -0
  13. data/lib/deep_test/distributed/master_test_server.rb +52 -0
  14. data/lib/deep_test/distributed/multi_test_server_proxy.rb +44 -0
  15. data/lib/deep_test/distributed/null_work_unit.rb +12 -0
  16. data/lib/deep_test/distributed/remote_worker_client.rb +54 -0
  17. data/lib/deep_test/distributed/remote_worker_server.rb +82 -0
  18. data/lib/deep_test/distributed/rsync.rb +37 -0
  19. data/lib/deep_test/distributed/show_status.rhtml +41 -0
  20. data/lib/deep_test/distributed/test_server.rb +78 -0
  21. data/lib/deep_test/distributed/test_server_status.rb +9 -0
  22. data/lib/deep_test/distributed/test_server_workers.rb +24 -0
  23. data/lib/deep_test/distributed/throughput_runner.rb +42 -0
  24. data/lib/deep_test/distributed/throughput_statistics.rb +26 -0
  25. data/lib/deep_test/distributed/throughput_worker_client.rb +19 -0
  26. data/lib/deep_test/extensions/drb_extension.rb +34 -0
  27. data/lib/deep_test/extensions/object_extension.rb +40 -0
  28. data/lib/deep_test/listener_list.rb +17 -0
  29. data/lib/deep_test/local_workers.rb +55 -0
  30. data/lib/deep_test/logger.rb +17 -0
  31. data/lib/deep_test/marshallable_exception_wrapper.rb +44 -0
  32. data/lib/deep_test/metrics/gatherer.rb +67 -0
  33. data/lib/deep_test/metrics/queue_lock_wait_time_measurement.rb +133 -0
  34. data/lib/deep_test/null_worker_listener.rb +62 -0
  35. data/lib/deep_test/option.rb +60 -0
  36. data/lib/deep_test/options.rb +110 -0
  37. data/lib/deep_test/process_orchestrator.rb +49 -0
  38. data/lib/deep_test/rake_tasks.rb +11 -0
  39. data/lib/deep_test/result_reader.rb +36 -0
  40. data/lib/deep_test/rspec_detector.rb +21 -0
  41. data/lib/deep_test/server.rb +75 -0
  42. data/lib/deep_test/spec.rb +13 -0
  43. data/lib/deep_test/spec/extensions/example_group_methods.rb +64 -0
  44. data/lib/deep_test/spec/extensions/example_methods.rb +46 -0
  45. data/lib/deep_test/spec/extensions/options.rb +43 -0
  46. data/lib/deep_test/spec/extensions/reporter.rb +29 -0
  47. data/lib/deep_test/spec/extensions/spec_task.rb +20 -0
  48. data/lib/deep_test/spec/runner.rb +57 -0
  49. data/lib/deep_test/spec/work_result.rb +33 -0
  50. data/lib/deep_test/spec/work_unit.rb +59 -0
  51. data/lib/deep_test/test.rb +10 -0
  52. data/lib/deep_test/test/extensions/error.rb +14 -0
  53. data/lib/deep_test/test/runner.rb +24 -0
  54. data/lib/deep_test/test/supervised_test_suite.rb +49 -0
  55. data/lib/deep_test/test/work_result.rb +34 -0
  56. data/lib/deep_test/test/work_unit.rb +40 -0
  57. data/lib/deep_test/test_task.rb +47 -0
  58. data/lib/deep_test/ui/console.rb +76 -0
  59. data/lib/deep_test/ui/null.rb +17 -0
  60. data/lib/deep_test/warlock.rb +134 -0
  61. data/lib/deep_test/worker.rb +57 -0
  62. data/script/internal/run_test_suite.rb +7 -0
  63. data/script/public/master_test_server.rb +24 -0
  64. data/script/public/test_server.rb +18 -0
  65. data/script/public/test_throughput.rb +29 -0
  66. data/spec/deep_test/option_spec.rb +33 -0
  67. data/spec/deep_test/options_spec.rb +183 -0
  68. data/spec/deep_test/spec/extensions/example_group_methods_spec.rb +48 -0
  69. data/spec/deep_test/spec/extensions/example_methods_spec.rb +61 -0
  70. data/spec/deep_test/spec/extensions/options_spec.rb +23 -0
  71. data/spec/deep_test/spec/extensions/reporter_spec.rb +28 -0
  72. data/spec/deep_test/spec/extensions/spec_task_spec.rb +36 -0
  73. data/spec/deep_test/spec/runner_spec.rb +106 -0
  74. data/spec/deep_test/spec/work_result_spec.rb +14 -0
  75. data/spec/deep_test/spec/work_unit_spec.rb +78 -0
  76. data/spec/spec_helper.rb +59 -0
  77. data/spec/thread_worker.rb +25 -0
  78. data/test/deep_test/database/mysql_setup_listener_test.rb +14 -0
  79. data/test/deep_test/distributed/dispatch_controller_test.rb +209 -0
  80. data/test/deep_test/distributed/drb_client_connection_info_test.rb +42 -0
  81. data/test/deep_test/distributed/filename_resolver_test.rb +52 -0
  82. data/test/deep_test/distributed/master_test_server_test.rb +32 -0
  83. data/test/deep_test/distributed/multi_test_server_proxy_test.rb +96 -0
  84. data/test/deep_test/distributed/remote_worker_client_test.rb +180 -0
  85. data/test/deep_test/distributed/remote_worker_server_test.rb +99 -0
  86. data/test/deep_test/distributed/rsync_test.rb +67 -0
  87. data/test/deep_test/distributed/test_server_test.rb +94 -0
  88. data/test/deep_test/distributed/test_server_workers_test.rb +26 -0
  89. data/test/deep_test/distributed/throughput_runner_test.rb +68 -0
  90. data/test/deep_test/distributed/throughput_worker_client_test.rb +28 -0
  91. data/test/deep_test/extensions/object_extension_test.rb +37 -0
  92. data/test/deep_test/listener_list_test.rb +20 -0
  93. data/test/deep_test/local_workers_test.rb +22 -0
  94. data/test/deep_test/logger_test.rb +11 -0
  95. data/test/deep_test/marshallable_exception_wrapper_test.rb +44 -0
  96. data/test/deep_test/metrics/gatherer_test.rb +66 -0
  97. data/test/deep_test/process_orchestrator_test.rb +11 -0
  98. data/test/deep_test/result_reader_test.rb +128 -0
  99. data/test/deep_test/server_test.rb +58 -0
  100. data/test/deep_test/test/extensions/error_test.rb +40 -0
  101. data/test/deep_test/test/runner_test.rb +7 -0
  102. data/test/deep_test/test/supervised_test_suite_test.rb +79 -0
  103. data/test/deep_test/test/work_result_test.rb +81 -0
  104. data/test/deep_test/test/work_unit_test.rb +61 -0
  105. data/test/deep_test/test_task_test.rb +43 -0
  106. data/test/deep_test/ui/console_test.rb +9 -0
  107. data/test/deep_test/warlock_test.rb +38 -0
  108. data/test/deep_test/worker_test.rb +94 -0
  109. data/test/failing.rake +11 -0
  110. data/test/failing.rb +7 -0
  111. data/test/fake_deadlock_error.rb +12 -0
  112. data/test/simple_test_blackboard.rb +45 -0
  113. data/test/simple_test_blackboard_test.rb +33 -0
  114. data/test/test_factory.rb +74 -0
  115. data/test/test_helper.rb +15 -0
  116. data/test/test_task_test.rb +72 -0
  117. metadata +214 -0
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ unit_tests do
4
+ test "should support setting timeout_in_seconds" do
5
+ t = DeepTest::TestTask.new :deep_test do |t|
6
+ t.stubs(:desc)
7
+ t.stubs(:task)
8
+ t.timeout_in_seconds = 20
9
+ end
10
+ assert_equal 20, t.instance_variable_get(:@options).timeout_in_seconds
11
+ assert_equal 20, t.timeout_in_seconds
12
+ end
13
+
14
+ test "should support setting distributed_server" do
15
+ t = DeepTest::TestTask.new :deep_test do |t|
16
+ t.stubs(:desc)
17
+ t.stubs(:task)
18
+ t.distributed_server = "uri"
19
+ end
20
+ assert_equal "uri", t.instance_variable_get(:@options).distributed_server
21
+ assert_equal "uri", t.distributed_server
22
+ end
23
+
24
+ test "should support worker_listener" do
25
+ t = DeepTest::TestTask.new :deep_test do |t|
26
+ t.stubs(:desc)
27
+ t.stubs(:task)
28
+ t.worker_listener = "A"
29
+ end
30
+ assert_equal "A", t.instance_variable_get(:@options).worker_listener
31
+ assert_equal "A", t.worker_listener
32
+ end
33
+
34
+ test "should support server_port" do
35
+ t = DeepTest::TestTask.new :deep_test do |t|
36
+ t.stubs(:desc)
37
+ t.stubs(:task)
38
+ t.server_port = 10
39
+ end
40
+ assert_equal 10, t.instance_variable_get(:@options).server_port
41
+ assert_equal 10, t.server_port
42
+ end
43
+ end
@@ -0,0 +1,9 @@
1
+ require File.dirname(__FILE__) + "/../../test_helper"
2
+
3
+ unit_tests do
4
+ test "dispatch_finished doesn't fail if spinner is nil" do
5
+ assert_nothing_raised do
6
+ DeepTest::UI::Console.new(:options).dispatch_finished(:method_name)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ unit_tests do
4
+ test "running? is true if sending kill(0, pid) does not fail" do
5
+ warlock = DeepTest::Warlock.new
6
+ Process.expects(:kill).with(0, :pid)
7
+ assert_equal true, warlock.running?(:pid)
8
+ end
9
+
10
+ test "running? is false if Process.kill(0, pid) raises Errno::ESRCH" do
11
+ warlock = DeepTest::Warlock.new
12
+ Process.stubs(:kill).raises(Errno::ESRCH)
13
+ assert_equal false, warlock.running?(:pid)
14
+ end
15
+
16
+ test "running? is true if Process.kill raises Exception" do
17
+ warlock = DeepTest::Warlock.new
18
+ Process.stubs(:kill).raises(Exception)
19
+ assert_equal true, warlock.running?(:pid)
20
+ end
21
+
22
+ test "demon_count is 0 initially" do
23
+ assert_equal 0, DeepTest::Warlock.new.demon_count
24
+ end
25
+
26
+ test "add_demon increases demon_count by 1" do
27
+ warlock = DeepTest::Warlock.new
28
+ warlock.send(:add_demon, "name", 1)
29
+ assert_equal 1, warlock.demon_count
30
+ end
31
+
32
+ test "remove_demon increases demon_count by 1" do
33
+ warlock = DeepTest::Warlock.new
34
+ warlock.send(:add_demon, "name", 1)
35
+ warlock.send(:remove_demon, "name", 1)
36
+ assert_equal 0, warlock.demon_count
37
+ end
38
+ end
@@ -0,0 +1,94 @@
1
+ require File.dirname(__FILE__) + "/../test_helper"
2
+
3
+ unit_tests do
4
+ test "puts result on blackboard" do
5
+ blackboard = DeepTest::SimpleTestBlackboard.new
6
+ blackboard.write_work DeepTest::Test::WorkUnit.new(TestFactory.passing_test)
7
+
8
+ DeepTest::Worker.new(0, blackboard,stub_everything).run
9
+
10
+ assert_kind_of Test::Unit::TestResult, blackboard.take_result
11
+ end
12
+
13
+ test "puts passing and failing tests on blackboard for each test" do
14
+ blackboard = DeepTest::SimpleTestBlackboard.new
15
+ blackboard.write_work DeepTest::Test::WorkUnit.new(TestFactory.passing_test)
16
+ blackboard.write_work DeepTest::Test::WorkUnit.new(TestFactory.failing_test)
17
+
18
+ DeepTest::Worker.new(0, blackboard, stub_everything).run
19
+
20
+ result_1 = blackboard.take_result
21
+ result_2 = blackboard.take_result
22
+
23
+ assert_equal true, (result_1.passed? || result_2.passed?)
24
+ assert_equal false, (result_1.passed? && result_2.passed?)
25
+ end
26
+
27
+ test "notifies listener that it is starting" do
28
+ blackboard = DeepTest::SimpleTestBlackboard.new
29
+ listener = stub_everything
30
+ worker = DeepTest::Worker.new(0, blackboard, listener)
31
+ listener.expects(:starting).with(worker)
32
+ worker.run
33
+ end
34
+
35
+ test "notifies listener that it is about to do work" do
36
+ blackboard = DeepTest::SimpleTestBlackboard.new
37
+ work_unit = DeepTest::Test::WorkUnit.new(TestFactory.passing_test)
38
+ blackboard.write_work work_unit
39
+ listener = stub_everything
40
+ worker = DeepTest::Worker.new(0, blackboard, listener)
41
+ listener.expects(:starting_work).with(worker, work_unit)
42
+ worker.run
43
+ end
44
+
45
+ test "notifies listener that it has done work" do
46
+ blackboard = DeepTest::SimpleTestBlackboard.new
47
+ work_unit = mock(:run => :result)
48
+ blackboard.write_work work_unit
49
+ listener = stub_everything
50
+ worker = DeepTest::Worker.new(0, blackboard, listener)
51
+ listener.expects(:finished_work).with(worker, work_unit, :result)
52
+ worker.run
53
+ end
54
+
55
+ test "exception raised by work unit gives in Worker::Error" do
56
+ blackboard = DeepTest::SimpleTestBlackboard.new
57
+ work_unit = mock
58
+ work_unit.expects(:run).raises(exception = RuntimeError.new)
59
+ blackboard.write_work work_unit
60
+
61
+ DeepTest::Worker.new(0, blackboard, stub_everything).run
62
+
63
+ assert_equal DeepTest::Worker::Error.new(work_unit, exception),
64
+ blackboard.take_result
65
+ end
66
+
67
+ test "requests work until it finds some" do
68
+ blackboard = mock
69
+ blackboard.expects(:take_work).times(3).
70
+ raises(DeepTest::Server::NoWorkUnitsAvailableError).
71
+ returns(work_unit = mock(:run => nil)).
72
+ returns(nil)
73
+
74
+ blackboard.expects(:write_result)
75
+
76
+ DeepTest::Worker.new(0, blackboard, stub_everything).run
77
+ end
78
+
79
+ test "finishes running when no more work units are remaining" do
80
+ blackboard = mock
81
+ blackboard.expects(:take_work).
82
+ raises(DeepTest::Server::NoWorkUnitsRemainingError)
83
+
84
+ DeepTest::Worker.new(0, blackboard, stub_everything).run
85
+ end
86
+
87
+ test "number is available to indentify worker" do
88
+ assert_equal 1, DeepTest::Worker.new(1, nil, nil).number
89
+ end
90
+
91
+ test "does not fork from rake" do
92
+ assert !defined?($rakefile)
93
+ end
94
+ end
data/test/failing.rake ADDED
@@ -0,0 +1,11 @@
1
+ require 'rake'
2
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
+ require "deep_test"
4
+ require "deep_test/rake_tasks"
5
+
6
+ task :default => %w[deep_test_failing]
7
+
8
+ DeepTest::TestTask.new :deep_test_failing do |t|
9
+ t.number_of_workers = 1
10
+ t.pattern = "test/failing.rb"
11
+ end
data/test/failing.rb ADDED
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + "/test_helper"
2
+
3
+ unit_tests do
4
+ test "failing" do
5
+ assert false
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ unless defined?(ActiveRecord::StatementInvalid)
2
+ module ActiveRecord
3
+ class StatementInvalid < StandardError
4
+ end
5
+ end
6
+ end
7
+
8
+ class FakeDeadlockError
9
+ def self.new
10
+ ActiveRecord::StatementInvalid.new("Deadlock found when trying to get lock")
11
+ end
12
+ end
@@ -0,0 +1,45 @@
1
+ module DeepTest
2
+ class SimpleTestBlackboard
3
+ attr_accessor :debug, :simulate_result_overdue_error
4
+
5
+ def initialize
6
+ @work_units = []
7
+ @test_results = []
8
+ @semaphore = Mutex.new
9
+ end
10
+
11
+ def take_result
12
+ raise DeepTest::Server::ResultOverdueError if @simulate_result_overdue_error
13
+ @semaphore.synchronize do
14
+ log_and_return "take_result", @test_results.shift
15
+ end
16
+ end
17
+
18
+ def take_work
19
+ @semaphore.synchronize do
20
+ log_and_return "take_work", @work_units.shift
21
+ end
22
+ end
23
+
24
+ def write_result(result)
25
+ @semaphore.synchronize do
26
+ log_and_return "write_result", result
27
+ @test_results.push result
28
+ end
29
+ end
30
+
31
+ def write_work(work_unit)
32
+ @semaphore.synchronize do
33
+ log_and_return "write_work", work_unit
34
+ @work_units.push work_unit
35
+ end
36
+ end
37
+
38
+ def log_and_return(message, object)
39
+ if debug && object
40
+ puts "* #{message} #{object.inspect}"
41
+ end
42
+ object
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,33 @@
1
+ require File.dirname(__FILE__) + "/test_helper"
2
+
3
+ unit_tests do
4
+ test "a test that is put on can be taken off later" do
5
+ blackboard = DeepTest::SimpleTestBlackboard.new
6
+ test_case = TestFactory.passing_test
7
+ blackboard.write_work test_case
8
+ assert_equal test_case, blackboard.take_work
9
+ end
10
+
11
+ test "taking a test when all have been taken returns nil" do
12
+ blackboard = DeepTest::SimpleTestBlackboard.new
13
+ test_case = TestFactory.passing_test
14
+ blackboard.write_work test_case
15
+ blackboard.take_work
16
+ assert_nil blackboard.take_work
17
+ end
18
+
19
+ test "a result that is put on can be taken off later" do
20
+ blackboard = DeepTest::SimpleTestBlackboard.new
21
+ result = TestFactory.passed_result
22
+ blackboard.write_result result
23
+ assert_equal result, blackboard.take_result
24
+ end
25
+
26
+ test "taking a result when all have been taken returns nil" do
27
+ blackboard = DeepTest::SimpleTestBlackboard.new
28
+ result = TestFactory.passed_result
29
+ blackboard.write_result result
30
+ blackboard.take_result
31
+ assert_nil blackboard.take_result
32
+ end
33
+ end
@@ -0,0 +1,74 @@
1
+ module TestFactory
2
+ def self.failing_test
3
+ test_class do
4
+ def test_failing
5
+ assert_equal 1, 0
6
+ end
7
+ end.new(:test_failing)
8
+ end
9
+
10
+ def self.passed_result
11
+ result = Test::Unit::TestResult.new
12
+ result.add_run
13
+ result.add_assertion
14
+ result
15
+ end
16
+
17
+ def self.passing_test
18
+ test_class do
19
+ def test_passing
20
+ assert_equal 0, 0
21
+ end
22
+ end.new(:test_passing)
23
+ end
24
+
25
+ def self.passing_test_with_stdout
26
+ test_class do
27
+ def test_passing_with_stdout
28
+ print "message printed to stdout"
29
+ assert true
30
+ end
31
+ end.new :test_passing_with_stdout
32
+ end
33
+
34
+ def self.deadlock_once_test
35
+ test_class do
36
+ def test_deadlock_once
37
+ if @deadlocked
38
+ assert true
39
+ else
40
+ @deadlocked = true
41
+ raise FakeDeadlockError.new
42
+ end
43
+ end
44
+ end.new :test_deadlock_once
45
+ end
46
+
47
+ def self.deadlock_always_test
48
+ test_class do
49
+ def test_deadlock_always
50
+ raise FakeDeadlockError.new
51
+ end
52
+ end.new :test_deadlock_always
53
+ end
54
+
55
+ def self.suite
56
+ Test::Unit::TestSuite.new
57
+ end
58
+
59
+ def self.test_class(&block)
60
+ test_class = Class.new(Test::Unit::TestCase)
61
+
62
+ class_name = external_caller.upcase.gsub(/[^A-Z0-9]/,"_").sub(/^_*/,'')
63
+ const_set(class_name, test_class)
64
+
65
+ test_class.class_eval &block
66
+ test_class
67
+ end
68
+
69
+ def self.external_caller
70
+ caller.each do |trace_line|
71
+ return trace_line unless trace_line =~ /test_factory.rb/
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'dust'
4
+ require 'mocha'
5
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + "/../lib")
6
+ require "deep_test"
7
+ require 'set'
8
+
9
+ require File.dirname(__FILE__) + "/fake_deadlock_error"
10
+ require File.dirname(__FILE__) + "/simple_test_blackboard"
11
+ require File.dirname(__FILE__) + "/test_factory"
12
+ require File.dirname(__FILE__) + "/../spec/thread_worker"
13
+
14
+ class SomeCustomException < RuntimeError
15
+ end
@@ -0,0 +1,72 @@
1
+ require File.dirname(__FILE__) + "/test_helper"
2
+
3
+ unit_tests do
4
+ test "defines a rake task with the name passed to the constructor" do
5
+ DeepTest::TestTask.any_instance.stubs(:desc)
6
+ DeepTest::TestTask.any_instance.expects(:task).with(:my_task_name)
7
+ DeepTest::TestTask.new :my_task_name do
8
+ end
9
+ end
10
+
11
+ test "setting pattern" do
12
+ pattern = "test/**/x*_test.rb"
13
+ task = DeepTest::TestTask.new do |t|
14
+ t.stubs(:define)
15
+ t.pattern = pattern
16
+ end
17
+ assert_equal pattern, task.pattern[-pattern.size..-1]
18
+ end
19
+
20
+ test "default pattern is test/**/*_test.rb" do
21
+ task = DeepTest::TestTask.new do |t|
22
+ t.stubs(:define)
23
+ end
24
+ assert_equal "test/**/*_test.rb", task.pattern[-"test/**/*_test.rb".size..-1]
25
+ end
26
+
27
+ test "default libs is ['lib']" do
28
+ task = DeepTest::TestTask.new do |t|
29
+ t.stubs(:define)
30
+ end
31
+ assert_equal ["lib"], task.libs
32
+ end
33
+
34
+ test "can add to libs" do
35
+ task = DeepTest::TestTask.new do |t|
36
+ t.libs << "test"
37
+ t.stubs(:define)
38
+ end
39
+ assert_equal ["lib", "test"], task.libs
40
+ end
41
+
42
+ test "define passes the -I option to the call to ruby" do
43
+ task = DeepTest::TestTask.new do |t|
44
+ t.libs << "test"
45
+ end
46
+ task.expects(:ruby).with(includes("-Ilib:test"))
47
+ Rake::Task["deep_test"].instance_variable_get("@actions").last.call
48
+ end
49
+
50
+ test "define does not pass the -I option to the call to ruby if there are no directories to add to the load path" do
51
+ task = DeepTest::TestTask.new do |t|
52
+ t.libs = []
53
+ end
54
+ task.expects(:ruby).with(Not(includes("-I")))
55
+ Rake::Task["deep_test"].instance_variable_get("@actions").last.call
56
+ end
57
+
58
+ test "number_of_workers defaults to 2" do
59
+ task = DeepTest::TestTask.new do |t|
60
+ t.stubs(:define)
61
+ end
62
+ assert_equal 2, task.number_of_workers
63
+ end
64
+
65
+ test "number_of_workers can be set" do
66
+ task = DeepTest::TestTask.new do |t|
67
+ t.number_of_workers = 42
68
+ t.stubs(:define)
69
+ end
70
+ assert_equal 42, task.number_of_workers
71
+ end
72
+ end