Class: Test::Unit::TestCase

Overview

Ties everything together. If you subclass and add your own test methods, it takes care of making them into tests and wrapping those tests into a suite. It also does the nitty-gritty of actually running an individual test and collecting its results into a Test::Unit::TestResult object.

You can run two hooks before/after a TestCase run.

Example:

class TestMyClass < Test::Unit::TestCase
  class << self
    def startup
      ...
    end

    def shutdown
      ...
    end
  end

  def setup
    ...
  end

  def teardown
    ...
  end

  def test_my_method1
    ...
  end

  def test_my_method2
    ...
  end
end

Here is a call order:

  • startup

  • setup

  • test_my_method1

  • teardown

  • setup

  • test_my_method2

  • teardown

  • shutdown

Constant Summary collapse

STARTED =

:nodoc:

name + "::STARTED"
FINISHED =

:nodoc:

name + "::FINISHED"
DESCENDANTS =

:nodoc:

[]
AVAILABLE_ORDERS =

:nodoc:

[:alphabetic, :random, :defined]
@@added_methods =
{}
@@test_orders =
{}

Constants included from Util::BacktraceFilter

Util::BacktraceFilter::TESTUNIT_FILE_SEPARATORS, Util::BacktraceFilter::TESTUNIT_PREFIX, Util::BacktraceFilter::TESTUNIT_RB_FILE

Constants included from Assertions

Assertions::UncaughtThrow

Constants included from ErrorHandler

ErrorHandler::NOT_PASS_THROUGH_EXCEPTIONS, ErrorHandler::PASS_THROUGH_EXCEPTIONS

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Util::Output

#capture_output

Methods included from Util::BacktraceFilter

filter_backtrace

Methods included from Assertions

#assert, #assert_alias_method, #assert_block, #assert_boolean, #assert_compare, #assert_const_defined, #assert_empty, #assert_equal, #assert_fail_assertion, #assert_false, #assert_in_delta, #assert_in_epsilon, #assert_include, #assert_instance_of, #assert_kind_of, #assert_match, #assert_nil, #assert_no_match, #assert_not_const_defined, #assert_not_empty, #assert_not_equal, #assert_not_in_delta, #assert_not_in_epsilon, #assert_not_include, #assert_not_match, #assert_not_nil, #assert_not_predicate, #assert_not_respond_to, #assert_not_same, #assert_not_send, #assert_nothing_raised, #assert_nothing_thrown, #assert_operator, #assert_path_exist, #assert_path_not_exist, #assert_predicate, #assert_raise, #assert_raise_kind_of, #assert_raise_message, #assert_raises, #assert_respond_to, #assert_same, #assert_send, #assert_throw, #assert_throws, #assert_true, #build_message, #flunk, use_pp=

Methods included from Priority

available_values, default, default=, disable, enable, enabled?, included, #priority_setup, #priority_teardown

Methods included from TestCaseNotificationSupport

included, #notify

Methods included from TestCaseOmissionSupport

included, #omit, #omit_if, #omit_unless

Methods included from TestCasePendingSupport

included, #pend

Methods included from FailureHandler

included

Methods included from ErrorHandler

included

Methods included from ExceptionHandler

exception_handlers, included

Methods included from Fixture

included

Methods included from Attribute

#[], #attributes, included

Constructor Details

#initialize(test_method_name) ⇒ TestCase

Creates a new instance of the fixture for running the test represented by test_method_name.



298
299
300
301
302
303
304
305
306
307
308
309
# File 'lib/test/unit/testcase.rb', line 298

def initialize(test_method_name)
  throw :invalid_test unless respond_to?(test_method_name)
  test_method = method(test_method_name)
  throw :invalid_test if test_method.arity > 0
  owner = Util::MethodOwnerFinder.find(self, test_method_name)
  if owner.class != Module and self.class != owner
    throw :invalid_test
  end
  @method_name = test_method_name
  @test_passed = true
  @interrupted = false
end

Instance Attribute Details

#method_nameObject (readonly)

Returns the value of attribute method_name.



294
295
296
# File 'lib/test/unit/testcase.rb', line 294

def method_name
  @method_name
end

Class Method Details

.description(value, target = nil) ⇒ Object

Describes a test.

The following example associates “register a normal user” description with “test_register” test.

description "register a normal user"
def test_register
  ...
end


251
252
253
# File 'lib/test/unit/testcase.rb', line 251

def description(value, target=nil)
  attribute(:description, value, {}, target || [])
end

.inherited(sub_class) ⇒ Object

:nodoc:



95
96
97
# File 'lib/test/unit/testcase.rb', line 95

def inherited(sub_class) # :nodoc:
  DESCENDANTS << sub_class
end

.method_added(name) ⇒ Object

:nodoc:



100
101
102
103
104
105
106
107
108
# File 'lib/test/unit/testcase.rb', line 100

def method_added(name) # :nodoc:
  super
  added_methods = (@@added_methods[self] ||= [])
  stringified_name = name.to_s
  if added_methods.include?(stringified_name)
    attribute(:redefined, true, {}, stringified_name)
  end
  added_methods << stringified_name
end

.shutdownObject

Called after every test case runs. Can be used to tear down fixture information used in test case scope.

Here is an example test case:

class TestMyClass < Test::Unit::TestCase
  class << self
    def shutdown
      ...
    end
  end

  def teardown
    ...
  end

  def test_my_class1
    ...
  end

  def test_my_class2
    ...
  end
end

Here is a call order:

  • test_my_class1 (or test_my_class2)

  • teardown

  • test_my_class2 (or test_my_class1)

  • teardown

  • shutdown

Note that you should not assume test order. Tests should be worked in any order.



198
199
# File 'lib/test/unit/testcase.rb', line 198

def shutdown
end

.startupObject

Called before every test case runs. Can be used to set up fixture information used in test case scope.

Here is an example test case:

class TestMyClass < Test::Unit::TestCase
  class << self
    def startup
      ...
    end
  end

  def setup
    ...
  end

  def test_my_class1
    ...
  end

  def test_my_class2
    ...
  end
end

Here is a call order:

  • startup

  • setup

  • test_my_class1 (or test_my_class2)

  • setup

  • test_my_class2 (or test_my_class1)

Note that you should not assume test order. Tests should be worked in any order.



162
163
# File 'lib/test/unit/testcase.rb', line 162

def startup
end

.suiteObject

Rolls up all of the test* methods in the fixture into one suite, creating a new instance of the fixture for each method.



113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/test/unit/testcase.rb', line 113

def suite
  suite = TestSuite.new(name, self)
  collect_test_names.each do |test|
    catch(:invalid_test) do
      suite << new(test)
    end
  end
  if suite.empty?
    catch(:invalid_test) do
      suite << new("default_test")
    end
  end
  suite
end

.test(test_description, &block) ⇒ Object

Defines a test in declarative syntax.

The following two test definitions are the same:

description "register user"
def test_register_user
  ...
end

test "register user" do
  ...
end


234
235
236
237
238
239
# File 'lib/test/unit/testcase.rb', line 234

def test(test_description, &block)
  normalized_description = test_description.gsub(/[^a-zA-Z\d_]+/, '_')
  method_name = "test_#{normalized_description}".to_sym
  define_method(method_name, &block)
  description(test_description, method_name)
end

.test_orderObject

Returns the current test order. This returns :alphabetic by default.



205
206
207
# File 'lib/test/unit/testcase.rb', line 205

def test_order
  @@test_orders[self] || AVAILABLE_ORDERS.first
end

.test_order=(order) ⇒ Object

Sets the current test order.

Here are the available order:

:alphabetic

Default. Tests are sorted in alphabetic order.

:random

Tests are sorted in random order.

:defined

Tests are sorted in defined order.



218
219
220
# File 'lib/test/unit/testcase.rb', line 218

def test_order=(order)
  @@test_orders[self] = order
end

Instance Method Details

#==(other) ⇒ Object

It’s handy to be able to compare TestCase instances.



433
434
435
436
437
# File 'lib/test/unit/testcase.rb', line 433

def ==(other)
  return false unless(other.kind_of?(self.class))
  return false unless(@method_name == other.method_name)
  self.class == other.class
end

#default_testObject



404
405
406
# File 'lib/test/unit/testcase.rb', line 404

def default_test
  flunk("No tests were specified")
end

#descriptionObject

Returns a description for the test. A description will be associated by Test::Unit::TestCase.test or Test::Unit::TestCase.description.

Returns a name for the test for no description test.



423
424
425
# File 'lib/test/unit/testcase.rb', line 423

def description
  self[:description] || name
end

#interrupted?Boolean

Returns:

  • (Boolean)


439
440
441
# File 'lib/test/unit/testcase.rb', line 439

def interrupted?
  @interrupted
end

#nameObject

Returns a human-readable name for the specific test that this instance of TestCase represents.



414
415
416
# File 'lib/test/unit/testcase.rb', line 414

def name
  "#{@method_name}(#{self.class.name})"
end

#run(result) ⇒ Object

Runs the individual test method represented by this instance of the fixture, collecting statistics, failures and errors in result.



314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
# File 'lib/test/unit/testcase.rb', line 314

def run(result)
  begin
    @_result = result
    yield(STARTED, name)
    begin
      run_setup
      run_test
    rescue Exception
      @interrupted = true
      raise unless handle_exception($!)
    ensure
      begin
        run_teardown
      rescue Exception
        raise unless handle_exception($!)
      end
    end
    result.add_run
    yield(FINISHED, name)
  ensure
    # @_result = nil # For test-spec's after_all :<
  end
end

#setupObject

Called before every test method runs. Can be used to set up fixture information.

You can add additional setup tasks by the following code:

class TestMyClass < Test::Unit::TestCase
  def setup
    ...
  end

  setup
  def my_setup1
    ...
  end

  setup
  def my_setup2
    ...
  end

  def test_my_class
    ...
  end
end

Here is a call order:

  • setup

  • my_setup1

  • my_setup2

  • test_my_class



368
369
# File 'lib/test/unit/testcase.rb', line 368

def setup
end

#sizeObject



408
409
410
# File 'lib/test/unit/testcase.rb', line 408

def size
  1
end

#teardownObject

Called after every test method runs. Can be used to tear down fixture information.

You can add additional teardown tasks by the following code:

class TestMyClass < Test::Unit::TestCase
  def teardown
    ...
  end

  teardown
  def my_teardown1
    ...
  end

  teardown
  def my_teardown2
    ...
  end

  def test_my_class
    ...
  end
end

Here is a call order:

  • test_my_class

  • my_teardown2

  • my_teardown1

  • teardown



401
402
# File 'lib/test/unit/testcase.rb', line 401

def teardown
end

#to_sObject

Overridden to return #name.



428
429
430
# File 'lib/test/unit/testcase.rb', line 428

def to_s
  name
end