Skip to content

Instantly share code, notes, and snippets.

@aphlysia
Last active December 27, 2015 13:39
Show Gist options
  • Save aphlysia/7334382 to your computer and use it in GitHub Desktop.
Save aphlysia/7334382 to your computer and use it in GitHub Desktop.
minitest recipes

e.g. hoge.rb にある関数 abs() と、クラス A のメソッド f() をテストしたいとき。

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) で呼べる

reference

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment