hoge.rb
# coding: utf-8
def abs(x)
return -x if x < 0
return x
end
class A
def f(x)
raise "x is nil" if x = nil
return true
end
end
if $0 == __FILE__
# ここには hoge.rb を直接実行されたときにのみ実行したい内容を書く
# ここの中身は test_hoge.rb から読み込まれたときに実行されない
a = A.new()
puts (a.f(1))
puts abs(-1)
end
テストを定義したコードを書きます。ここでは test_hoge.rb とします。ファイル名は任意です。
# coding: utf-8
require 'minitest/unit'
require_relative 'hoge.rb' # hoge.rb を読み込む
MiniTest::Unit.autorun
class Test_Function < MiniTest::Unit::TestCase
def test_abs_case1
# 期待した結果と実際の結果が同じかのテスト
expected = 1
actual = abs(1)
assert_equal(expected, actual)
expected = 1
actual = abs(-1)
assert_equal(expected, actual)
end
end
class Test_A < MiniTest::Unit::TestCase
def setup
# ここの中身は各テストの実行前に実行される
# なのでどのテストでも共通の前処理をかく
# 特にない場合は定義不要
@a = A.new()
end
def test_f_case1
# true を返すかのテスト
assert(@a.f(1))
end
def test_f_case2
# RuntimeError 例外を発生するかのテスト
assert_raises(RuntimeError) {
@a.f(nil)
}
end
def teardown
# ここの中身は各テストの実行後に実行される
# なのでどのテストでも共通の後処理をかく
# 特にない場合は定義不要
end
end
- まず MiniTest::Unit::TestCase を継承したクラスを定義します。クラスの名前は任意です。その中で
test
で始まる名前の メソッドを定義するとテストとみなされます。 - 1つの中に複数の assert* を書けます。
- 他にもいろいろな assert* があります。次のページで見れます。 http://doc.okkez.net/1.9.3/view/class/MiniTest=Assertions
コマンドラインから以下のように打ちます。
$ ruby test_hoge.rb
Run options: --seed 17473
# Running tests:
.F.
Finished tests in 0.000835s, 3593.4814 tests/s, 4791.3086 assertions/s.
1) Failure:
test_f_case2(Test_A) [test_hoge.rb:36]:
RuntimeError expected but nothing was raised.
3 tests, 4 assertions, 1 failures, 0 errors, 0 skips
一番下の行から、3つのテストメソッドを実行し、その中に4つの assert があり、1回失敗したことが読み取れます。
指定した名前のテストだけ実行することもできます。以下は test_f_case
のみテストを実行します。
$ ruby test_hoge.rb -n test_f_case
正規表現もつかえます。以下はテストメソッド名に fuga
を含むテストを実施します。
$ ruby test_hoge.rb -n /fuga/
- インスタンス変数のテストしたい
object.instance_variable_get(:@variable_name)
でアクセスできる
- private method のテストしたい
object.send(:private_method)
で呼べる