mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - Test::Unit, Minitest::Unit でユニットテスト!

[ プログラミング ] [ Ruby ]

こんばんは。

Ruby 標準のユニットテスト(単体テスト)フレームワーク Test::Unit, Minitest::Unit についてです。 Ruby でのユニットテストには、最近流行り(?)の振舞駆動開発に特化した RSpec や、他にも色々あります。

ユニットテストとは、プログラム単体のテストのことです。 システム開発経験者ならわかると思いますが、 要件定義→概要設計→詳細(PG)設計→製造→単体テスト→結合テスト→総合テスト→運用テスト→保守(案件・開発環境等によって異なりますが) の1工程です。

Test::Unit は Ruby 1.8 系では標準でしたが、1.9 系では Minitest::Unit で再実装されています。 ですから、今回の当方の環境 Ruby 1.9.3 では Minitest::Unit を実装しています。

以下、テスト方法についての記録です。

作業記録

1. テスト対象スクリプト作成

当然ですが、テストを実行する対象になるスクリプトを作成します。 例にならって以下のように作成してしました。 【 ファイル名:foo.rb 】

1
2
3
4
5
6
7
8
9
class Foo
  def foo
    "foo"
  end

  def bar
    "foo"
  end
end

bar はテストでエラーになるように意図的に誤った定義をしています。

2. ユニットテスト用スクリプト作成

ユニットテスト用のスクリプトを作成します。 これも例にならって以下のように作成しました。 【 ファイル名:test_foo.rb 】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
require 'minitest/unit'
require 'foo'

MiniTest::Unit.autorun

class TestFoo < MiniTest::Unit::TestCase
  def setup
    @foo = Foo.new
  end

  def teardown
    @foo = nil
  end

  def test_foo
    assert_equal "foo", @foo.foo
  end

  def test_bar
    assert_equal "bar", @foo.bar
  end
end
  • テストを実行するメソッドの名前は “test” で始まる必要があるようです。
  • MiniTest::Unit.autorun の代わりに require ‘minitest/autorun’ を記述しても良いようです。
  • setup は、各テストケースの実行前に実行するメソッドです。
  • teardown は、各テストケースの実行後に実行するメソッドです。(あまり使わないようです)
  • assert_equal(expected, actual, message = nil) は、与えられた期待値と実際の値が等しいか否かをテストします。

※他にどんな Assertion があるのかは module MiniTest::Assertions を参照。

3. ユニットテストの実行

作成したユニットテストスクリプトを実行します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ ruby test_foo.rb
Run options: --seed 7211

# Running tests:

.F

Finished tests in 3.578125s, 0.5590 tests/s, 0.5590 assertions/s.

  1) Failure:
test_bar(TestFoo) [test_foo.rb:20]:
Expected: "bar"
  Actual: "foo"

2 tests, 2 assertions, 1 failures, 0 errors, 0 skips

test_foo.rb の20行目で “bar” を期待していたのに “foo” が返ってきた、と言っています。 テストができているようです。

参考サイト


以上。

Comments