Rubyのテスティングフレームワーク「Minitest」の基本
プログラムを安全に運用するためには、テスティングフレームワークを使った自動テストが不可欠です。この記事では、Rubyで簡単にテストを実行できる「Minitest」の基本的な使い方についてまとめます。
参考:プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで
Minitestとは?
Minitest
はRubyで標準で提供される軽量なテスティングフレームワークです。設定が少なく、シンプルで直感的なため初心者にも向いています。
インストール
Minitest
はRubyの標準ライブラリに含まれているため、基本的にはインストールの必要はありません。ただし、最新版を使いたい場合はインストールすることもできます。
Minitestのバージョン確認
.rubyファイルに以下のコードを記述し、$ ruby ファイル名
で実行します
require 'minitest' puts Minitest::VERSION
require 'minitest'
でMinitestライブラリを読み込んで、Minitest::VERSION
でバージョン情報を出力しています。
テストの基本的な流れ
テストの基本的な流れは以下のようになります。
- テスティングフレームワークのルールに沿って、プログラムの実行結果を検証するRubyプログラム(テストコード)を書く。
- 上記で作成したテストコードを実行する。
- テスティングフレームワークが実行結果をチェックし、その結果が正しいか間違っているかを報告する。
テストコードのひな形
以下のようなコードを作成してテストを実行します。
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
このコードは、a
とb
が等しいかどうかをチェックします。
最初の引数が期待する値
で次の引数が実際の値
です。
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
内のファイル名に基づいてつけます。
コード例
以下に、簡単なコード例を示します。
lib/my_class.rb
(プログラム本体)class MyClass def hello "Hello, world!" end end
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
メソッドが期待通り動作するかをテストしています。
このようにプログラム本体とテストコードを分離することで、保守性が向上します。
まとめ
Minitest
はRubyでテストを行うためのシンプルで効率的なフレームワークです。学習コストが低く、Rubyの標準ライブラリにも含まれているため、手軽に始めることができます。