Text
Page: 1
The history of
testing framework
in Ruby
Kouhei Sutou
ClearCode Inc.
RubyKaigi 2015
2015-12-12
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 2
Silver sponsor
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 3
Goal
目標
You know about
/\Atest.+unit\z/i
/\Atest.+unit\z/iを知ること
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 4
Test
テスト
Which Rubies do include
/\Atest.+unit\z/i?
/\Atest.+unit\z/iを含んでいるRubyはどれでしょう?
1.4
1.9.1
2.0
2.3
The history of testing framework in Ruby
1.6
1.9.2
2.1
1.8
1.9.3
2.2
Powered by Rabbit 2.1.9
Page: 5
Answer
答え
Which Rubies do include
/\Atest.+unit\z/i?
/\Atest.+unit\z/iを含んでいるRubyはどれでしょう?
1.4
1.9.1
2.0
2.3
The history of testing framework in Ruby
1.6
1.9.2
2.1
1.8
1.9.3
2.2
Powered by Rabbit 2.1.9
Page: 7
Characters
登場人物
testsupp
Lapidary
Test::Unit
test-unit
RSpec
The history of testing framework in Ruby
RubyUnit
test/unit
minitest
Powered by Rabbit 2.1.9
Page: 8
Ruby 1.3 times
Ruby 1.3の時代
✓ 1998-1999
✓ The first testing framework
for Ruby was released
最初のRuby用のテスティングフレームワークがリリース
✓ testsupp
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 9
testsupp
✓ 1999-4-11: [ruby-talk:00634]
ANN: testsupp.rb 0.1
✓ Perl's Test like API
PerlのTestモジュールのようなAPI
✓ Perl's Test exists since 1998
PerlのTestモジュールは1998からある
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 10
testsupp: API
require "testsupp"
include TestSupp
start_tests
ok "Hello" == "Hello"
end_tests
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 11
Ruby 1.4 times
Ruby 1.4の時代
✓ 1999-2000
✓ The first xUnit testing
framework for Ruby was
released
最初のRuby用のxUnit系テスティングフレームワークが
リリース
✓ RubyUnit
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 12
RubyUnit
✓ Since 1999-11-20 at least
少なくとも1999年11月20日には存在していた
✓ [ruby-list:18594]
"RubyUnit のページは当分更新されないと思うです."
✓ The first xUnit testing
framework for Ruby
最初のRuby用のxUnit系テスティングフレームワーク
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 13
FYI: XP
参考情報:XP
✓ eXtream Programing
✓ The first XP book was
published at 1999
最初のXPの本は1999年に出版
✓ xUnit was born from XP
xUnitはXPが生み出した
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 14
RubyUnit: API
require "runit/testcase"
class TestCalc < RUNIT::TestCase
def test_add
assert_equal(3, 1 + 2)
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 15
RubyUnit: Impression
感想
Ruby-ish
Rubyっぽい
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 16
RubyUnit: FYI
RubyUnit:参考情報
✓ Test generator exists
テストジェネレーターがある
✓ Test exec command exists
テスト実行コマンドがある
gem exists since 2014-10-12
✓ rubyunit
rubyunitというgemが2014年10月12日から存在する
✓ Not
related product
関係のないプロダクト
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 17
Ruby 1.6 times: 1
Ruby 1.6の時代:1
✓ 2000-2002
✓ The second xUnit testing
framework for Ruby was
released
2つ目のRuby用のxUnit系テスティングフレームワークが
リリース
✓ Lapidary
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 18
Lapidary
✓ The first release was
2001-03-20
最初のリリースは2001年3月20日
✓ The second xUnit testing
framework for Ruby
2つ目のRuby用のxUnit系テスティングフレームワーク
✓ Maybe
たぶん
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 19
Lapidary: API
require "Lapidary/TestCase"
class TC_Adder < Lapidary::TestCase
def testAdd
assertEqual(3, 1 + 2)
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 20
Lapidary: Impression
感想
Not Ruby-ish
Rubyっぽくない
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 21
Lapidary: FYI
参考情報
✓ Has GUI test runner
GUIのテスト実行機能アリ
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 22
Ruby 1.6 times: 2
Ruby 1.6の時代:2
✓ Started trying to bundle a
testing framework to Ruby
テスティングフレームワークをRubyにバンドルする
試みを開始
✓ RubyUnit + Lapidary = Test::Unit
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 23
Test::Unit
✓ Since 2002-02:
[ruby-talk:34744]
✓ The first /\Atest.+unit\z/i
最初の/\Atest.+unit\z/i
✓ The author is the author of
Lapidary
Lapidaryの作者が作者
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 24
Test::Unit: API
require "test/unit"
class TC_Adder < Test::Unit::TestCase
def test_add
assert_equal(3, 1 + 2)
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 25
Test::Unit: Impression
感想
Ruby-ish
Rubyっぽい
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 26
Test::Unit: FYI 1
参考情報1
✓ API is based on RubyUnit
APIはRubyUnitのよう
✓ Has RubyUnit compatible API
RubyUnit互換APIアリ
✓ Impl. is based on Lapidary
実装はLapidaryベース
✓ Has GUI test runner
GUIのテスト実行機能アリ
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 27
Wrap up: Before Ruby 1.8
Ruby 1.8の前までのまとめ
✓ testsupp: Perl like API
✓ RubyUnit: Ruby-ish xUnit
✓ Lapidary: Not Ruby-ish xUnit
✓ Test::Unit:
✓ RubyUnit API + Lapidary Impl.
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 28
Ruby 1.8 times: 1
Ruby 1.8の時代:1
✓ 2003-2013
✓ Ruby bundled a testing
framework
Rubyがテスティングフレームワークをバンドルした
✓ Test::Unit aka test/unit
バンドルされたのはTest::Unit
test/unitとも呼ばれる
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 29
FYI: Why test/unit?
参考情報:なぜtest/unitと呼ぶか
require "test/unit"
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 30
Ruby 1.8 times: 2
Ruby 1.8の時代:2
RSpec was born
RSpec誕生
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 31
RSpec
✓ Since 2005-08
✓ Tool for Behavior Driven
Development
振る舞い駆動開発用のツール
✓ Active development
開発は活発
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 32
RSpec 0.1.0: API
# 2005-08
require "spec"
class SpecAdd < Spec::Context
def add
(1 + 2).should_equal 3
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 33
RSpec: 1.0.0: API
# 2007-05
require "spec"
describe "Add" do
it "should support positive + positive" do
(1 + 2).should == 3
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 34
RSpec 1.0.0: Impression
感想
Engl-ish
英語っぽい
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 35
RSpec: FYI
参考情報
✓ Test exec command exists
テスト実行コマンドがある
✓ RubyUnit like
RubyUnitみたい
✓ More features
than Test::Unit
Test::Unitより機能が多い
✓ Mock, Not implemented, ...
モックや未実装など
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 36
Test::Unit in Ruby 1.8
Ruby 1.8バンドル後のTest::Unit
✓ No active development
開発は停滞
✓ Maintainer was changed
メンテナー交代
✓ The author of minitest
後のminitestの作者
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 37
RSpec and Test::Unit
✓ RSpec is getting better but
Test::Unit isn't changed...
RSpecはよくなっているのにTest::Unitは変わらない。。。
✓ Test::Unit should also be
getting better!
Test::Unitももっとよくしたい!
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 38
Test::Unit:
new maintainer
新しいメンテナー
✓ New maintainer said:
新メンテナー曰く
✓ Can't maintain Test::Unit because
it's too complex
Test::Unitは複雑すぎてメンテナンスできない
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 39
Wrap up: Ruby 1.8 times
Ruby 1.8時代のまとめ
✓ Ruby started bundling
Test::Unit (/\Atest.+unit\z/i)
RubyがTest::Unitのバンドルを始めた
✓ But Test::Unit was died...
バンドル後、Test::Unitは死んだ。。。
✓ RSpec was born and active
RSpecが生まれ、活発だった
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 40
Ruby 1.9 times
Ruby 1.9の時代
✓ 2009-2014
✓ Ruby dropped Test::Unit
RubyがTest::Unitを捨てた
✓ Because Test::Unit is too complex
for new maintainer
新メンテナーにはTest::Unitは複雑すぎるから
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 41
Test::Unit → test-unit
✓ Released as test-unit gem
test-unit gemとしてリリース
✓ Still /\Atest.+unit\z/i
名前変更後も/\Atest.+unit\z/i
✓ test-unit
1.2.3 == Test::Unit in Ruby 1.8
✓ Maintainer was changed
メンテナー交代
✓ Me
私
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 42
test-unit
✓ Since 2008-03
✓ Active development
開発は活発
✓ High backward compatibility
高い後方互換性
✓ Exception: Inheritance
例外:継承時の挙動
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 43
minitest
✓ Since 2008-10
✓ Active development
開発は活発
✓ The author is the new
maintainer of Test::Unit
作者はTest::Unitの新メンテナー
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 44
minitest and Test::Unit
✓ Mini, simple, clean and fast
小さくてシンプルでキレイで速い
✓ The author said:
作者曰く
✓ 100% Test::Unit compatible
Test::Unitと100%互換
✓ But it's not compat in fact...
実際は互換ではなかった。。。
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 45
test/unit in Ruby 1.9
✓ Provide Test::Unit API
Test::Unit互換APIを提供
✓ Wrapper of minitest
minitestのラッパー
✓ Ruby developers developed it
not minitest author
minitestの作者ではなくRuby開発者が開発
✓ Not Test::Unit
but /\Atest.+unit\z/i
Test::Unitではないが/\Atest.+unit\z/iではある
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 46
Wrap up: Ruby 1.9 times
Ruby 1.9時代のまとめ
✓ Ruby dropped Test::Unit
RubyがTest::Unitを捨てた
✓ Test::Unit
→ test-unit gem
✓ Ruby bundled minitest
Rubyはminitestをバンドルした
✓ Ruby created test/unit
(test/unit provided Test::Unit API)
RubyはTest::Unit APIを提供するtest/unitを新しく作った
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 47
Ruby 2.0 times
Ruby 2.0の時代
✓ 2013-
✓ No highly important things
特筆すべきことはない
✓ test-unit, minitest and RSpec
were actively developed
test-unitもminitestもRSpecも活発に開発が進んでいた
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 48
Ruby 2.1 times: 1
Ruby 2.1の時代:1
✓ 2013-
✓ minitest 5 introduced
incompatible changes
minitest 5で非互換の変更が入った
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 49
minitest 5
✓ test/unit maintainer said:
test/unitメンテナー曰く
✓ Can't maintain test/unit with
minitest 5
minitest 5向けのtest/unitはメンテナンスできない
✓ test/unit for minitest was
dropped
minitestのラッパーとしてのtest/unitを捨てた
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 50
Is no test/unit problem?
test/unitがないことは問題なのか?
✓ Ruby used test/unit for
Ruby's tests
RubyはRubyのテストにtest/unitを使っていた
✓ No test/unit means existing tests
can't be worked
test/unitがなくなると既存のテストが動かない
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 51
Solution idea: 1
解決案:1
✓ Keep bundling and using
minitest 4
minitest 4のバンドルを継続し、使い続ける
✓ Users will be confused because
the latest Ruby doesn't bundle
the latest minitest
最新のRubyに最新のminitestがバンドルされていないと
ユーザーは混乱しそう
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 52
Solution idea: 2
解決案:2
✓ Bundle the latest minitest
最新のminitestをバンドルする
✓ Ruby uses minitest 4 and test/
unit for its tests
Rubyのテストにはminitest 4とtest/unitを使う
Accepted!
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 53
Note for idea 2
案2の補足
✓ Need to care existing
Test::Unit API users
既存のTest::Unit APIユーザーをケアする必要がある
✓ Backward compat is important!
後方互換性は重要!
✓ Bundle test-unit gem too for
Test::Unit API
Test::Unit互換APIのためにtest-unit gemもバンドル
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 54
Wrap up: Ruby 2.1 times
Ruby 2.1時代のまとめ
✓ Ruby developers decided to
maintain minitest 4 and test/
unit for Ruby's tests
Ruby開発者はRubyのテスト用にminitest 4とtest/unitをメ
ンテナンスすることを決めた
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 55
Ruby 2.2 times: 1
Ruby 2.2の時代:1
✓ 2014-
✓ Upgraded bundled minitest to
5
バンドルしているminitestを5に更新
✓ Moved minitest 4 and test/unit to
test/
minitest 4とtest/unitはtest/以下に移動
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 56
Upgraded minitest to 5
minitest 5に更新
-
lib/minitest/*.rb
+ test/lib/minitest/*.rb
-
lib/test/unit.rb
+ test/lib/test/unit.rb
-
lib/test/unit/**/*.rb
+ test/lib/test/unit/**/*.rb
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 57
Ruby 2.2 times: 2
Ruby 2.2の時代:2
✓ Bundled test-unit gem again
for users
再びtest-unit gemをバンドル
✓ Ruby 1.9 dropped test-unit gem
Ruby 1.9はtest-unit gemを捨てた
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 58
Bundled test-unit again
test-unitを再びバンドル
test-unit gem provides:
lib/test-unit.rb
lib/test/unit.rb
lib/test/unit/**/*.rb
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 59
test/unit in Ruby 2.2
Ruby 2.2のtest/unit
✓ For Ruby developers
Ruby開発者にとっては
✓ test/lib/test/unit
✓ For users
ユーザーにとっては
✓ lib/test/unit = test-unit gem
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 60
FYI: test/lib/test/unit
✓ Includes useful features for
Ruby's tests
Ruby本体のテストに便利な機能が入っている
✓ Leak checker for file descriptor,
thread, process...
リークチェッカー:ファイルディスクリプターやスレッ
ドのリークやゾンビプロセスを検出
✓ Memory usage profiler
メモリー使用量のプロファイラー
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 61
Wrap up: Ruby 2.2 times
Ruby 2.2時代のまとめ
✓ Bundled minitest 5
minitest 5をバンドル
✓ Bundled test-unit again
再びtest-unitをバンドル
✓ Ruby's tests used forked
mintiest 4 and test/unit
Rubyのテストはフォークしたminitest 4とtest/unitを使う
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 62
Ruby 2.3 times
Ruby 2.3の時代
✓ 2015-
✓ No highly important things
特筆すべきことはない
✓ test-unit, minitest, test/lib/
test/unit and RSpec were actively
developed
test-unitもminitestもtest/lib/test/unitもRSpecも活
発に開発が進んでいた
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 63
Wrap up: History: 1
歴史のまとめ:1
✓ Ruby 1.4 and 1.6 didn't
bundle any testing framework
Ruby 1.4と1.6はテスティングフレームワークをバンドル
していなかった
✓ Test::Unit was born in Ruby
1.6 times
Ruby 1.6の時代にTest::Unitが生まれた
✓ The first /\Atest.+unit\z/i
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 64
Wrap up: History: 2
歴史のまとめ:2
✓ Ruby 1.8 bundled Test::Unit
Ruby 1.8はTest::Unitをバンドルした
✓ /\Atest.+unit\z/i in 1.8
✓ Ruby 1.9 dropped Test::Unit
and bundled minitest
Ruby 1.9はTest::Unitを捨ててminitestをバンドルした
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 65
Wrap up: History: 3
歴史のまとめ:3
✓ Ruby 1.9 provided test/unit
as a wrapper of minitest
Ruby 1.9はminitestのラッパーとしてtest/unitを提供した
✓ test/unit provided Test::Unit
compatible API
test/unitはTest::Unitの互換APIを提供した
✓ /\Atest.+unit\z/i in 1.9
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 66
Wrap up: History: 4
歴史のまとめ:4
✓ Ruby 2.0 is same as Ruby 1.9
Ruby 2.0の状況はRuby 1.9と変わらない
✓ test/unit is /\Atest.+unit\z/i in
2.0
つまり、2.0での/\Atest.+unit\z/iはtest/unit
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 67
Wrap up: History: 5
歴史のまとめ:5
✓ Ruby 2.1 didn't upgrade
minitest to 5
Ruby 2.1はminitestを5に更新しなかった
✓ minitest 5 has backward
incompatible changes
minitest 5には後方非互換の変更があった
✓ They break Ruby's tests
非互換を受け入れるとRubyのテストが動かなくなる
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 68
Wrap up: History: 6
歴史のまとめ:6
✓ Ruby 2.2 upgraded minitest
Ruby 2.2はminitestを5に更新した
✓ Dropped test/unit as minitest
wrapper
Ruby 2.2はminitestのラッパーのtest/unitを捨てた
✓ Used forked minitest 4 and test/
unit for its tests
Ruby 2.2はRubyのテスト用にminitest 4のフォークと
test/unitを使うことにした
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 69
Wrap up: History: 7
歴史のまとめ:7
✓ Ruby 2.2 bundled test-unit
gem again
Ruby 2.2はtest-unit gemを再びバンドルした
✓ /\Atest.+unit\z/i in 2.2
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 70
Wrap up: History: 8
歴史のまとめ:8
✓ test/lib/test/unit was
evolved for Ruby's tests
test/lib/test/unitはRubyのテスト用に進化した
✓ /\Atest.+unit\z/i in 2.2 too
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 71
Wrap up: History: 9
歴史のまとめ:9
✓ No highly important things
in Ruby 2.3
Ruby 2.3には特筆すべきことはない
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 72
What's /\Atest.+unit\z/i
/\Atest.+unit\z/iはなにか
Test::Unit
compatible API
Test::Unit互換API
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 73
Test::Unit compat API
Test::Unit互換API
class XXXTest < Test::Unit::TestCase
def test_xxx
assert_equal(xxx, yyy)
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 74
Test::Unit API spirit
Test::Unit APIの魂
Ruby-ish
Rubyらしさ
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 75
Ruby-ish in Test::Unit
Test::UnitでのRubyらしさ
✓ Write test as normal Ruby
script
普通のRubyスクリプトのようにテストを書ける
✓ It's important in minitest too
minitestもこれを大事にしている
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 76
By example: 1
実例:1
Grouping tests
テストのグループ化
↓
class
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 77
Group: 1
グループ化:1
class TestAdd < Test::Unit::TestCase
def test_positive_positive
assert_equal(3, 1 + 2)
end
def test_positive_negative
assert_equal(-2, 1 + -3)
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 78
Group: 2
グループ化:2
class TestSub < Test::Unit::TestCase
def test_positive_positive
assert_equal(-2, 1 - 3)
end
def test_positive_negative
assert_equal(4, 1 - -3)
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 79
Group: 3
グループ化:3
class TestCalc < Test::Unit::TestCase
class TestAdd < self # TestAdd < TestCalc
# def test_positive_positive
# def test_positive_negative
end
class TestSub < self # TestAdd < TestCalc
# def test_positive_positive
# def test_positive_negative
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 80
Wrap up: Group: 1
グループ化のまとめ:1
✓ Test case has tests
テストケースは複数のテストを持つ
✓ Test case is class
テストケースをクラスとして実装
✓ Test is method
テストをメソッドとして実装
✓ Class has methods
クラスは複数のメソッドを持つ
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 81
Wrap up: Group: 2
グループ化のまとめ:2
✓ Sub test case is sub class
サブテストケースはサブクラスとして実装
✓ Sub test case is-a parent test
case
TestAdd is a test case of TestCalc
サブテストケースは親テストケースとis-aの関係
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 82
FYI: Group
参考情報:グループ化
✓ Test::Unit and minitest
don't support sub test case
is a sub class
Test::Unitとminitestはサブクラスでサブテストケースを
作ることをサポートしていない
✓ test-unit only supports it
test-unitだけがサポートしている
✓ It's the only one incompatible
唯一の非互換
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 83
FYI: Group DSL
参考情報:グループ化DSL
class TestCalc < Test::Unit::TestCase
sub_test_case "+" do
test "positive + negative" {}
end
sub_test_case "-" do
test "positive - negative" {}
end
end
test-unit feature
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 84
By example: 2
実例:2
Share tests
テストの共有
↓
module
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 85
Share: 1
共有:1
module KVSTests
def test_read_write
@kvs[:key] = :value
assert_equal(:value, @kvs[:key])
end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 86
Share: 2
共有:2
class TestKVSHash < Test::Unit::TestCase
include KVSTests
def setup; @kvs = {}; end
end
class TestKVSOpenStruct < Test::Unit::TestCase
include KVSTests
def setup; @kvs = OpenStruct.new; end
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 87
Wrap up: Share
共有のまとめ
✓ Tests can be shared by module
モジュールでテストを共有できる
✓ Module is used for sharing method
implementations in Ruby
Rubyではモジュールはメソッドの実装を共有するために
使われている
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 88
By example: 3
実例:3
Assertion
アサーション
↓
Write as-is
そのまま書く
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 89
Assert: Equal
アサート:等価
def test_add
assert_equal(3,
1 + 2)
# ↑↓ as-is
# RSpec: expect(1 + 2).to eq(3)
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 90
Assert: Predicate
アサート:述語
def test_exist_readme
assert(File.exist?("README"))
# ↑ as-is ↓ not as-is
# RSpec: expect(File).to exist("README")
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 91
Message from minitest
1) Failure:
TestFile#test_exist_readme [test-file-minitest.rb:5]:
Failed assertion, no message given.
Less information
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 92
Message from RSpec
1) File README should exist
Failure/Error: expect(File).to exist("README")
expected File to exist
# ./spec-file.rb:5:in `block (2 levels) in <top (required)>'
Colorized and snippet
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 93
Message from test-unit
Failure: <false> is not true.
test_exist_readme(TestFile)
test-file-test-unit.rb:5:in `test_exist_readme'
2:
3: class TestFile < Test::Unit::TestCase
4: def test_exist_readme
=> 5:
assert(File.exist?("README"))
6: end
7: end
Colorized and snippet
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 94
power-assert
def test_exist_readme
assert do # ↓ as-is
File.exist?("README")
end
end
Built-in in test-unit
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 95
Message: power-assert
Failure:
File.exist?("README")
|
|
|
false
File (NOTE: ← Receiver information)
test_exist_readme(TestFile)
/usr/lib/ruby/vendor_ruby/power_assert.rb:36:in `start'
test-file-power-assert.rb:5:in `test_exist_readme'
2:
3: class TestFile < Test::Unit::TestCase
4:
def test_exist_readme
=> 5:
assert do
6:
File.exist?("README")
7:
end
8:
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 96
FYI: test-unit and power-
assert
✓ Don't recommend
"all power-assert"
すべてpower-assertは非推奨
✓ Recommend "power-assert only for
predicate"
述語だけpower-assertを推奨
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 97
Assert: Equal
# @group.users should return
# sorted names of user
assert_equal(user_names.sort,
@group.users)
# ↑ Align-able
assert do
@group.users == user_names.sort
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 98
Align
縦に並べる
✓ Indicate compare targets
visually
視覚的に比較対象ということを示す
✓ Clarify differences visually
視覚的に違いを明確にする
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 99
Experiment: 1
実験:1
Find a difference!
違うところを探せ!
Hello | Heilo
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 100
Experiment: 2
実験:2
Find a difference!
違うところを探せ!
Hello
Heilo
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 101
Align in Ruby
Rubyで縦に並べる
# Arguments are natural
method(arg1,
arg2)
# Operands aren't natural
operand1 ==
operand2
引数だと自然だけどオペランドだと不自然
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 102
FYI: test-unit and power-
assert
✓ Don't recommend
"all power-assert"
すべてpower-assertは非推奨
✓ Recommend "power-assert only for
predicate"
述語だけpower-assertを推奨
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 103
FYI: Fixture
参考情報:フィクスチャー
Ensure
clean test
environment
キレイなテスト環境を用意する仕組み
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 104
Fixture: e.g.
フィクスチャー:例
def setup;
p :s;
def teardown; p :t;
def test_1;
p :t1;
def test_2;
p :t2;
# :s -> :t1 -> :t ->
# :s -> :t2 -> :t
The history of testing framework in Ruby
end
end
end
end
Powered by Rabbit 2.1.9
Page: 105
Fixture: Open file
フィクスチャー:ファイルを開く
def setup
@file = File.open("x")
end
def teardown
@file.close
end
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 106
Fixture: Open file
フィクスチャー:ファイルを開く
Not Ruby-ish
Rubyっぽくない
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 107
Fixture: Open File
フィクスチャー:ファイルを開く
def setup # Ruby-ish version
File.open("x") do |file|
@file = file
yield
end # Close file automatically
end
New feature in test-unit
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 108
Wrap up: Test::Unit API
まとめ:Test::Unit API
✓ Ruby-ish is important in
Test::Unit API
Test::Unit APIではRubyらしいことは重要
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 109
Wrap up: Test::Unit API
まとめ:Test::Unit API
✓ (Sub) test case by
class
(sub)
(サブ)テストケースには(サブ)クラスを使う
✓ Share tests by module
テストの共有にはモジュールを使う
✓ as-is in assert
アサートではそのままの使い方で書く
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 110
Wrap up: Test::Unit API
まとめ:Test::Unit API
✓ More Ruby-ish
さらにRubyっぽく
✓ Support block based fixture
ブロックを使ったフィクスチャーもサポート
The history of testing framework in Ruby
Powered by Rabbit 2.1.9
Page: 111
Goal
目標
You know about
/\Atest.+unit\z/i
/\Atest.+unit\z/iを知ること
The history of testing framework in Ruby
Powered by Rabbit 2.1.9