Minitest 入门指南(Ruby)
Minitest 是 Ruby 生态的轻量测试框架,可通过 gem 安装、语法简洁。本文讲解 Minitest 项目搭建、断言用法、测试组织与运行策略、生命周期钩子和进阶测试模式。
本文依据官方文档整理,未执行运行验证或性能基准。代码片段展示局部用法,业务函数、数据和环境需按项目补齐;版本与配置以所引文档为准。
直接回答:Minitest 是 Ruby 生态的测试框架,不应假定所有 Ruby 安装都预装,语法直白、运行飞快,是 RSpec 之外"少即是多"的选择——从简单断言到复杂场景,它都能用很少的仪式感完成。
为什么是 Minitest
Ruby 社区谈到测试,很多人第一反应是 RSpec。但 Minitest 有自己的拥趸:它曾随部分 Ruby 版本分发,项目应显式声明 gem 依赖,require "minitest/autorun" 之后立即开写;测试类就是普通 Ruby 类、断言就是普通方法调用,没有 DSL 学习成本,新人看一遍就懂。
项目搭建
mkdir minitest-demo && cd minitest-demo
gem install minitest
新建 calculator.rb:
class Calculator
def add(a, b)
a + b
end
end
再建 test/test_calculator.rb:
require "minitest/autorun"
require_relative "../calculator"
class TestCalculator < Minitest::Test
def test_add
assert_equal 3, Calculator.new.add(1, 2)
end
end
ruby test/test_calculator.rb 即可运行。Minitest 会自动发现并执行所有 test_ 开头的方法。
断言速查
| 断言 | 含义 |
|---|---|
assert_equal expected, actual |
相等(最常用) |
assert_nil obj / refute_nil obj |
为 nil / 不为 nil |
assert_includes collection, item |
集合包含元素 |
assert_raises(ErrClass) { ... } |
代码块抛出指定异常 |
assert_difference(-> { Model.count }, 1) { ... } |
(Rails 中)执行前后计数变化 |
风格约定:期望值在前、实际值在后,失败信息才读得顺。
构建完整覆盖
以一个字符串工具为例,好的覆盖应包括:
class TestSlugger < Minitest::Test
def test_basic_slug
assert_equal "hello-world", Slugger.call("Hello World")
end
def test_strips_special_characters
assert_equal "hello", Slugger.call("Hello!!!")
end
def test_handles_empty_string
assert_equal "", Slugger.call("")
end
def test_handles_unicode
assert_equal "cafe", Slugger.call("Café")
end
end
正常路径、边界值、异常输入各占一份,覆盖率才有意义。
组织与运行策略
- 目录约定:
test/下按被测代码结构镜像组织,文件以test_前缀命名; - 批量运行:配一个
Rakefile,rake test一次跑全部; - 聚焦调试:
ruby test/test_x.rb -n test_某个用例只跑指定用例; - 顺序随机化:Minitest 默认随机执行顺序,故意暴露用例间的隐式依赖——这是特性,不要关掉。
生命周期钩子
class TestUserRepo < Minitest::Test
def setup
@repo = UserRepo.new(DB[:test])
end
def teardown
@repo.clear!
end
end
setup/teardown 在每条用例前后执行。纪律照旧:每条用例独立,不依赖执行顺序。
常见问题(FAQ)
Q:Minitest 和 RSpec 怎么选?
A:RSpec 的 DSL 表达力强、生态庞大,适合强调 BDD 风格的团队;Minitest 以普通 Ruby 类和方法组织测试,Rails 默认就是它。没有对错,团队一致最重要。
Q:Minitest 有 Mock 能力吗?
A:Mock 的分发方式依版本而异。Minitest 5 可加载 minitest/mock;新主版本应查兼容说明及配套 mock gem,不要默认 autorun 就导入所有 mock 能力。替换依赖需在 teardown 或 ensure 中恢复。
Q:Rails 项目里 Minitest 要额外配置吗?
A:不需要。Rails 默认测试框架就是 Minitest,bin/rails test 直接跑,模型、控制器、系统测试全都有对应基类。
官方参考
资料核对日期:2026-09-29。