Rails Plug-in Flextures の使い方
ところでRails でテストデータ取り込むアレfixtures って " クソ " ですよね♪
実例その1:案件 ATest::Unit 使用データ fixture 作成データは csv で作成開発は順調に進行していたが…
さーて、基本機能できたしそろそろ同値クラステストや境界値テストの     フェーズに移りますか      ( リリース1ヶ月前 )
Fixture の欠点 11 テーブルにつき1ファイルしか用意できない同値クラステストや境界値テスト仕様とする 頃には、依存関係の塊でそれどころではない
さらに開発は進むが…
えっ?、登録から3日以内のユーザーには    1日1回アイテム付与?
Fixture の欠点 2基本的にデータが静的日時チェックのテストあたりはテストするな と言われているようなもの…(YAML は erb 使えるのである程度回避できますけどね)
案件 BRSpec でテストFixture はマスターデータは CSV それ以外は  yaml
Fixture の欠点YAML で作れば erb が使えるけど活躍できる舞 台はなかった関連を生成してくれる機能があるけど、特に 書きやすいものでもない ( 書式が面倒 )総論としては大体の場合は csv の方が便利
案件 CRspecFactoryGirlこれで全ての問題は解決したかに見えたが…
現実 : 開発の遅延開発初期には1日に2,3回は migration が走  るmigration するたびに、作った Factory がしば  しば止まるデータの不整合が起こるたびに factories.rb を  修正テストできない状況では...
FactoryGirl の欠点データ1件の生成、修正コストは yaml 以上に 高いテーブルの構成が変わった時のコストも高い実は hatbm のテーブルって全テーブルの 1 割と かで旨みが少ない
という感じの募り募った”恨”が今回の     gem 作成のきっかけ
総論どの方法をとってもテーブルの migration がか  かったあとのデータの修正コストがすごい( 初期開発ではテーブルの構成変更がよくある  のでこれは痛い )柔軟な方法ほど記法が致命的に長くなって途  中でわけがわからなくなる…( そし...
解決策データの一覧性、編集しやすさは csv は一番高 い動的性質に関しては FactoryGirl が群を抜いて いる両方の機能のイイトコ取りをしつつ、これま での問題の解決法を組み込んで行けばいいは ず…
機能その 1データのお手軽ダンプrake db:flextures:dumprake db:flextutes:load実は csv をお手軽ダンプできるものは無かった (YAML はある )
機能その2カラムの変更点を検知して値を自動補完する1つか2つカラムが増減しても、よく変わる 部分のカラムは設計上重要では無いのでエ ラーが出ても開発を完全停止させないほうが いい
RSpec で使用可能同じ書式で使えるfixtures :usersflextures :users読み込むファイルを切り替え可能flextures :users => "login_test/users"
FaftoryFilterFactoryGirl 風の書式でデータを動的に変更可  能  Flextures::Factory.define :users do |f|   f.last_login_date = Time.now  end( ...
Case1: テストデータの生成      ( 実演含 )
想定させる使い方ソーシャルゲームを仮定して users テーブルを 作成
データ生成:その 210 人分のデータを生成したいので、 1 〜 10 で  id だけを生成して csv ファイルを作成( デフォルトは spec/fixtures/users.csv)
データ生成:その 1「 config/flextures.factory.rb 」にフィルタを記 述する。今回は faker を使ってデータを生成
データ生成:その 3もう一度「 rake db:flextures:dump F=users 」を 実行してデータをダンプ
Case2: 本番環境データの取り込み
検証環境のデータを取り込み検証環境で携帯を使いながら操作していると  戦闘で、バグらしき挙動を発見関係するテーブルのデータを吐き出しrake db:flextures:dump T=users,items,battle_logこれを開発環境の ...
検証環境のデータを取り込み持ってきたデータを spec/fixtures/battle 以下に  移動させてrake db:flextures:load DIR=battleDB に検証環境のデータを取り込まれたのでrails console ...
検証環境のデータを取り込み原因がわかったら spec にバグを再現するテス  トを作成データの切り替えは RSpec 中で以下の様に記  述 flextures :users => "battle/users",  :items=>"battl...
最大の利点テスト用のデータと開発環境で使うデータを  同じ場所で管理できるrails colsole で実行できるデータが rspec と同じ
Case3: 画像のとり込み
画像の DB 取り込みCSV ファイルの作成               content に画像が入るpublic/images/db/ 以下に 0001 〜 0005.jpg を設  置
画像の DB への読み込みさっきと同じで flextures.factory.rb を作成あとはrake db:flextures:load T=upload_imagesで画像をロード
現在の欠点安定性 !! (バグが眠っている)特に DB のデータをリセットするタイミングが まだ確定できていないRspec で before(:all) を使ったところが転ぶRails3.2 の場合警告メッセージが出るetc...
現在の欠点2FactoryFilter への機能集中 ( 1テーブル1個し  かフィルタを持てない)一応ファイル名を取得したり対処法はあるけ  ど、まだまだ研究不足
あと、まとめ別に fixtures でのデータ読み込みとかは dis っ ていない(読み込み速度でかなわない )FactoryGirl も混ぜて使える(柔軟性ではこち  らが上 )
まとめ綺麗に適応する必要はないDB のデータを csv でダンプする目的だけで 使ってもよしテスト用のデータを大量生成するために使っ てもよしRSpec で fixture を切り替えるためだけに使っ てもよし
とまぁ色々言いましたが
Gemfile に「 gem "flextures" 」して  bundleinstall するだけなので、とりあえず使ってみて                 ください      (CSV 吐き出しだけしたいなら、オススメは 1.0.6)
Gemfile に「 gem "flextures" 」して  bundleinstall するだけなので、とりあえず使ってみて                 ください
ありがとうございました
Upcoming SlideShare
Loading in …5
×

Rails-Plugin Flexturesの紹介

1,972 views

Published on

Rails の fixture 機能拡張gem
flexturesの機能紹介

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,972
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Rails-Plugin Flexturesの紹介

  1. 1. Rails Plug-in Flextures の使い方
  2. 2. ところでRails でテストデータ取り込むアレfixtures って " クソ " ですよね♪
  3. 3. 実例その1:案件 ATest::Unit 使用データ fixture 作成データは csv で作成開発は順調に進行していたが…
  4. 4. さーて、基本機能できたしそろそろ同値クラステストや境界値テストの フェーズに移りますか ( リリース1ヶ月前 )
  5. 5. Fixture の欠点 11 テーブルにつき1ファイルしか用意できない同値クラステストや境界値テスト仕様とする 頃には、依存関係の塊でそれどころではない
  6. 6. さらに開発は進むが…
  7. 7. えっ?、登録から3日以内のユーザーには 1日1回アイテム付与?
  8. 8. Fixture の欠点 2基本的にデータが静的日時チェックのテストあたりはテストするな と言われているようなもの…(YAML は erb 使えるのである程度回避できますけどね)
  9. 9. 案件 BRSpec でテストFixture はマスターデータは CSV それ以外は yaml
  10. 10. Fixture の欠点YAML で作れば erb が使えるけど活躍できる舞 台はなかった関連を生成してくれる機能があるけど、特に 書きやすいものでもない ( 書式が面倒 )総論としては大体の場合は csv の方が便利
  11. 11. 案件 CRspecFactoryGirlこれで全ての問題は解決したかに見えたが…
  12. 12. 現実 : 開発の遅延開発初期には1日に2,3回は migration が走 るmigration するたびに、作った Factory がしば しば止まるデータの不整合が起こるたびに factories.rb を 修正テストできない状況では作業できないの で、”待ち”が発生する
  13. 13. FactoryGirl の欠点データ1件の生成、修正コストは yaml 以上に 高いテーブルの構成が変わった時のコストも高い実は hatbm のテーブルって全テーブルの 1 割と かで旨みが少ない
  14. 14. という感じの募り募った”恨”が今回の gem 作成のきっかけ
  15. 15. 総論どの方法をとってもテーブルの migration がか かったあとのデータの修正コストがすごい( 初期開発ではテーブルの構成変更がよくある のでこれは痛い )柔軟な方法ほど記法が致命的に長くなって途 中でわけがわからなくなる…( そしてだんだんデータの維持管理ができなく なる )
  16. 16. 解決策データの一覧性、編集しやすさは csv は一番高 い動的性質に関しては FactoryGirl が群を抜いて いる両方の機能のイイトコ取りをしつつ、これま での問題の解決法を組み込んで行けばいいは ず…
  17. 17. 機能その 1データのお手軽ダンプrake db:flextures:dumprake db:flextutes:load実は csv をお手軽ダンプできるものは無かった (YAML はある )
  18. 18. 機能その2カラムの変更点を検知して値を自動補完する1つか2つカラムが増減しても、よく変わる 部分のカラムは設計上重要では無いのでエ ラーが出ても開発を完全停止させないほうが いい
  19. 19. RSpec で使用可能同じ書式で使えるfixtures :usersflextures :users読み込むファイルを切り替え可能flextures :users => "login_test/users"
  20. 20. FaftoryFilterFactoryGirl 風の書式でデータを動的に変更可 能 Flextures::Factory.define :users do |f| f.last_login_date = Time.now end( 実は ActiveRecord のモデルをもらっているの で、 AcitiveRecord で可能は事はここででき る)
  21. 21. Case1: テストデータの生成 ( 実演含 )
  22. 22. 想定させる使い方ソーシャルゲームを仮定して users テーブルを 作成
  23. 23. データ生成:その 210 人分のデータを生成したいので、 1 〜 10 で id だけを生成して csv ファイルを作成( デフォルトは spec/fixtures/users.csv)
  24. 24. データ生成:その 1「 config/flextures.factory.rb 」にフィルタを記 述する。今回は faker を使ってデータを生成
  25. 25. データ生成:その 3もう一度「 rake db:flextures:dump F=users 」を 実行してデータをダンプ
  26. 26. Case2: 本番環境データの取り込み
  27. 27. 検証環境のデータを取り込み検証環境で携帯を使いながら操作していると 戦闘で、バグらしき挙動を発見関係するテーブルのデータを吐き出しrake db:flextures:dump T=users,items,battle_logこれを開発環境の spec/fixtures/battle 以下に移 動
  28. 28. 検証環境のデータを取り込み持ってきたデータを spec/fixtures/battle 以下に 移動させてrake db:flextures:load DIR=battleDB に検証環境のデータを取り込まれたのでrails console でコンソールを起動して周辺の コードを試し打ちしたり ruby-debugger でブ レークポイントを貼ったりしてバグ探し
  29. 29. 検証環境のデータを取り込み原因がわかったら spec にバグを再現するテス トを作成データの切り替えは RSpec 中で以下の様に記 述 flextures :users => "battle/users", :items=>"battle/items", :battle_log => "battle/battle_log"検証環境のデータを " そのまま " 持ってきてテストケースとして使用可能
  30. 30. 最大の利点テスト用のデータと開発環境で使うデータを 同じ場所で管理できるrails colsole で実行できるデータが rspec と同じ
  31. 31. Case3: 画像のとり込み
  32. 32. 画像の DB 取り込みCSV ファイルの作成 content に画像が入るpublic/images/db/ 以下に 0001 〜 0005.jpg を設 置
  33. 33. 画像の DB への読み込みさっきと同じで flextures.factory.rb を作成あとはrake db:flextures:load T=upload_imagesで画像をロード
  34. 34. 現在の欠点安定性 !! (バグが眠っている)特に DB のデータをリセットするタイミングが まだ確定できていないRspec で before(:all) を使ったところが転ぶRails3.2 の場合警告メッセージが出るetc...
  35. 35. 現在の欠点2FactoryFilter への機能集中 ( 1テーブル1個し かフィルタを持てない)一応ファイル名を取得したり対処法はあるけ ど、まだまだ研究不足
  36. 36. あと、まとめ別に fixtures でのデータ読み込みとかは dis っ ていない(読み込み速度でかなわない )FactoryGirl も混ぜて使える(柔軟性ではこち らが上 )
  37. 37. まとめ綺麗に適応する必要はないDB のデータを csv でダンプする目的だけで 使ってもよしテスト用のデータを大量生成するために使っ てもよしRSpec で fixture を切り替えるためだけに使っ てもよし
  38. 38. とまぁ色々言いましたが
  39. 39. Gemfile に「 gem "flextures" 」して  bundleinstall するだけなので、とりあえず使ってみて ください (CSV 吐き出しだけしたいなら、オススメは 1.0.6)
  40. 40. Gemfile に「 gem "flextures" 」して  bundleinstall するだけなので、とりあえず使ってみて ください
  41. 41. ありがとうございました

×