SlideShare a Scribd company logo
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
Silver sponsor
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Goal
目標
You know about
/Atest.+unitz/i
/Atest.+unitz/iを知ること
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Test
テスト
Which Rubies do include
/Atest.+unitz/i?
/Atest.+unitz/iを含んでいるRubyはどれでしょう?
1.4 1.6 1.8
1.9.1 1.9.2 1.9.3
2.0 2.1 2.2
2.3
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Answer
答え
Which Rubies do include
/Atest.+unitz/i?
/Atest.+unitz/iを含んでいるRubyはどれでしょう?
1.4 1.6 1.8
1.9.1 1.9.2 1.9.3
2.0 2.1 2.2
2.3
History
歴史
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Characters
登場人物
testsupp RubyUnit
Lapidary
Test::Unit test/unit
test-unit minitest
RSpec
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
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
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
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
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
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
RubyUnit: Impression
感想
Ruby-ish
Rubyっぽい
The history of testing framework in Ruby Powered by Rabbit 2.1.9
RubyUnit: FYI
RubyUnit:参考情報
Test generator exists
テストジェネレーターがある
✓
Test exec command exists
テスト実行コマンドがある
✓
rubyunit gem exists since 2014-10-12
rubyunitというgemが2014年10月12日から存在する
Not related product
関係のないプロダクト
✓
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
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
Lapidary: Impression
感想
Not Ruby-ish
Rubyっぽくない
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Lapidary: FYI
参考情報
Has GUI test runner
GUIのテスト実行機能アリ
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
Test::Unit
Since 2002-02:
[ruby-talk:34744]
✓
The first /Atest.+unitz/i
最初の/Atest.+unitz/i
✓
The author is the author of
Lapidary
Lapidaryの作者が作者
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
Test::Unit: Impression
感想
Ruby-ish
Rubyっぽい
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
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
FYI: Why test/unit?
参考情報:なぜtest/unitと呼ぶか
require "test/unit"
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
RSpec
Since 2005-08✓
Tool for Behavior Driven
Development
振る舞い駆動開発用のツール
✓
Active development
開発は活発
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
RSpec 1.0.0: Impression
感想
Engl-ish
英語っぽい
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
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
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
Wrap up: Ruby 1.8 times
Ruby 1.8時代のまとめ
Ruby started bundling
Test::Unit (/Atest.+unitz/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
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
Test::Unit → test-unit
Released as test-unit gem
test-unit gemとしてリリース
Still /Atest.+unitz/i
名前変更後も/Atest.+unitz/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
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
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
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
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.+unitz/i
Test::Unitではないが/Atest.+unitz/iではある
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.+unitz/i✓
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Wrap up: History: 2
歴史のまとめ:2
Ruby 1.8 bundled Test::Unit
Ruby 1.8はTest::Unitをバンドルした
/Atest.+unitz/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
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.+unitz/i in 1.9✓
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Wrap up: History: 4
歴史のまとめ:4
Ruby 2.0 is same as Ruby 1.9
Ruby 2.0の状況はRuby 1.9と変わらない
test/unit is /Atest.+unitz/i in
2.0
つまり、2.0での/Atest.+unitz/iはtest/unit
✓
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
Wrap up: History: 7
歴史のまとめ:7
Ruby 2.2 bundled test-unit
gem again
Ruby 2.2はtest-unit gemを再びバンドルした
/Atest.+unitz/i in 2.2✓
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Wrap up: History: 8
歴史のまとめ:8
test/lib/test/unit was
evolved for Ruby's tests
test/lib/test/unitはRubyのテスト用に進化した
/Atest.+unitz/i in 2.2 too✓
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
What's /Atest.+unitz/i
/Atest.+unitz/iはなにか
Test::Unit
compatible API
Test::Unit互換API
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
Test::Unit API spirit
Test::Unit APIの魂
Ruby-ish
Rubyらしさ
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
By example: 1
実例:1
Grouping tests
テストのグループ化
↓
class
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
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
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
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
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
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
By example: 2
実例:2
Share tests
テストの共有
↓
module
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
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
By example: 3
実例:3
Assertion
アサーション
↓
Write as-is
そのまま書く
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
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
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
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
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
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
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
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
Align
縦に並べる
Indicate compare targets
visually
視覚的に比較対象ということを示す
✓
Clarify differences visually
視覚的に違いを明確にする
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Experiment: 1
実験:1
Find a difference!
違うところを探せ!
Hello | Heilo
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Experiment: 2
実験:2
Find a difference!
違うところを探せ!
Hello
Heilo
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
FYI: Fixture
参考情報:フィクスチャー
Ensure
clean test
environment
キレイなテスト環境を用意する仕組み
The history of testing framework in Ruby Powered by Rabbit 2.1.9
Fixture: e.g.
フィクスチャー:例
def setup; p :s; end
def teardown; p :t; end
def test_1; p :t1; end
def test_2; p :t2; end
# :s -> :t1 -> :t ->
# :s -> :t2 -> :t
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
Fixture: Open file
フィクスチャー:ファイルを開く
Not Ruby-ish
Rubyっぽくない
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
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
Wrap up: Test::Unit API
まとめ:Test::Unit API
(Sub) test case by (sub) class
(サブ)テストケースには(サブ)クラスを使う
✓
Share tests by module
テストの共有にはモジュールを使う
✓
as-is in assert
アサートではそのままの使い方で書く
✓
The history of testing framework in Ruby Powered by Rabbit 2.1.9
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
Goal
目標
You know about
/Atest.+unitz/i
/Atest.+unitz/iを知ること

More Related Content

The history of testing framework in Ruby

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