用途
Test::Unit 是 Ruby 的经典 xUnit 风格单元测试框架,使用测试用例类(TestCase)和断言方法(assert methods)来组织与验证测试。本技能用于在 Ruby 项目中生成 Test::Unit 风格的测试代码,适合需要经典 xUnit 结构、以断言为核心表达测试预期的场景。
主要能力
基本测试结构
测试类继承自 Test::Unit::TestCase,测试方法名必须以 test_ 开头。可在类中定义 setup 与 teardown 方法,分别在每个测试方法执行前后运行。示例:
require 'test/unit'
class TestCalculator < Test::Unit::TestCase
def setup
@calc = Calculator.new
end
def test_addition
assert_equal(5, @calc.add(2, 3), "2 + 3 should equal 5")
end
def test_subtraction
assert_equal(1, @calc.subtract(3, 2))
end
def test_division_by_zero
assert_raise(ZeroDivisionError) { @calc.divide(10, 0) }
end
def test_float_division
assert_in_delta(3.33, @calc.divide(10, 3), 0.01)
end
def teardown
# cleanup
end
end
断言方法
技能涵盖的断言包括:
assert_equal(expected, actual, message = nil)
assert_not_equal(unexpected, actual)
assert_true(value)
assert_false(value)
assert_nil(value)
assert_not_nil(value)
assert_instance_of(klass, obj)
assert_kind_of(klass, obj)
assert_respond_to(obj, :method_name)
assert_match(/pattern/, string)
assert_no_match(/pattern/, string)
assert_include(collection, item)
assert_not_include(collection, item)
assert_empty(collection)
assert_not_empty(collection)
assert_raise(ErrorClass) { block }
assert_nothing_raised { block }
assert_in_delta(expected, actual, delta)
assert_operator(value, :>, 5)
assert_send([obj, :method, arg])
assert_block("message") { condition }
测试夹具(Fixtures)
除每个测试前后的 setup / teardown 外,还可使用类方法 self.startup 与 self.shutdown,分别在整个测试类的所有测试开始前与结束后各执行一次。示例:
class TestDatabase < Test::Unit::TestCase
def self.startup
# Once before all tests in class
@@db = Database.connect('test')
end
def self.shutdown
# Once after all tests in class
@@db.disconnect
end
def setup
# Before each test
@@db.begin_transaction
end
def teardown
# After each test
@@db.rollback
end
end
测试命名与组织
测试方法必须以 test_ 开头,例如:
class TestUserService < Test::Unit::TestCase
def test_create_user
user = UserService.create('Alice', 'alice@test.com')
assert_not_nil(user)
assert_equal('Alice', user.name)
end
def test_find_user_by_email
user = UserService.find_by_email('alice@test.com')
assert_instance_of(User, user)
end
end
使用方式
安装:
gem install test-unit
运行单个测试文件:
ruby test/test_calculator.rb
运行目录下所有测试:
ruby -Itest -e "Dir.glob('test/**/test_*.rb').each{|f| require f}"
自动发现(需 test-unit gem):
testrb test/
适用场景
- 用户提到 "Test::Unit"、"assert_equal" 等断言,或需要为 Ruby 代码编写经典 xUnit 风格单元测试。
- 需要以测试用例类、断言方法、setup/teardown 夹具组织测试的 Ruby 项目。
限制
关于高级模式、调试指南、CI/CD 集成与最佳实践,资料指向 reference/playbook.md,本技能介绍中未展开。其余未在资料中明确说明的功能、平台支持或限制暂未提供。