Rubyで利用できるテスティングフレームワークには、rspec
やminitest
などがあります。
fluentdやrroongaでは様々な理由から、これらのテスティングフレームワークの代わりにtest-unit
というテスティングフレームワークを利用しています。
この文章では、rspec
やminitest
の代わりにtest-unit
をとりあえず使ってみる方法を説明します。
bundleを使ってgemの雛形を作ります。
bundleはテストパッケージとして、現在rspec
とminitest
のみサポートしており、test-unit
は指定できません。
test-unit
に類似したminitest
の雛形を利用して、test-unit
の設定を行います。
bundle gem -t minitest example
Creating gem 'example'...
create example/Gemfile
create example/.gitignore
create example/lib/example.rb
create example/lib/example/version.rb
create example/example.gemspec
create example/Rakefile
create example/README.md
create example/bin/console
create example/bin/setup
create example/.travis.yml
create example/test/test_helper.rb
create example/test/example_test.rb
Initializing git repo in /private/tmp/example
.
|-- Gemfile
|-- README.md
|-- Rakefile
|-- bin
| |-- console
| `-- setup
|-- example.gemspec # <-- 変更します。
|-- lib
| |-- example
| | `-- version.rb
| `-- example.rb
`-- test
|-- example_test.rb # <-- 変更します。
`-- test_helper.rb # <-- 変更します。
gemspecファイルにtest-unitの設定を行います。
変更前
spec.add_development_dependency "minitest", "~> 5.0"
変更後
spec.add_development_dependency "test-unit", "~> 3.2.3"
変更前
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
require 'example' # <-- 作成したgemの名前になっています。
require 'minitest/autorun' # <-- ここを修正します。
変更後
LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
require 'example' # <-- 作成したgemの名前になっています。
require 'test/unit' # <-- test/unitに修正します。
minitestが生成する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
minitestはtest/xxx_test.rb
というテスト用のサンプルファイルを作成します。
このファイルをtest-unit用に修正します。
変更前
require 'test_helper'
class ExampleTest < MiniTest # <-- ここを修正します。
def test_that_it_has_a_version_number
refute_nil ::Example::VERSION
end
def test_it_does_something_useful
assert false
end
end
変更後
require 'test_helper'
class ExampleTest < Test::Unit::TestCase # <-- 修正後
def test_that_it_has_a_version_number
refute_nil ::Example::VERSION
end
def test_it_does_something_useful
assert false
end
end
rake test
を実行するとテストtest
ディレクトリ内のテストを行います。サンプルは二つのテストを行い一つのテストが失敗するようになっています。
rake test
Loaded suite /path/to/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(ExampleTest)
/path/to/example/test/example_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.008124 seconds.
------------------------------------------------------------------------------------------------------------------------------
2 tests, 2 assertions, 1 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
50% passed
------------------------------------------------------------------------------------------------------------------------------
246.18 tests/s, 246.18 assertions/s
rake aborted!
Command failed with status (1)
Tasks: TOP => test
(See full trace by running task with --trace)
minitest
と同様にテスト用のファイルは次のルールにしたがって作成します。
- ファイルは
test
ディレクトリ以下に作成する - ファイル名はxxx_test.rbという名前にする
- testディレクトリ直下でなくても、
test/sub
のようなサブディレクトリでも良い
例
test
|-- example_test.rb
|-- sub
| `-- example2_test.rb
`-- test_helper.rb
require 'test_helper'
module Sub
class Example2Test < Test::Unit::TestCase
def test_that_it_has_a_version_number
refute_nil ::Example::VERSION
end
def test_it_does_something_useful
assert false
end
end
end
オフィシャルのドキュメントを読みましょう。