【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
メソッドの第一引数がExpected
、v.major
の値がActual
で、両者が異なってますよ、ということが表示される。
感想
テストは大切。いちどテストを書いてしまえば、テスト対象が多くてもOK。それに対して、手動でプリントデバッグするのは消耗する。また、変更したあとの再テストがかんたんにできるのも魅力。