1. test-unitはじめの一歩

テストユニットを使ってみましょう。

この文書はsampleというgemパッケージを作成しtest-unitを利用する方法について解説します。

2. bundlerとtest-unitのインストール

  • 最初にgemの雛形を生成するbundlerをインストールします。
  • 次に、test-unitをインストールします。
gem install bundler
gem install test-unit

gem listコマンドでインストールしたパッケージを確認します。 インストールが成功すると、次のような行が出力されます。

gem list
...
bundler (1.14.6)
...
test-unit (3.2.3)

3. gemテンプレートの作成

次にbundlerコマンドを使ってgemの雛形を作成します。 このコマンドはテストに必要な雛形も生成することができますが、 現在は、test-unitのためのテンプレートを生成することはできません。

そのため、まずminitestというテストフレームワークのテンプレートを作成し (このフレームワークはunit-testに似ています。) その後いくつかのファイルをtest-unit用に修正します。

bundle gem -t minitest sampleを実行すると次のファイルを生成します。

.
|-- Gemfile
|-- README.md
|-- Rakefile
|-- bin
|   |-- console
|   `-- setup
|-- lib
|   |-- sample
|   |   `-- version.rb
|   `-- sample.rb
|-- sample.gemspec  # <- 修正
`-- test
    |-- sample_test.rb # <- 修正
    `-- test_helper.rb # <- 修正

4. test-unit用にファイルを修正する

4.1 gemspecの編集

sample.gemspecファイルを次のように修正します。 minitestの行を、test-unitに修正します。

修正前

  spec.add_development_dependency "minitest", "~> 5.0"

修正後

  spec.add_development_dependency "test-unit", "~> 3.2.3"

4.2 test/test_helper.rbの修正

次にtest/test_helperファイルを修正します。

修正前

$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
require 'sample'

require 'minitest/autorun' # <-- この行を修正します。

修正後

$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
require 'sample'

require 'test/unit' # <-- 修正後

4.3 Rakefile(修正不要)

このファイルは修正不要です。 ファイルの中身は次のようになっています。

require "bundler/gem_tasks"
require "rake/testtask"

Rake::TestTask.new(:test) do |t|
  t.libs << "test"
  t.libs << "lib"
  t.test_files = FileList['test/**/*_test.rb']
end

task :default => :test

4.4 test/sample_test.rbの修正

bundlerコマンドは、test/sample_test.rbを作成します。 このファイルはminitest用のテンプレートになっています。

test-unit用に修正します

修正前

require 'test_helper'

class SampleTest < Minitest::Test # <- ここを修正します
  def test_that_it_has_a_version_number
    refute_nil ::Sample::VERSION
  end

  def test_it_does_something_useful
    assert false
  end
end

修正後

require 'test_helper'

class SampleTest < Test::Unit::TestCase # <- 修正後
  def test_that_it_has_a_version_number
    refute_nil ::Sample::VERSION
  end

  def test_it_does_something_useful
    assert false
  end
end

5. テストの実行

rake testコマンドを実行するとtestディレクトリの下にあるテストを実行します。 二つのテストを実行し、一つは成功、もう一つは失敗します。

rake test
Loaded suite
/path/to/ruby/lib/ruby/gems/2.3.0/gems/rake-12.0.0/lib/rake/rake_test_loader
Started
F
================================================================================
Failure: <false> is not true.
test_it_does_something_useful(SampleTest)
/path/to/sample/test/sample_test.rb:9:in `test_it_does_something_useful'
      6:   end
      7:
      8:   def test_it_does_something_useful
  =>  9:     assert false
     10:   end
     11: end
================================================================================
.

Finished in 0.011521 seconds.
--------------------------------------------------------------------------------
2 tests, 2 assertions, 1 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
50% passed
--------------------------------------------------------------------------------
173.60 tests/s, 173.60 assertions/s
rake aborted!
Command failed with status (1)

Tasks: TOP => test
(See full trace by running task with --trace)

6. オリジナルのテストを作る

次のルールに従ってオリジナルのテストを作成します。

  • testディレクトリの下にテストを作成します。
  • ファイルの名前は、xxx_test.rbのようにします。
  • テストはsub/testのようなサブディレクトリに置くこともできます。

ディレクトリレイアウトの例

test
|-- sample_test.rb
|-- sub
|   `-- sample2_test.rb
`-- test_helper.rb

サブディレクトリ内のテスト例

require 'test_helper'

module Sub
  class Sample2Test < Test::Unit::TestCase
    def test_that_it_has_a_version_number
      refute_nil ::Sample::VERSION
    end

    def test_it_does_something_useful
      assert false
    end
  end
end

7. 詳細な情報

公式のドキュメントを参照してください。