Testing with Minitest
Minitest is Ruby's built-in testing framework that lets you verify your code automatically with concise assertions, so you catch bugs before your users do.
Learn Testing with Minitest in our free Ruby course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a quick reference.
Part of the free Ruby course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
You'll write test classes and assertions, use setup , check for raised errors, and try the spec style.
What You'll Learn in This Lesson
1️⃣ Your First Test
A Minitest test is a class that inherits from Minitest::Test . Every method whose name starts with test_ is a test. Inside, call assertions like assert_equal(expected, actual) or assert(condition) . The line require 'minitest/autorun' makes the file run its tests automatically.
2️⃣ More Assertions, setup & assert_raises
setup runs before every test_ method, giving each test fresh, isolated state. Beyond assert_equal there's assert_nil , assert_includes , and assert_raises , which passes only if the block raises the expected exception.
3️⃣ Spec Style & Minitest vs RSpec
Minitest also offers a spec style that reads like a sentence: describe groups tests, it defines one, and expectations use _(value).must_equal expected . It's a lighter alternative to RSpec's expect(...).to DSL, with no extra gem to install.
Your turn. Complete two assertions about strings so the suite passes. Fill in each ___ .
Mini-Challenge: Test a Stack
Build a tiny Stack and write a Minitest suite for it with a setup , an equality assertion, and an assert_raises . This mirrors how you'd test a real class. Run with ruby test_stack.rb .
Common Errors (and the fix)
- No tests run — ❌ Method names don't start with test_ . ✅ Minitest only runs test_ -prefixed methods.
- "uninitialized constant Minitest" — ❌ Missing the require. ✅ Add require 'minitest/autorun' at the top.
- Args backwards — ❌ assert_equal actual, expected . ✅ Order is assert_equal(expected, actual) .
- assert_raises without a block — ❌ Passing a value instead of code. ✅ Give it a block: assert_raises(E) { ... } .
Pro Tips
- 💡 One behaviour per test: small focused tests give clearer failure messages.
- 💡 teardown too: pair setup with teardown for cleanup after each test.
- 💡 Floats: use assert_in_delta instead of assert_equal for floating-point results.
📋 Quick Reference — Minitest
Concept
Ruby
Load + run
require 'minitest/autorun'
Test class
< Minitest::Test
A test
def test_thing
Equality
assert_equal exp, act
Raises
assert_raises(E) { }
Before each
def setup
Frequently Asked Questions
🎉 Lesson Complete!
- ✅ A test is a test_ method in a Minitest::Test class
- ✅ require 'minitest/autorun' runs everything
- ✅ assert , assert_equal , assert_raises
- ✅ setup gives each test fresh state
- ✅ Spec style ( describe/it ) is a lighter alternative to RSpec
- ✅ Next lesson: Checkpoint — OOP & Stdlib
Practice quiz
How is Minitest distributed?
- a paid gem
- part of Rails only
- built into Ruby, no install needed
- a separate download
Answer: built into Ruby, no install needed. Minitest ships with Ruby itself.
What does require 'minitest/autorun' do?
- registers an at_exit hook that runs the tests automatically
- installs Minitest
- imports assertions only
- starts a web server
Answer: registers an at_exit hook that runs the tests automatically. autorun runs all defined tests when the file finishes loading.
A classic-style test class inherits from:
- Minitest::Spec
- Test::Unit
- RSpec::Test
- Minitest::Test
Answer: Minitest::Test. xUnit-style tests subclass Minitest::Test.
Which method names are run as tests in a Minitest::Test class?
- any method
- methods starting with test_
- methods ending in _test
- methods named check
Answer: methods starting with test_. Only methods whose names start with test_ are run.
What is the correct argument order for assert_equal?
- assert_equal expected, actual
- assert_equal actual, expected
- order does not matter
- assert_equal value only
Answer: assert_equal expected, actual. assert_equal takes expected first, then actual.
When does plain assert(value) pass?
- when value is nil
- only when value is true
- when value is truthy (not nil or false)
- when value is zero
Answer: when value is truthy (not nil or false). assert passes for any truthy value.
Which assertion checks that a block raises an error?
- assert_error
- assert_raises
- assert_throws
- assert_fails
Answer: assert_raises. assert_raises(Error) { ... } passes when the block raises that error.
What does the setup method do?
- runs once before all tests
- runs after each test
- configures the seed
- runs before every test_ method for fresh state
Answer: runs before every test_ method for fresh state. setup runs before each test, giving isolated state.
In Minitest spec style, which pair defines a test group and a test?
- context / specify
- describe / it
- suite / case
- group / test
Answer: describe / it. Spec style uses describe to group and it to define a test.
Compared to RSpec, Minitest is generally:
- larger with a big matcher DSL
- browser-based
- small, built-in, and dependency-free
- only for Rails
Answer: small, built-in, and dependency-free. Minitest favours simplicity and ships with Ruby; RSpec is a larger external gem.
Continue this course
- Previous: JSON & YAML
- Next: Checkpoint: OOP & Stdlib