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

R spec勉強会

  • 1.
    R S PE C 勉 強 会 1
  • 2.
    I n de x xUnit or xSpec? RSpecの概要 RSpec拡張 FactoryGirlの概要 参考文献 2
  • 3.
    x U ni t o r x S p e c ? 3
  • 4.
    x U ni t 系 と x S p e c 系 4 xUnit xSpec コンセプト テストの期待値を得る その機能の振る舞いはどうゆう ものか 書き方 関数、メソッドのような書き 方 DSLを採用していることが多い 学習コスト 低い 高い 可読性 読みづらい 読みやすい
  • 5.
    書 き 方の 違 い “fizz”を返すメソッドと”buzz”を返すメソッドを持つ FizzBuzzクラスの例 5
  • 6.
    F i xt 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 pe c の 概 要 7
  • 8.
    R S pe c と は プログラムの振る舞い(Behaviour)を記述するためのDSLを 提供するフレームワーク プログラムを書く前に振る舞いを書く = BDD(振舞駆動開 発)を強く意識 BDDの目的は、そのソフトウェアが使われる状況を説明す るための言語を単純化することでコミュニケーションを後 押しすること 8 Given When Then
  • 9.
    基 本 的な 使 い 方 ファイル名は*_spec.rb spec/ 以下にテストコードを追加していく rspec <ファイル名> で実行 covarails等と組み合わせるとカバレッジを表示することも できる .rspecファイルにrspecコマンドのオプションを書いておく ことも出来る 9
  • 10.
    R S pe 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 pe c 拡 張 16
  • 17.
    R S pe c と 組 み 合 わ せ る と 便 利 rspec-rails Selenium Poltergeist Capybara 17
  • 18.
    R S pe 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 ct o r y G i r l の 概 要 19
  • 20.
    F a ct o r y G i r l に つ い て オブジェクトから定義したデータを生成してくれる テストデータ投入に使われる ソースコードでテストデータを定義する 20
  • 21.
    F a ct 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.
  • 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

Editor's Notes

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