脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

[Ruby]Ruby本体のテストフレームワークの歴史(移り変わり)について

Rubyのテストフレームワーク

Rubyにはデフォルトでテストフレームワークが入っていますが、versionによってその中身が変移していっているのでその説明です。


はじめに

これは以下のクリアコードさんのページを自分なりに噛み砕いたものになっています。
http://www.clear-code.com/blog/2014/11/6.html

テストフレームワークの歴史

  1. Test::Unit (v1.8-v1.9.0, v2.1-)
    • 過去のversionまでRuby本体に入っていたテストフレームワーク
    • requireするときに require "test/unit"と書くことからtest/unitと呼ばれていた(v1.8の時代)
    • 複雑すぎてメンテナンスできないために、Ruby本体から外れる。その代わりにminitestがRuby本体に入る(v1.9.1)
      • Ruby本体から外れたTest::Unitはtest-unitというgemになって開発が続けられる
      • 過去のテストが使えるようにTest::Unit互換APIRuby本体に残った(⇒Ruby本体のテストがTest/Unitで書かれていたため)
        • ⇒このminitestのTest/Unit互換APIがtest/unitと呼ばれるようになる
  2. minitest(v1.9.1-)
    • Test::Unitに変わってRuby本体に入ったテストフレームワーク
    • ただしTest::Unit互換APIを持つので以前のテストコードがそのまま使える(v2.1まで)
    • 2.1時点で上記の互換性をなくしたminitest5をリリース
      • test/unit(Test::Unit互換API)が動かなくなる ⇒ Ruby本体のテストが動かなくなる
      • 古いminitest4と互換APIを退避して保存して、テストを引き続き出来るようにした(ただしruby commiter向け)
        • minitest5で上書かれないように配置場所を移動

          (移動前)
            lib/minitest/*.rb
            lib/test/unit.rb
            lib/test/unit/**/*.rb
          (移動後)
            test/lib/minitest/*.rb
            test/lib/test/unit.rb
            test/lib/test/unit/**/*.rb
          


  3. test-unit

    • 最新のminitest5がTest::Unit互換APIを廃止したため、過去のテストコードが使えなくなった
      • これに対応するためにgemとなって開発が続いていたTest::UnitをRuby本体に戻した
        • ⇒このTest::Unitのgemをtest-unitという

test/unit

Ruby本体に入っているtest/unit/以下のファイル。時期によって内容が違う
(RVMでinstallした場合/usr/local/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/test)

        Ruby 1.8   : Test::Unitのこと
        Ruby 1.9.1 : minitest用のTest::Unit互換API
        Ruby 2.1   : minitest5でTest::Unit互換APIが使えなくなったので、延命でtestディレクトリをきって古いminitest4と互換APIをのこした。このぎりぎり生き残った互換APIのこと
        Ruby 2.2   : minitest5でTest::Unit互換APIが使えなくなったので、Test::Unitのテストを使い続けられるように再導入されたTest::Unitのgem(test-unit)
      (ソースからビルドした場合/usr/local/lib/ruby/gems/2.2.0/gems/test-unit-3.0.6/lib/test/unit.rb)


Ruby2.2では・・・

  • 最新版minitestが導入される予定(⇒Test::Unit互換API使えない)
  • 最新版test-unitが導入される予定(⇒こっちはTest::Unit記法のテストが使える)


えっと、つまり・・・?

  • Ruby2.1まではrequire "test/unit"はminitestのAPIを呼んでいた
    • 今まではUnit::Test互換があったからよかった
    • でも2.2からは互換がなくなったから、Unit::Test記法で書いていた場合は今までのテストコードは使えなくなる
    •  
  • test-unit(Test::Unitのgem版)を使うようにすればいい
  •  
    • 2.1系までは「require "test/unit"」はminitestの互換APIを読んでいたが、2.2系からはtest-unitが呼ばれるよになった
    • (/usr/local/lib/ruby/gems/2.2.0/gems/test-unit-3.0.6/lib/test/unit.rb)

      require 'test/unit/testcase'
      require 'test/unit/autorunner'
      module Test # :nodoc:
        #
        # = Test::Unit - Ruby Unit Testing Framework
        #
        # == Introduction
        #
        # Unit testing is making wa
      ・
      ・
      ・
      

test-unit(Test::Unit)の使い方

portaltan.hatenablog.com