test-unit の TAP 出力用 Rakefile

test-unit の test-unit-runner-tap を使って Test Anything Protocol (TAP) 出力をおこなわせる備忘録です。

bundler で sample gem を作ります。

$ gem install bundler
$ bundle gem sample --test minitest --mit
$ cd sample

GEM テンプレート sample.gemspec に test-unit と test-unit-runner-tap を指定しておきます。

# 途中略

Gem::Specification.new do |spec|
  # 途中略
  spec.add_development_dependency "bundler", "~> 1.17"
  spec.add_development_dependency "rake", "~> 12.3"
  spec.add_development_dependency "test-unit", "~> 3.2"
  spec.add_development_dependency "test-unit-runner-tap", "~> 1.1"
end

test/test_helper.rb を minitest から test-unit 用へ変更します。

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

require "test/unit"
require "test/unit/runner/tap"

test/sample_test.rb も test-unit 用へ書き換えます。

require "test_helper"

class SampleTest < Test::Unit::TestCase
  test "it has a version number" do
    assert { ::Sample.const_defined?(:VERSION) && ! ::Sample::VERSION.nil? }
  end

  test "it does something useful" do
    assert true
  end
end

Rakefile の test タスクに TAP で出力するようにテスト・オプションを options に指定します。 コメント記載のように、 オプションの引数の前を等号にしないと正しく認識しなくなります。

ところで、 これの執筆時点での test-unit-3.2.9 はブロック引数とローカル・スコープで同じ変数名を使っているとの警告が出ます。 とりあえずの対応として ruby の警告表示をしないように warning を偽にしておきます。

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"]
  t.options = "--runner=tap"    # うっかり "--runner tap" と書かないこと
  t.warning = false             # test-unit-3.2.9 の警告潰し
end

task :default => :test

gem をインストールします。

$ bundle install --path=vendor/bundle

これで準備が終わりました。 TAP 出力になっているかどうか試してみます。

$ rake test
1..2
ok 1 - test: it does something useful(SampleTest)
ok 2 - test: it has a version number(SampleTest)
# Finished in 0.045080187 seconds.
# 2 tests, 2 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications