test-unit 1.2.3 → 2.0.0
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.
- data/History.txt +27 -0
- data/Manifest.txt +30 -8
- data/README.txt +9 -4
- data/Rakefile +16 -1
- data/bin/testrb +0 -0
- data/lib/test/unit/assertions.rb +148 -48
- data/lib/test/unit/attribute.rb +125 -0
- data/lib/test/unit/autorunner.rb +101 -71
- data/lib/test/unit/collector/descendant.rb +23 -0
- data/lib/test/unit/collector/dir.rb +1 -1
- data/lib/test/unit/collector/load.rb +135 -0
- data/lib/test/unit/color.rb +61 -0
- data/lib/test/unit/diff.rb +524 -0
- data/lib/test/unit/error.rb +70 -2
- data/lib/test/unit/exceptionhandler.rb +39 -0
- data/lib/test/unit/failure.rb +63 -4
- data/lib/test/unit/fixture.rb +185 -0
- data/lib/test/unit/notification.rb +125 -0
- data/lib/test/unit/omission.rb +143 -0
- data/lib/test/unit/pending.rb +146 -0
- data/lib/test/unit/priority.rb +146 -0
- data/lib/test/unit/runner/console.rb +46 -0
- data/lib/test/unit/runner/emacs.rb +8 -0
- data/lib/test/unit/testcase.rb +193 -76
- data/lib/test/unit/testresult.rb +37 -28
- data/lib/test/unit/testsuite.rb +35 -1
- data/lib/test/unit/ui/console/outputlevel.rb +14 -0
- data/lib/test/unit/ui/console/testrunner.rb +96 -28
- data/lib/test/unit/ui/emacs/testrunner.rb +49 -0
- data/lib/test/unit/ui/testrunner.rb +20 -0
- data/lib/test/unit/ui/testrunnermediator.rb +28 -19
- data/lib/test/unit/ui/testrunnerutilities.rb +2 -7
- data/lib/test/unit/util/backtracefilter.rb +2 -1
- data/lib/test/unit/version.rb +1 -1
- data/test/collector/test_descendant.rb +135 -0
- data/test/collector/test_load.rb +333 -0
- data/test/run-test.rb +13 -0
- data/test/test_assertions.rb +221 -56
- data/test/test_attribute.rb +86 -0
- data/test/test_color.rb +37 -0
- data/test/test_diff.rb +477 -0
- data/test/test_emacs_runner.rb +60 -0
- data/test/test_fixture.rb +275 -0
- data/test/test_notification.rb +33 -0
- data/test/test_omission.rb +81 -0
- data/test/test_pending.rb +70 -0
- data/test/test_priority.rb +89 -0
- data/test/test_testcase.rb +160 -5
- data/test/test_testresult.rb +61 -52
- data/test/testunit_test_util.rb +14 -0
- data/test/ui/test_testrunmediator.rb +20 -0
- metadata +53 -23
- data/lib/test/unit/ui/fox/testrunner.rb +0 -268
- data/lib/test/unit/ui/gtk/testrunner.rb +0 -416
- data/lib/test/unit/ui/gtk2/testrunner.rb +0 -465
- data/lib/test/unit/ui/tk/testrunner.rb +0 -260
- data/test/runit/test_assert.rb +0 -402
- data/test/runit/test_testcase.rb +0 -91
- data/test/runit/test_testresult.rb +0 -144
- data/test/runit/test_testsuite.rb +0 -49
data/lib/test/unit/testcase.rb
CHANGED
@@ -4,9 +4,16 @@
|
|
4
4
|
# Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
|
5
5
|
# License:: Ruby license.
|
6
6
|
|
7
|
+
require 'test/unit/attribute'
|
8
|
+
require 'test/unit/fixture'
|
9
|
+
require 'test/unit/exceptionhandler'
|
7
10
|
require 'test/unit/assertions'
|
8
11
|
require 'test/unit/failure'
|
9
12
|
require 'test/unit/error'
|
13
|
+
require 'test/unit/pending'
|
14
|
+
require 'test/unit/omission'
|
15
|
+
require 'test/unit/notification'
|
16
|
+
require 'test/unit/priority'
|
10
17
|
require 'test/unit/testsuite'
|
11
18
|
require 'test/unit/assertionfailederror'
|
12
19
|
require 'test/unit/util/backtracefilter'
|
@@ -19,89 +26,193 @@ module Test
|
|
19
26
|
# wrapping those tests into a suite. It also does the
|
20
27
|
# nitty-gritty of actually running an individual test and
|
21
28
|
# collecting its results into a Test::Unit::TestResult object.
|
29
|
+
#
|
30
|
+
# You can run two hooks before/after a TestCase run.
|
31
|
+
#
|
32
|
+
# Example:
|
33
|
+
# class TestMyClass < Test::Unit::TestCase
|
34
|
+
# class << self
|
35
|
+
# def startup
|
36
|
+
# ...
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# def shutdown
|
40
|
+
# ...
|
41
|
+
# end
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# def setup
|
45
|
+
# ...
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# def teardown
|
49
|
+
# ...
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# def test_my_method1
|
53
|
+
# ...
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# def test_my_method2
|
57
|
+
# ...
|
58
|
+
# end
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# Here is a call order:
|
62
|
+
# * startup
|
63
|
+
# * setup
|
64
|
+
# * test_my_method1
|
65
|
+
# * teardown
|
66
|
+
# * setup
|
67
|
+
# * test_my_method2
|
68
|
+
# * teardown
|
69
|
+
# * shutdown
|
22
70
|
class TestCase
|
71
|
+
include Attribute
|
72
|
+
include Fixture
|
73
|
+
include ExceptionHandler
|
74
|
+
include ErrorHandler
|
75
|
+
include FailureHandler
|
76
|
+
include TestCasePendingSupport
|
77
|
+
include TestCaseOmissionSupport
|
78
|
+
include TestCaseNotificationSupport
|
79
|
+
include Priority
|
23
80
|
include Assertions
|
24
81
|
include Util::BacktraceFilter
|
25
|
-
|
26
|
-
attr_reader :method_name
|
27
|
-
|
82
|
+
|
28
83
|
STARTED = name + "::STARTED"
|
29
84
|
FINISHED = name + "::FINISHED"
|
30
85
|
|
31
|
-
|
32
|
-
# These exceptions are not caught by #run.
|
86
|
+
DESCENDANTS = []
|
33
87
|
|
34
|
-
|
35
|
-
|
88
|
+
class << self
|
89
|
+
def inherited(sub_class)
|
90
|
+
DESCENDANTS << sub_class
|
91
|
+
end
|
92
|
+
|
93
|
+
# Rolls up all of the test* methods in the fixture into
|
94
|
+
# one suite, creating a new instance of the fixture for
|
95
|
+
# each method.
|
96
|
+
def suite
|
97
|
+
method_names = public_instance_methods(true).collect {|name| name.to_s}
|
98
|
+
tests = method_names.delete_if {|method_name| method_name !~ /^test./}
|
99
|
+
suite = TestSuite.new(name, self)
|
100
|
+
tests.sort.each do |test|
|
101
|
+
catch(:invalid_test) do
|
102
|
+
suite << new(test)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
if suite.empty?
|
106
|
+
catch(:invalid_test) do
|
107
|
+
suite << new("default_test")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
suite
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
attr_reader :method_name
|
36
115
|
|
37
116
|
# Creates a new instance of the fixture for running the
|
38
117
|
# test represented by test_method_name.
|
39
118
|
def initialize(test_method_name)
|
40
|
-
unless
|
41
|
-
|
42
|
-
method(test_method_name).arity == -1))
|
43
|
-
throw :invalid_test
|
44
|
-
end
|
119
|
+
throw :invalid_test unless respond_to?(test_method_name)
|
120
|
+
throw :invalid_test if method(test_method_name).arity > 0
|
45
121
|
@method_name = test_method_name
|
46
122
|
@test_passed = true
|
47
|
-
|
48
|
-
|
49
|
-
# Rolls up all of the test* methods in the fixture into
|
50
|
-
# one suite, creating a new instance of the fixture for
|
51
|
-
# each method.
|
52
|
-
def self.suite
|
53
|
-
method_names = public_instance_methods(true)
|
54
|
-
tests = method_names.delete_if {|method_name| method_name !~ /^test./}
|
55
|
-
suite = TestSuite.new(name)
|
56
|
-
tests.sort.each do
|
57
|
-
|test|
|
58
|
-
catch(:invalid_test) do
|
59
|
-
suite << new(test)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
if (suite.empty?)
|
63
|
-
catch(:invalid_test) do
|
64
|
-
suite << new("default_test")
|
65
|
-
end
|
66
|
-
end
|
67
|
-
return suite
|
123
|
+
@interrupted = false
|
68
124
|
end
|
69
125
|
|
70
126
|
# Runs the individual test method represented by this
|
71
127
|
# instance of the fixture, collecting statistics, failures
|
72
128
|
# and errors in result.
|
73
129
|
def run(result)
|
74
|
-
yield(STARTED, name)
|
75
|
-
@_result = result
|
76
130
|
begin
|
77
|
-
|
78
|
-
|
79
|
-
rescue AssertionFailedError => e
|
80
|
-
add_failure(e.message, e.backtrace)
|
81
|
-
rescue Exception
|
82
|
-
raise if PASSTHROUGH_EXCEPTIONS.include? $!.class
|
83
|
-
add_error($!)
|
84
|
-
ensure
|
131
|
+
@_result = result
|
132
|
+
yield(STARTED, name)
|
85
133
|
begin
|
86
|
-
|
87
|
-
|
88
|
-
add_failure(e.message, e.backtrace)
|
134
|
+
run_setup
|
135
|
+
__send__(@method_name)
|
89
136
|
rescue Exception
|
90
|
-
|
91
|
-
|
137
|
+
@interrupted = true
|
138
|
+
raise unless handle_exception($!)
|
139
|
+
ensure
|
140
|
+
begin
|
141
|
+
run_teardown
|
142
|
+
rescue Exception
|
143
|
+
raise unless handle_exception($!)
|
144
|
+
end
|
92
145
|
end
|
146
|
+
result.add_run
|
147
|
+
yield(FINISHED, name)
|
148
|
+
ensure
|
149
|
+
@_result = nil
|
93
150
|
end
|
94
|
-
result.add_run
|
95
|
-
yield(FINISHED, name)
|
96
151
|
end
|
97
152
|
|
98
153
|
# Called before every test method runs. Can be used
|
99
154
|
# to set up fixture information.
|
155
|
+
#
|
156
|
+
# You can add additional setup tasks by the following
|
157
|
+
# code:
|
158
|
+
# class TestMyClass < Test::Unit::TestCase
|
159
|
+
# def setup
|
160
|
+
# ...
|
161
|
+
# end
|
162
|
+
#
|
163
|
+
# setup
|
164
|
+
# def my_setup1
|
165
|
+
# ...
|
166
|
+
# end
|
167
|
+
#
|
168
|
+
# setup
|
169
|
+
# def my_setup2
|
170
|
+
# ...
|
171
|
+
# end
|
172
|
+
#
|
173
|
+
# def test_my_class
|
174
|
+
# ...
|
175
|
+
# end
|
176
|
+
# end
|
177
|
+
#
|
178
|
+
# Here is a call order:
|
179
|
+
# * setup
|
180
|
+
# * my_setup1
|
181
|
+
# * my_setup2
|
182
|
+
# * test_my_class
|
100
183
|
def setup
|
101
184
|
end
|
102
185
|
|
103
186
|
# Called after every test method runs. Can be used to tear
|
104
187
|
# down fixture information.
|
188
|
+
#
|
189
|
+
# You can add additional teardown tasks by the following
|
190
|
+
# code:
|
191
|
+
# class TestMyClass < Test::Unit::TestCase
|
192
|
+
# def teardown
|
193
|
+
# ...
|
194
|
+
# end
|
195
|
+
#
|
196
|
+
# teardown
|
197
|
+
# def my_teardown1
|
198
|
+
# ...
|
199
|
+
# end
|
200
|
+
#
|
201
|
+
# teardown
|
202
|
+
# def my_teardown2
|
203
|
+
# ...
|
204
|
+
# end
|
205
|
+
#
|
206
|
+
# def test_my_class
|
207
|
+
# ...
|
208
|
+
# end
|
209
|
+
# end
|
210
|
+
#
|
211
|
+
# Here is a call order:
|
212
|
+
# * test_my_class
|
213
|
+
# * my_teardown2
|
214
|
+
# * my_teardown1
|
215
|
+
# * teardown
|
105
216
|
def teardown
|
106
217
|
end
|
107
218
|
|
@@ -109,35 +220,10 @@ module Test
|
|
109
220
|
flunk("No tests were specified")
|
110
221
|
end
|
111
222
|
|
112
|
-
# Returns whether this individual test passed or
|
113
|
-
# not. Primarily for use in teardown so that artifacts
|
114
|
-
# can be left behind if the test fails.
|
115
|
-
def passed?
|
116
|
-
return @test_passed
|
117
|
-
end
|
118
|
-
private :passed?
|
119
|
-
|
120
223
|
def size
|
121
224
|
1
|
122
225
|
end
|
123
226
|
|
124
|
-
def add_assertion
|
125
|
-
@_result.add_assertion
|
126
|
-
end
|
127
|
-
private :add_assertion
|
128
|
-
|
129
|
-
def add_failure(message, all_locations=caller())
|
130
|
-
@test_passed = false
|
131
|
-
@_result.add_failure(Failure.new(name, filter_backtrace(all_locations), message))
|
132
|
-
end
|
133
|
-
private :add_failure
|
134
|
-
|
135
|
-
def add_error(exception)
|
136
|
-
@test_passed = false
|
137
|
-
@_result.add_error(Error.new(name, exception))
|
138
|
-
end
|
139
|
-
private :add_error
|
140
|
-
|
141
227
|
# Returns a human-readable name for the specific test that
|
142
228
|
# this instance of TestCase represents.
|
143
229
|
def name
|
@@ -148,13 +234,44 @@ module Test
|
|
148
234
|
def to_s
|
149
235
|
name
|
150
236
|
end
|
151
|
-
|
237
|
+
|
152
238
|
# It's handy to be able to compare TestCase instances.
|
153
239
|
def ==(other)
|
154
240
|
return false unless(other.kind_of?(self.class))
|
155
241
|
return false unless(@method_name == other.method_name)
|
156
242
|
self.class == other.class
|
157
243
|
end
|
244
|
+
|
245
|
+
def interrupted?
|
246
|
+
@interrupted
|
247
|
+
end
|
248
|
+
|
249
|
+
private
|
250
|
+
def current_result
|
251
|
+
@_result
|
252
|
+
end
|
253
|
+
|
254
|
+
def handle_exception(exception)
|
255
|
+
self.class.exception_handlers.each do |handler|
|
256
|
+
return true if send(handler, exception)
|
257
|
+
end
|
258
|
+
false
|
259
|
+
end
|
260
|
+
|
261
|
+
# Returns whether this individual test passed or
|
262
|
+
# not. Primarily for use in teardown so that artifacts
|
263
|
+
# can be left behind if the test fails.
|
264
|
+
def passed?
|
265
|
+
@test_passed
|
266
|
+
end
|
267
|
+
|
268
|
+
def problem_occurred
|
269
|
+
@test_passed = false
|
270
|
+
end
|
271
|
+
|
272
|
+
def add_assertion
|
273
|
+
current_result.add_assertion
|
274
|
+
end
|
158
275
|
end
|
159
276
|
end
|
160
277
|
end
|
data/lib/test/unit/testresult.rb
CHANGED
@@ -4,9 +4,19 @@
|
|
4
4
|
# License:: Ruby license.
|
5
5
|
|
6
6
|
require 'test/unit/util/observable'
|
7
|
+
require 'test/unit/failure'
|
8
|
+
require 'test/unit/error'
|
9
|
+
require 'test/unit/omission'
|
10
|
+
require 'test/unit/pending'
|
11
|
+
require 'test/unit/notification'
|
7
12
|
|
8
13
|
module Test
|
9
14
|
module Unit
|
15
|
+
module NullResultContainerInitializer
|
16
|
+
private
|
17
|
+
def initialize_containers
|
18
|
+
end
|
19
|
+
end
|
10
20
|
|
11
21
|
# Collects Test::Unit::Failure and Test::Unit::Error so that
|
12
22
|
# they can be displayed to the user. To this end, observers
|
@@ -14,66 +24,65 @@ module Test
|
|
14
24
|
# UI.
|
15
25
|
class TestResult
|
16
26
|
include Util::Observable
|
27
|
+
include NullResultContainerInitializer
|
28
|
+
include TestResultFailureSupport
|
29
|
+
include TestResultErrorSupport
|
30
|
+
include TestResultPendingSupport
|
31
|
+
include TestResultOmissionSupport
|
32
|
+
include TestResultNotificationSupport
|
17
33
|
|
18
34
|
CHANGED = "CHANGED"
|
19
35
|
FAULT = "FAULT"
|
20
36
|
|
21
|
-
attr_reader
|
37
|
+
attr_reader :run_count, :assertion_count, :faults
|
22
38
|
|
23
39
|
# Constructs a new, empty TestResult.
|
24
40
|
def initialize
|
25
41
|
@run_count, @assertion_count = 0, 0
|
26
|
-
@
|
42
|
+
@summary_generators = []
|
43
|
+
@problem_checkers = []
|
44
|
+
@faults = []
|
45
|
+
initialize_containers
|
27
46
|
end
|
28
47
|
|
29
48
|
# Records a test run.
|
30
49
|
def add_run
|
31
50
|
@run_count += 1
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
# Records a Test::Unit::Failure.
|
36
|
-
def add_failure(failure)
|
37
|
-
@failures << failure
|
38
|
-
notify_listeners(FAULT, failure)
|
39
|
-
notify_listeners(CHANGED, self)
|
40
|
-
end
|
41
|
-
|
42
|
-
# Records a Test::Unit::Error.
|
43
|
-
def add_error(error)
|
44
|
-
@errors << error
|
45
|
-
notify_listeners(FAULT, error)
|
46
|
-
notify_listeners(CHANGED, self)
|
51
|
+
notify_changed
|
47
52
|
end
|
48
53
|
|
49
54
|
# Records an individual assertion.
|
50
55
|
def add_assertion
|
51
56
|
@assertion_count += 1
|
52
|
-
|
57
|
+
notify_changed
|
53
58
|
end
|
54
59
|
|
55
60
|
# Returns a string contain the recorded runs, assertions,
|
56
61
|
# failures and errors in this TestResult.
|
62
|
+
def summary
|
63
|
+
["#{run_count} tests",
|
64
|
+
"#{assertion_count} assertions",
|
65
|
+
*@summary_generators.collect {|generator| send(generator)}].join(", ")
|
66
|
+
end
|
67
|
+
|
57
68
|
def to_s
|
58
|
-
|
69
|
+
summary
|
59
70
|
end
|
60
71
|
|
61
72
|
# Returns whether or not this TestResult represents
|
62
73
|
# successful completion.
|
63
74
|
def passed?
|
64
|
-
|
75
|
+
@problem_checkers.all? {|checker| not send(checker)}
|
65
76
|
end
|
66
77
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
return @failures.size
|
78
|
+
private
|
79
|
+
def notify_changed
|
80
|
+
notify_listeners(CHANGED, self)
|
71
81
|
end
|
72
82
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
return @errors.size
|
83
|
+
def notify_fault(fault)
|
84
|
+
@faults << fault
|
85
|
+
notify_listeners(FAULT, fault)
|
77
86
|
end
|
78
87
|
end
|
79
88
|
end
|