Generates Test::Unit tests in Ruby. Classic xUnit-style testing with assert methods and test case classes. Use when user mentions "Test::Unit", "assert_equal Ruby", "Ruby test-unit". Triggers on: "Test::Unit", "Ruby test-unit", "assert_equal Ruby" (not RSpec).
Scanned 9/22/2026
Install to Claude Code
npx -y skills add NVlabs/Skill2Env --skill testunit-skill --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Testunit Skill?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/nvlabs-testunit-skill)More formats (shields.io, HTML) on the badges page.
---
name: testunit-skill
description: >
Generates Test::Unit tests in Ruby. Classic xUnit-style testing with assert
methods and test case classes. Use when user mentions "Test::Unit",
"assert_equal Ruby", "Ruby test-unit". Triggers on: "Test::Unit",
"Ruby test-unit", "assert_equal Ruby" (not RSpec).
languages:
- Ruby
category: unit-testing
license: MIT
metadata:
author: TestMu AI
version: "1.0"
---
# Test::Unit Ruby Skill
## Core Patterns
### Basic Test
```ruby
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
```
### Assertions
```ruby
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 }
```
### Test Fixtures
```ruby
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 Ordering and Naming
```ruby
class TestUserService < Test::Unit::TestCase
# Methods must start with 'test_'
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
```
## Setup: `gem install test-unit`
## Run: `ruby test/test_calculator.rb` or `ruby -Itest -e "Dir.glob('test/**/test_*.rb').each{|f| require f}"`
## Autodiscovery: `testrb test/` (with test-unit gem)
## Deep Patterns
For advanced patterns, debugging guides, CI/CD integration, and best practices,
see `reference/playbook.md`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!