rspec と cucumber
Post on 05-Dec-2014
9.971 Views
Preview:
DESCRIPTION
TRANSCRIPT
RSpec と Cucumber Powered by Rabbit 0.9.2
RSpec と Cucumber
とみたまさひろ2011-01-15
RSpec と Cucumber Powered by Rabbit 0.9.2
自己紹介
とみた まさひろ✓
プログラマー✓
mailto:tommy@tmtm.org✓
http://d.hatena.ne.jp/tmtms✓
http://twitter.com/tmtms✓
1/63
RSpec と Cucumber Powered by Rabbit 0.9.2
自己紹介
日本Rubyの会✓
日本MySQLユーザ会✓
Ruby/MySQL ライブラリ✓
Ruby歴, MySQL歴 十数年✓
2/63
RSpec と Cucumber Powered by Rabbit 0.9.2
自己紹介
こんな本書きました
3/63
RSpec と Cucumber Powered by Rabbit 0.9.2
NSEG
#1 Rubyの黒魔術✓
#3 はじめてのRuby拡張ライブラリ
✓
#6 Ruby紹介✓
4/63
RSpec と Cucumber Powered by Rabbit 0.9.2
今回は RSpec と
Cucumber の話
5/63
RSpec と Cucumber Powered by Rabbit 0.9.2
読みやすくて自動実行できるテスト
6/63
RSpec と Cucumber Powered by Rabbit 0.9.2
RSpec7/63
RSpec と Cucumber Powered by Rabbit 0.9.2
RSpec
Rubyプログラム用の TDDツール✓
最新バージョン 2.4✓
http://relishapp.com/rspec✓
8/63
RSpec と Cucumber Powered by Rabbit 0.9.2
RSpec
9/63
RSpec と Cucumber Powered by Rabbit 0.9.2
「The RSpec Book」
10/63
RSpec と Cucumber Powered by Rabbit 0.9.2
特徴
英語っぽい✓
モックが強力&簡単✓
ファイル変更時に自動的実行✓
テストカバー率が測れる✓
11/63
RSpec と Cucumber Powered by Rabbit 0.9.2
インストール
% sudo gem install rspec
12/63
RSpec と Cucumber Powered by Rabbit 0.9.2
基本的な書き方
ファイル名は *_spec.rb✓
○○について --- describe✓
○○の場合 --- context✓
○○となること --- it✓
13/63
RSpec と Cucumber Powered by Rabbit 0.9.2
基本的な書き方
describe Array do context 'when new' do it 'should be empty' do Array.new.should be_empty end it 'size should == 0' do Array.new.size.should == 0 end endend
14/63
RSpec と Cucumber Powered by Rabbit 0.9.2
実行
% rspec array_spec.rb..
Finished in 0.00054 seconds2 examples, 0 failures
15/63
RSpec と Cucumber Powered by Rabbit 0.9.2
ドキュメントっぽい出力
% rspec -fd array_spec.rb
Array when new should be empty size should == 0
Finished in 0.00068 seconds2 examples, 0 failures
16/63
RSpec と Cucumber Powered by Rabbit 0.9.2
冗長
describe Array do context 'when new' do it 'should be empty' do Array.new.should be_empty end it 'size should == 0' do Array.new.size.should == 0 end endend
17/63
RSpec と Cucumber Powered by Rabbit 0.9.2
簡潔に
describe Array do context 'when new' do it{should be_empty} its(:size){should == 0} endend
18/63
RSpec と Cucumber Powered by Rabbit 0.9.2
出力
% rspec -fd b.rb
Array when new should be empty size should == 0
Finished in 0.00078 seconds2 examples, 0 failures
19/63
RSpec と Cucumber Powered by Rabbit 0.9.2
subject
describe Array do context 'when new with 3' do subject{Array.new(3)} it{should == [nil, nil, nil]} its(:size){should == 3} endend
20/63
RSpec と Cucumber Powered by Rabbit 0.9.2
before & after
describe Hoge do before do # 前処理 @hoge = Hoge.new end after do # 後処理 @hoge.close end it '...' do @hoge.fuga.should == 123 endend
21/63
RSpec と Cucumber Powered by Rabbit 0.9.2
should
==, =~, >, >=, <, <=✓
be_xxx : obj.xxx? メソッドが真✓
be_true, be_false, be_nil✓
[1,2,3].should have(3).items✓
[1,2,3].should include(2)✓
22/63
RSpec と Cucumber Powered by Rabbit 0.9.2
例外処理
expect{...}.to raise_error(RuntimeError, 'msg...')
23/63
RSpec と Cucumber Powered by Rabbit 0.9.2
英語っぽいっていってもやりすぎだろJK
ary = []expect{ary.push 123}.to change{ary.size}.from(0).to(1)
24/63
RSpec と Cucumber Powered by Rabbit 0.9.2
モック25/63
RSpec と Cucumber Powered by Rabbit 0.9.2
モック
ダミーのオブジェクト✓
ファイル, ネットワーク, DB, 時刻, etc...
✓
double() でモックオブジェクトを作成
✓
26/63
RSpec と Cucumber Powered by Rabbit 0.9.2
モック
obj = double 'label', :size=>3obj.size #=> 3obj.hoge #=> Error
27/63
RSpec と Cucumber Powered by Rabbit 0.9.2
モック
obj = double 'Array'obj.stub(:size).and_return 3obj.stub(:values_at).with(0).and_return 'a'
# 呼ばれなかったらエラーobj.should_receive(:fetch)
28/63
RSpec と Cucumber Powered by Rabbit 0.9.2
モック
# 一度だけ呼び出されるobj.should_receive(:hoge).once
# n回以上呼び出されるobj.should_receive(:hoge).at_least(n).times
# 引数が正規表現に一致するobj.should_receive(:hoge).with(/.../)
# 引数が文字列obj.should_receive(:hoge).with(an_instance_of(String))
# 引数が :key=>val を含むハッシュobj.should_receive(:hoge).with(hash_including(:key=>val))
29/63
RSpec と Cucumber Powered by Rabbit 0.9.2
既存オブジェクトのメソッドを置き換え可能
it の中だけで有効
# 特定の時刻で実行したいテストbefore do t = Time.local(2011,1,15,18,30,0) Time.stub(:now).and_return tendits(:tmpfile){should == '20110115183000.tmp'}
30/63
RSpec と Cucumber Powered by Rabbit 0.9.2
モックを返す
before do # どんなメソッド呼び出しもエラーにしない logger = double('Logger').as_null_object Logger.stub(:new).and_return loggerendit ...
31/63
RSpec と Cucumber Powered by Rabbit 0.9.2
自動実行
32/63
RSpec と Cucumber Powered by Rabbit 0.9.2
autotest
.rspeclib/hoge.rbspec/hoge_spec.rb
hoge.rb が変更されると自動的にhoge_spec.rb が実行される
33/63
RSpec と Cucumber Powered by Rabbit 0.9.2
インストール&実行
% sudo gem install ZenTest
% autotest
34/63
RSpec と Cucumber Powered by Rabbit 0.9.2
デモ35/63
RSpec と Cucumber Powered by Rabbit 0.9.2
カバレッジ
テストカバー率を測れる✓
Ruby 1.9 ではまだちゃんと動作しない(?)
✓
36/63
RSpec と Cucumber Powered by Rabbit 0.9.2
RCov
37/63
RSpec と Cucumber Powered by Rabbit 0.9.2
インストール&実行
% sudo gem install rcov
% rcov rspec spec/hoge_spec.rb
テスト対象のものだけ集計% rcov -x ^/ -x _spec.rb rspec spec/hoge_spec.rb
38/63
RSpec と Cucumber Powered by Rabbit 0.9.2
デモ39/63
RSpec と Cucumber Powered by Rabbit 0.9.2
RSpec の話はここま
で40/63
RSpec と Cucumber Powered by Rabbit 0.9.2
Cucumber
41/63
RSpec と Cucumber Powered by Rabbit 0.9.2
Cucumber
受け入れテスト用ツール✓
プログラムを外部からテスト✓
テスト対象の言語は問わない✓
テスト自体は Ruby で記述✓
http://cukes.info/✓
42/63
RSpec と Cucumber Powered by Rabbit 0.9.2
Cucumber
43/63
RSpec と Cucumber Powered by Rabbit 0.9.2
「はじめる! Cucumber」
達人出版会の電子書籍。Railsプログラムのテスト44/63
RSpec と Cucumber Powered by Rabbit 0.9.2
インストール
% sudo gem install cucumber
45/63
RSpec と Cucumber Powered by Rabbit 0.9.2
書き方
# language: jaフィーチャ: ○○できる ○○として、 ○○したい。 なぜなら、○○だから。
シナリオ: ○○すると○○される 前提 ○○の状態 もし ○○する かつ ○○する ならば ○○されること
46/63
RSpec と Cucumber Powered by Rabbit 0.9.2
文章で書ける
プログラマじゃなくても読める✓
プログラマじゃなくても書ける…かは微妙
✓
47/63
RSpec と Cucumber Powered by Rabbit 0.9.2
こんな場面で
Web アプリケーションのテスト✓
Rails で使うと便利な機能多数✓
Rails や Web アプリ以外でも使える
✓
48/63
RSpec と Cucumber Powered by Rabbit 0.9.2
今回の例は
SMTPの送信テスト✓
プログラム開発以外にも使えるよ!
✓
Rails 以外にも使えるよ!というか Rails 知らないし
✓
49/63
RSpec と Cucumber Powered by Rabbit 0.9.2
feature ファイル
# language: jaフィーチャ: メールが送信できる SMTPクライアントとして、 メールを送信したい。 なぜなら、メールを利用者に届けたいから。
シナリオ: 接続するとバナーが返る 前提 サーバーが起動している もし 25番ポートに接続する ならば "220 "応答が返されること
50/63
RSpec と Cucumber Powered by Rabbit 0.9.2
実行
% cucumber smtp.feature# language: jaフィーチャ: メールが送信できる SMTPクライアントとして、 メールを送信したい。 なぜなら、メールを利用者に届けたいから。
シナリオ: 接続するとバナーが返る # smtp.feature:7 前提サーバーが起動している # step_definitions/smtp_steps.rb:2 もし25番ポートに接続する # step_definitions/smtp_steps.rb:7 ならば"220 "応答が返されること # step_definitions/smtp_steps.rb:11
1 scenario (1 passed)3 steps (3 passed)0m0.002s
51/63
RSpec と Cucumber Powered by Rabbit 0.9.2
HTML出力
% cucumber smtp.feature -f html -o /tmp/smtp.html
52/63
RSpec と Cucumber Powered by Rabbit 0.9.2
HTML出力
53/63
RSpec と Cucumber Powered by Rabbit 0.9.2
仕組み
features/├── smtp.feature└── step_definitions/ └── smtp_steps.rb
step_definitions 配下のスクリプトで対応する処理を実行
✓
54/63
RSpec と Cucumber Powered by Rabbit 0.9.2
step_definitions ファイル
前提 'サーバーが起動している' do system 'ps -ef | grep -q postfix/master' $?.should be_successend
もし '25番ポートに接続する' do @sock = TCPSocket.new('localhost', 25)end
ならば '"220 "応答が返されること' do @sock.gets.should =~ /^220 /end
55/63
RSpec と Cucumber Powered by Rabbit 0.9.2
少し動的に
前提 'サーバーが起動している' do system 'ps -ef | grep -q postfix/master' $?.should be_successend
もし /(\d+)番ポートに接続する/ do |port| @sock = TCPSocket.new('localhost', port)end
ならば /\"(.*)\"応答が返されること/ do |status| @sock.gets.should =~ /^#{status}/end
56/63
RSpec と Cucumber Powered by Rabbit 0.9.2
既存の定義を利用して定義
シナリオ: RCPT TO が受け付けられる 前提 MAIL FROM まで指定済み もし RCPT TO で tommy@localhost を指定する ならば "250 "応答が返されること
57/63
RSpec と Cucumber Powered by Rabbit 0.9.2
既存の定義を利用して定義
前提 'MAIL FROM まで指定済み' do もし '25番ポートに接続する' ならば '"220 "応答が返されること' @sock.puts "MAIL FROM:<hoge@example.com>" ならば '"250 "応答が返されること'end
もし /RCPT TO で (.*) を指定する/ do |rcpt| @sock.puts "RCPT TO:<#{rcpt}>"end
58/63
RSpec と Cucumber Powered by Rabbit 0.9.2
表を使う
シナリオアウトライン: 宛先に応じた応答が返る 前提 MAIL FROM まで指定済み もし RCPT TO で <宛先> を指定する ならば <結果>応答が返されること
例: | 宛先 | 結果 | | tommy@localhost | "250 " | | fuga@example.com | "550 " |
59/63
RSpec と Cucumber Powered by Rabbit 0.9.2
結果
60/63
RSpec と Cucumber Powered by Rabbit 0.9.2
Rails で使うと
feature ファイルに
○○に○○と入力する✓
○○ボタンをクリックする✓
○○と表示されていること✓
と書ける機能が用意されているらしい
61/63
RSpec と Cucumber Powered by Rabbit 0.9.2
自動でできることは
機械にやらせよう
62/63
RSpec と Cucumber Powered by Rabbit 0.9.2
ご清聴ありがとうございました
63/63
top related