P学習帳

書いておぼえるブログ

【Ruby】MiniTestでテストを書いてみる

目的

MiniTestをとりあえず使ってみること。
Effective Ruby 第6章「テスティング」の内容そのままを試してみた結果をまとめる。

テストの対象

たとえばバージョンを管理するクラスversion.rbがある。このクラスのメソッドをテストしたい。

version.rb

class Version
  attr_reader (:major, :minor, :patch)

  def initialize(version)
    @major, @minor, @pathch = version.split('.').map(:map.to_i)
  end
end

使用例:

require File.dirname(__FILE__) + "/Version"

def major_number
  v = Version.new('2.1.3') # major: 2, minor: 1, patch: 3
  v.major # => 2
end

以下ではこのクラスのmajorの値をテストするテストケースを書く。

 手順

1 テストスクリプト命名

version.rbのテストなのでversion_test.rbという命名しておく。 この通りでなくてもよいて、命名が一貫していればOKだ。

2 必要なライブラリを読み込む

MiniTestを実行するために必要となる。

ライブラリ全体を読み込むには以下の1行を書く。

require 'minitest/autorun'

3 テスト用クラスをつくる

テスト本体のクラスをVersionTest、MiniTestのクラスをMiniTest::Unit::TestCaseとしてクラスを作る。

class VersionTest < MiniTest::Unit::TestCase
  # テストケース
end

4 テストを書く

version_test.rbにテストを書いてく。

require('minitest/autorun')        # MiniTestのライブラリを読み込む
require File.dirname(__FILE__) + '/Version' # version.rbを読み込む

class VersionTest < MiniTest::Unit::TestCase
  # テストケース
  def test_major_number
    v = Version.new('2.1.3')
    assert_equal(2, v.major) 
end

5 実行する

以上でテストが完成した。テスト対象のスクリプトとテストスクリプトは同じディレクトリに置かれている。

$ ls
version.rb      version_test.rb

いよいよ実行する。

$ ruby version_test.rb

.
.
.

成功例: 成功した場合とくに何も言われない。0 failuresというところでエラーがなかったことがわかるようになっている。

$ ruby version_test.rb
MiniTest::Unit::TestCase is now Minitest::Test. From version_test.rb:4:in `<main>'
Run options: --seed 48129

# Running:

.

Finished in 0.000882s, 1133.7868 runs/s, 1133.7868 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips

失敗例: わざと失敗するようにテストを以下のように書き換えてみる。

assert_equal(1, v.major) 
MiniTest::Unit::TestCase is now Minitest::Test. From version_test.rb:4:in `<main>'
Run options: --seed 52817

# Running:

F

Failure:
VersionTest#test_major_number [version_test.rb:8]:
Expected: 1
  Actual: 2


bin/rails test version_test.rb:6



Finished in 0.001389s, 719.9424 runs/s, 719.9424 assertions/s.
1 runs, 1 assertions, 1 failures, 0 errors, 0 skips

assert_equalメソッドの第一引数がExpectedv.majorの値がActualで、両者が異なってますよ、ということが表示される。

感想

テストは大切。いちどテストを書いてしまえば、テスト対象が多くてもOK。それに対して、手動でプリントデバッグするのは消耗する。また、変更したあとの再テストがかんたんにできるのも魅力。