Rubyのテスティングフレームワーク「Minitest」の基本

プログラムを安全に運用するためには、テスティングフレームワークを使った自動テストが不可欠です。この記事では、Rubyで簡単にテストを実行できる「Minitest」の基本的な使い方についてまとめます。

参考:プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで

Minitestとは?

MinitestRubyで標準で提供される軽量なテスティングフレームワークです。設定が少なく、シンプルで直感的なため初心者にも向いています。

インストール

MinitestRubyの標準ライブラリに含まれているため、基本的にはインストールの必要はありません。ただし、最新版を使いたい場合はインストールすることもできます。

Minitestのバージョン確認

.rubyファイルに以下のコードを記述し、$ ruby ファイル名 で実行します

require 'minitest'
puts Minitest::VERSION

require 'minitest'でMinitestライブラリを読み込んで、Minitest::VERSIONでバージョン情報を出力しています。

テストの基本的な流れ

テストの基本的な流れは以下のようになります。

  1. テスティングフレームワークのルールに沿って、プログラムの実行結果を検証するRubyプログラム(テストコード)を書く。
  2. 上記で作成したテストコードを実行する。
  3. テスティングフレームワークが実行結果をチェックし、その結果が正しいか間違っているかを報告する。

テストコードのひな形

以下のようなコードを作成してテストを実行します。

require 'minitest/autorun'

class SampleTest < Minitest::Test
    def test_sample
        assert_equal 'RUBY', 'ruby'.upcase
    end
end

コードの解説

  • require 'minitest/autorun': Minitestを自動で実行する機能を読み込みます。
  • class SampleTest < Minitest::Test: SampleTestという名前のテストクラスを定義して、Minitest::Testを継承します。
  • def test_sample: test_で始まるメソッドを作成します。このメソッド内にテストを記述します。
  • assert_equal 'RUBY', 'ruby'.upcase: 'ruby'.upcase'RUBY'に等しいことを確認します。

主な検証メソッド

Minitestには多くの検証メソッドが用意されていますが、最も基本的なものをいくつか紹介します。

aがbと等しければパスする

assert_equal b, a

このコードは、abが等しいかどうかをチェックします。
最初の引数が期待する値で次の引数が実際の値です。

aが真であればパスする

assert a

このコードは、aが真(true)であればテストがパスする、ということを検証します。

aが偽であればパスする

refute a

このコードは、aが偽(false)であればテストがパスする、ということを検証します。

テストの実行結果

テストが成功すると以下のような出力が表示されます。

Run options: --seed 26325

# Running:

.

Finished in 0.000205s, 4878.0488 runs/s, 4878.0488 assertions/s.

1 runs, 1 assertions, 0 failures, 0 errors, 0 skips

テストが失敗した場合、実行中にエラーが発生した場合

テストが失敗した場合や、実行中にエラーが発生した場合も、その詳細が出力されます。この情報を元にデバッグを行います。

テストコードとプログラム本体を分離する

実際のプロジェクトでは、テストコードはプログラム本体から独立させて管理するのが一般的です。

ディレクトリ構造

プロジェクトのルートディレクトリには通常、libディレクトリとtest(またはspecディレクトリが存在します。

my_ruby_project/
|-- lib/
|   |-- my_class.rb
|
|-- test/
|   |-- test_my_class.rb
  • lib/: プログラム本体が格納される。ここには、ビジネスロジックやモデルなどのコードが格納されます。
  • test/: テストコードが格納される。テストファイルの名前は対応するlib内のファイル名に基づいてつけます。

コード例

以下に、簡単なコード例を示します。

  1. lib/my_class.rb(プログラム本体)

     class MyClass
       def hello
         "Hello, world!"
       end
     end
    
  2. test/test_my_class.rb(テストコード)

     require 'minitest/autorun'
     require_relative '../lib/my_class'
    
     class MyClassTest < Minitest::Test
       def test_hello
         my_class = MyClass.new
         assert_equal "Hello, world!", my_class.hello
       end
     end
    

コードの解説

  • テストコード内でrequire_relative '../lib/my_class'としています。これによって、libディレクトリ内のMyClassクラスを読み込んでいます。
  • MyClassTestというテストクラスを定義し、その中にtest_helloメソッドを定義しています。このメソッド内でMyClassインスタンスを生成し、そのhelloメソッドが期待通り動作するかをテストしています。

このようにプログラム本体とテストコードを分離することで、保守性が向上します。

まとめ

MinitestRubyでテストを行うためのシンプルで効率的なフレームワークです。学習コストが低く、Rubyの標準ライブラリにも含まれているため、手軽に始めることができます。