SlideShare uma empresa Scribd logo
1 de 26
Baixar para ler offline
R S P E C 勉 強 会
1
I n d e x
xUnit or xSpec?
RSpecの概要
RSpec拡張
FactoryGirlの概要
参考文献
2
x U n i t
o r
x S p e c ?
3
x U n i t 系 と x S p e c 系
4
xUnit xSpec
コンセプト テストの期待値を得る
その機能の振る舞いはどうゆう
ものか
書き方
関数、メソッドのような書き
方
DSLを採用していることが多い
学習コスト 低い 高い
可読性 読みづらい 読みやすい
書 き 方 の 違 い
“fizz”を返すメソッドと”buzz”を返すメソッドを持つ
FizzBuzzクラスの例
5
F i x t u r e s と F a c t o r y G i r l
Fixtures
ymlファイルに1レコードづつ書く
FactoryGirlに比べると実行速度は早い
Validationは通らない
カラムが増えると全部のレコードを書き直しが発生
FactoryGirl
ソースコードにテストデータを記載
Validationが通る
学習コストが高い
毎回Validationを通すと遅い
6
R S p e c の 概 要
7
R S p e c と は
プログラムの振る舞い(Behaviour)を記述するためのDSLを
提供するフレームワーク
プログラムを書く前に振る舞いを書く = BDD(振舞駆動開
発)を強く意識
BDDの目的は、そのソフトウェアが使われる状況を説明す
るための言語を単純化することでコミュニケーションを後
押しすること
8
Given When Then
基 本 的 な 使 い 方
ファイル名は*_spec.rb
spec/ 以下にテストコードを追加していく
rspec <ファイル名> で実行
covarails等と組み合わせるとカバレッジを表示することも
できる
.rspecファイルにrspecコマンドのオプションを書いておく
ことも出来る
9
R S p e c の 書 式
describe : テストの対象、説明
クラス名、メソッド名を記載するとGood
context : テストの条件
~の場合、~である時
it(example) : テストの内容、期待値
~である事
expect : 対象の評価をする
skip : 対象のテストをスキップする
10
l e t
テストの内部で使用できる変数、関数的なイメージ
let : ブロック{}で記載
describe, context内で定義し、it内で呼び出しが可能
letは遅延評価でlet!は即座に評価
迷ったときはlet!にしておくと安全
11
同 じ テ ス ト を グ ル ー ピ ン グ
shared_examples_forでテストコードをグルーピング、
it_behaves_likeでグループを呼び出し
contextのグルーピングはshared_contextとinclude_context
を使う
12
l e t + グ ル ー ピ ン グ S a m p l e
13
グルーピングを行う前 グルーピング後
テ ス ト の 前 処 理 と 後 処 理
beforeで前処理、afterで後処理
:suite => 全テストの実行前後に一回
:all => 各ブロック(context/describe)の前後
:each => 全てのitブロックの前後
14
よ く 使 う 抹 茶 ー ( m a t c h e r )
(not_)to eq : 等価かどうか
to be
be_empty : オブジェクトが空であるか
be (>|<|>=|<=) : オブジェクトに対しての比較
be_nil : オブジェクトがnilかどうか
to include : 配列内にデータがあるか
15
R S p e c 拡 張
16
R S p e c と 組 み 合 わ せ る と 便 利
rspec-rails
Selenium
Poltergeist
Capybara
17
R S p e c - R a i l s
controller
type => :controller
get/post/put/delete アクション名, パラメータ
request
type => :request
get/post/put/delete URL, パラメータ
view
type => :view
renderでviewレンダリング, renderedでレンダリングしたview取得
assert_select エレメント: html属性値に対するアサーション
18
F a c t o r y G i r l の 概 要
19
F a c t o r y G i r l に つ い て
オブジェクトから定義したデータを生成してくれる
テストデータ投入に使われる
ソースコードでテストデータを定義する
20
F a c t o r y G i r l の 定 義
21
ス ト ラ テ ジ ー
create : テストデータを作成する
build : テストクラスのValidationを行った後のインスタン
スを生成して返す
stub : Validationも行わず、インスタンス生成のみ
_list : 一括に上記のストラテジーを実行する
22
D S L
trait : 複数の属性をグループ化し、factoryに適用出来る
transient : 一時的な変数、attributeを定義できる。trait内に
ネストすることも可能
sequences : 連番を生成
callbacks : before, after
before(:create), before(:stub), before(:build)
after(:create), after(:stub), after(:build)
23
24
参 考 文 献
25
参 考 文 献
使えるRSpec入門・その1
http://qiita.com/jnchito/items/42193d066bd61c740612
rspecガイドライン
http://betterspecs.org/jp/
RSpecの(describe/context/example/it)の使い分け
http://qiita.com/uchiko/items/d34c5d1298934252f58f
MinitestとRspec、FixturesとFictoryGirlの比較
http://blog.jnito.com/entry/2015/05/06/074510
26

Mais conteúdo relacionado

Mais procurados

BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36Tatsuki SHIMIZU
 
Lt8 JavaScriptで配列をコピーする
Lt8 JavaScriptで配列をコピーするLt8 JavaScriptで配列をコピーする
Lt8 JavaScriptで配列をコピーするShingo Inoue
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半Tetsuya Morimoto
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7Tomohiro Namba
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習JPCERT Coordination Center
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2Tomohiro Namba
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4Shingo Inoue
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perlJiro Nishiguchi
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Mitsuru Kariya
 

Mais procurados (20)

BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
Lt8 JavaScriptで配列をコピーする
Lt8 JavaScriptで配列をコピーするLt8 JavaScriptで配列をコピーする
Lt8 JavaScriptで配列をコピーする
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
研究生のためのC++ no.7
研究生のためのC++ no.7研究生のためのC++ no.7
研究生のためのC++ no.7
 
Introduction to PEG
Introduction to PEGIntroduction to PEG
Introduction to PEG
 
Power of Scala
Power of ScalaPower of Scala
Power of Scala
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
 
研究生のためのC++ no.2
研究生のためのC++ no.2研究生のためのC++ no.2
研究生のためのC++ no.2
 
そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4そしてjsの基礎へ戻る#4
そしてjsの基礎へ戻る#4
 
Sharing Deep Dive
Sharing Deep DiveSharing Deep Dive
Sharing Deep Dive
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
Das 2015
Das 2015Das 2015
Das 2015
 
Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16Effective Modern C++ 勉強会#3 Item16
Effective Modern C++ 勉強会#3 Item16
 

Semelhante a R spec勉強会

魂のコーディング
魂のコーディング魂のコーディング
魂のコーディングDaisuke Tasaki
 
Material
MaterialMaterial
Material_TUNE_
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
Yamadai.Rデモンストレーションセッション
Yamadai.RデモンストレーションセッションYamadai.Rデモンストレーションセッション
Yamadai.Rデモンストレーションセッション考司 小杉
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
RSpecのここがすごい!
RSpecのここがすごい!RSpecのここがすごい!
RSpecのここがすごい!mitim
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方Soudai Sone
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要Toshihiro Kamishima
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Yukiko Kato
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java心 谷本
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会Yuji Otani
 
私とOSS活動とPerl
私とOSS活動とPerl私とOSS活動とPerl
私とOSS活動とPerlShunsuke Maeda
 
NSDI2015読み会 Correctness セッション
NSDI2015読み会 Correctness セッションNSDI2015読み会 Correctness セッション
NSDI2015読み会 Correctness セッションDaisuke Kotani
 

Semelhante a R spec勉強会 (20)

魂のコーディング
魂のコーディング魂のコーディング
魂のコーディング
 
Material
MaterialMaterial
Material
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Yamadai.Rデモンストレーションセッション
Yamadai.RデモンストレーションセッションYamadai.Rデモンストレーションセッション
Yamadai.Rデモンストレーションセッション
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
RSpecのここがすごい!
RSpecのここがすごい!RSpecのここがすごい!
RSpecのここがすごい!
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 
科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要科学技術計算関連Pythonパッケージの概要
科学技術計算関連Pythonパッケージの概要
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
 
from old Java to modern Java
from old Java to modern Javafrom old Java to modern Java
from old Java to modern Java
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Spock's world
Spock's worldSpock's world
Spock's world
 
私とOSS活動とPerl
私とOSS活動とPerl私とOSS活動とPerl
私とOSS活動とPerl
 
Rcppのすすめ
RcppのすすめRcppのすすめ
Rcppのすすめ
 
NSDI2015読み会 Correctness セッション
NSDI2015読み会 Correctness セッションNSDI2015読み会 Correctness セッション
NSDI2015読み会 Correctness セッション
 

R spec勉強会

  • 1. R S P E C 勉 強 会 1
  • 2. I n d e x xUnit or xSpec? RSpecの概要 RSpec拡張 FactoryGirlの概要 参考文献 2
  • 3. x U n i t o r x S p e c ? 3
  • 4. x U n i t 系 と x S p e c 系 4 xUnit xSpec コンセプト テストの期待値を得る その機能の振る舞いはどうゆう ものか 書き方 関数、メソッドのような書き 方 DSLを採用していることが多い 学習コスト 低い 高い 可読性 読みづらい 読みやすい
  • 5. 書 き 方 の 違 い “fizz”を返すメソッドと”buzz”を返すメソッドを持つ FizzBuzzクラスの例 5
  • 6. F i x t u r e s と F a c t o r y G i r l Fixtures ymlファイルに1レコードづつ書く FactoryGirlに比べると実行速度は早い Validationは通らない カラムが増えると全部のレコードを書き直しが発生 FactoryGirl ソースコードにテストデータを記載 Validationが通る 学習コストが高い 毎回Validationを通すと遅い 6
  • 7. R S p e c の 概 要 7
  • 8. R S p e c と は プログラムの振る舞い(Behaviour)を記述するためのDSLを 提供するフレームワーク プログラムを書く前に振る舞いを書く = BDD(振舞駆動開 発)を強く意識 BDDの目的は、そのソフトウェアが使われる状況を説明す るための言語を単純化することでコミュニケーションを後 押しすること 8 Given When Then
  • 9. 基 本 的 な 使 い 方 ファイル名は*_spec.rb spec/ 以下にテストコードを追加していく rspec <ファイル名> で実行 covarails等と組み合わせるとカバレッジを表示することも できる .rspecファイルにrspecコマンドのオプションを書いておく ことも出来る 9
  • 10. R S p e c の 書 式 describe : テストの対象、説明 クラス名、メソッド名を記載するとGood context : テストの条件 ~の場合、~である時 it(example) : テストの内容、期待値 ~である事 expect : 対象の評価をする skip : 対象のテストをスキップする 10
  • 11. l e t テストの内部で使用できる変数、関数的なイメージ let : ブロック{}で記載 describe, context内で定義し、it内で呼び出しが可能 letは遅延評価でlet!は即座に評価 迷ったときはlet!にしておくと安全 11
  • 12. 同 じ テ ス ト を グ ル ー ピ ン グ shared_examples_forでテストコードをグルーピング、 it_behaves_likeでグループを呼び出し contextのグルーピングはshared_contextとinclude_context を使う 12
  • 13. l e t + グ ル ー ピ ン グ S a m p l e 13 グルーピングを行う前 グルーピング後
  • 14. テ ス ト の 前 処 理 と 後 処 理 beforeで前処理、afterで後処理 :suite => 全テストの実行前後に一回 :all => 各ブロック(context/describe)の前後 :each => 全てのitブロックの前後 14
  • 15. よ く 使 う 抹 茶 ー ( m a t c h e r ) (not_)to eq : 等価かどうか to be be_empty : オブジェクトが空であるか be (>|<|>=|<=) : オブジェクトに対しての比較 be_nil : オブジェクトがnilかどうか to include : 配列内にデータがあるか 15
  • 16. R S p e c 拡 張 16
  • 17. R S p e c と 組 み 合 わ せ る と 便 利 rspec-rails Selenium Poltergeist Capybara 17
  • 18. R S p e c - R a i l s controller type => :controller get/post/put/delete アクション名, パラメータ request type => :request get/post/put/delete URL, パラメータ view type => :view renderでviewレンダリング, renderedでレンダリングしたview取得 assert_select エレメント: html属性値に対するアサーション 18
  • 19. F a c t o r y G i r l の 概 要 19
  • 20. F a c t o r y G i r l に つ い て オブジェクトから定義したデータを生成してくれる テストデータ投入に使われる ソースコードでテストデータを定義する 20
  • 21. F a c t o r y G i r l の 定 義 21
  • 22. ス ト ラ テ ジ ー create : テストデータを作成する build : テストクラスのValidationを行った後のインスタン スを生成して返す stub : Validationも行わず、インスタンス生成のみ _list : 一括に上記のストラテジーを実行する 22
  • 23. D S L trait : 複数の属性をグループ化し、factoryに適用出来る transient : 一時的な変数、attributeを定義できる。trait内に ネストすることも可能 sequences : 連番を生成 callbacks : before, after before(:create), before(:stub), before(:build) after(:create), after(:stub), after(:build) 23
  • 24. 24
  • 25. 参 考 文 献 25
  • 26. 参 考 文 献 使えるRSpec入門・その1 http://qiita.com/jnchito/items/42193d066bd61c740612 rspecガイドライン http://betterspecs.org/jp/ RSpecの(describe/context/example/it)の使い分け http://qiita.com/uchiko/items/d34c5d1298934252f58f MinitestとRspec、FixturesとFictoryGirlの比較 http://blog.jnito.com/entry/2015/05/06/074510 26

Notas do Editor

  1. 両者ともテスティングフレームワーク xUnit -> テスト期待値を得るための書き方 xSpec -> そのメソッドの振る舞いはどうゆうものかを書く 可読性 xUnitはPG以外には読みづらい、xSpecはグループ分けが強力でタイトルだけ回収すると読みやすくなる
  2. TestUnitは所詮はメソッドなので、テストコードを書くときもPGを意識しがち RSpecはDSLを覚えるのに時間がかかる、 メソッドではなくit(example)に期待する内容をかけるので、何のテストを行ったか分かりやすい
  3. fixture xml yml等設定ファイルに1レコードづつ記載 ソースコードによるテストデータ マスタとなるレコードを基準にし、拡張がかのう
  4. - 有るコンテキスト(Given)で、あるイベント発生すると(When)、ある結果が期待される(Then)
  5. let で作った変数は lazy(遅延評価)であり、変数が参照されたときにはじめて初期化される let!は各テストが実行される前に評価され、即座に変数が初期化される
  6. グルーピング後では同じ様なテストをまとめることが出来る shared_examples_forにはletで定義した変数を渡すことが出来る
  7. - 先頭に’not_’をつけると否定系になる
  8. - 詳細はwebで