テストとかの話
矢口裕也
(@yayugu)
「みんなー
テスト書いてる?」
みたいなの飽きたよね
今日は
TDDとBDDとAgileとかの開発スタイル
と
テスト哲学の話を
しません
Testing Framework
の話をします
Testing Framework
大きく分けて2つ
xUnit
xSpec
xUnit
class TestInteger < UnitTest
def test_add
assert_equal(2, 1 + 1)
end
end
xSpec
describe Integer
context 'when add 2 numbers' do
it 'should return sum' do
2.should eq(1 + 1)
expect(2).to eq(1 + 1)
end
end
end
ここで質問
どっちが好き?
xUnit
xSpec
ほうほう
なんで?
自分がなぜ
そのテストフレームワークを
好きか
答えられる?
みんなに言いたい
自分が使う
ツールのことを
もっと良く知ろう
フレームワークは
よく考えて
ちゃんと選ぼう
自分の話
さいきんRubyだと
minitest使ってる
iOSだと
SenTestingKit
何を考えて
これらを選んだのか
xUnit
xSpec
この2つを比較
※思想とかは考えない
比較方法
機能でそれぞれ2つの
パーツに分類してから比較
xUnit
- test class
class TestHoge, def test_hoge
- assertion
assert_equalとか
xSpec
- behavior
describe, context, it
- expectation
should, expect
①機能の違い
②表記の違い
③実装の違い
assertionとexpectation
→同じもの
test classとbehavior
→振る舞いの階層化ができるか
②表記の違い
assertionと
expectationに
ついてのみ比較
参考フレームワーク:
Ruby
- minitest
- RSpec
Obj-C
- SenTestingKit
- Kiwi
Ruby
minitest
assert_equal(2, 1 + 1)
RSpec
(should)
(1 + 1).should eq(2)
RSpec
(expect)
expect(1 + 1).to eq(2)
assert_equal(2, 1 + 1)
(1 + 1).should eq(2)
expect(1 + 1).to eq(2)
Obj-C
SenTestingKit
STAssertEquals(2, 1 + 1);
Kiwi
(should)
[[foo should] equal:bar];
Kiwi
(expect)
[[theValue(1 + 1) should]
equal:theValue(2)];
STAssertEquals(2, 1 + 1)
[[foo should] equal:bar];
[[theValue(1 + 1) should] equal:theValue(2)];
表記の簡潔さ
assert > should > expect
③実装の違い
assert
の実装
global or
test classのインスタンスに
assert関数を定義
class UnitTest
def assert_equal(expect, actual)
if (expect == actual)
puts '.'
else
puts('F')
end
end
end
expectation
の実装
2スタイルある
- should
- expect
should
の実装
RSpec
BasicObject.module_eval do
def should(...)
...
end
end
BasicObjectに
shouldを追加!!!
voodoo感ある
Kiwi
@interface NSObject (...)
- (void)should;
...
@end
NSObjectに
カテゴリとして
shouldを追加!!!
voodoo感ある
expect
の実装
RSpec
::RSpec::Matchers.module_eval do
def should(...)
...
end
end
BasicObjectオブジェクトを
汚染しないため
shouldよりmagic少ない
toやeqの実装は
面倒そう
Kiwi
#define theValue(expr) \
({ \
...
[KWValue valueWithBytes:...
})
Kiwiも
同様
実装の健全さ
assert > expect > should
まとめ
-test class, behaviorの機能差
階層化できるか
-assert, expectの機能差
なし
-表記の簡潔さ
assert > should > expect
-実装の健全さ
assert > expect > should
使うべき
Testing Framework
A. 階層化が不要:
test class + assertion
→ xUnit
B. 必要:
階層構造 + assertion
→
minitest
Test::More subtest
など
を使うべき
サンプルコード
describe Integer
context 'when add 2 numbers' do
it 'should return sum' do
assert_equal(2, 1 + 1)
end
end
end
ここに書いたのは
あくまで俺の考え
「なんとなく」
ではなくちゃんと考えて
Testing Framework
を選んで使おう
Happy testing!