SlideShare a Scribd company logo
Rails Plug-in Flextures の使い方
ところで
Rails でテストデータ取り込むアレ
fixtures って " クソ " ですよね♪
実例その1:案件 A
Test::Unit 使用
データ fixture 作成
データは csv で作成


開発は順調に進行していたが…
さーて、基本機能できたし
そろそろ同値クラステストや境界値テストの
     フェーズに移りますか
      ( リリース1ヶ月前 )
Fixture の欠点 1
1 テーブルにつき1ファイルしか用意できない
同値クラステストや境界値テスト仕様とする
 頃には、依存関係の塊でそれどころではない
さらに開発は進むが…
えっ?、登録から3日以内のユーザーには
    1日1回アイテム付与?
Fixture の欠点 2
基本的にデータが静的
日時チェックのテストあたりはテストするな
 と言われているようなもの…
(YAML は erb 使えるのである程度回避できますけどね)
案件 B
RSpec でテスト
Fixture はマスターデータは CSV それ以外は
  yaml
Fixture の欠点
YAML で作れば erb が使えるけど活躍できる舞
 台はなかった
関連を生成してくれる機能があるけど、特に
 書きやすいものでもない ( 書式が面倒 )
総論としては大体の場合は csv の方が便利
案件 C
Rspec
FactoryGirl
これで全ての問題は解決したかに見えたが…
現実 : 開発の遅延
開発初期には1日に2,3回は migration が走
  る
migration するたびに、作った Factory がしば
  しば止まる
データの不整合が起こるたびに factories.rb を
  修正
テストできない状況では作業できないの
  で、”待ち”が発生する
FactoryGirl の欠点
データ1件の生成、修正コストは yaml 以上に
 高い
テーブルの構成が変わった時のコストも高い
実は hatbm のテーブルって全テーブルの 1 割と
 かで旨みが少ない
という感じの募り募った”恨”が今回の
     gem 作成のきっかけ
総論
どの方法をとってもテーブルの migration がか
  かったあとのデータの修正コストがすごい
( 初期開発ではテーブルの構成変更がよくある
  のでこれは痛い )
柔軟な方法ほど記法が致命的に長くなって途
  中でわけがわからなくなる…
( そしてだんだんデータの維持管理ができなく
  なる )
解決策
データの一覧性、編集しやすさは csv は一番高
 い
動的性質に関しては FactoryGirl が群を抜いて
 いる
両方の機能のイイトコ取りをしつつ、これま
 での問題の解決法を組み込んで行けばいいは
 ず…
機能その 1
データのお手軽ダンプ


rake db:flextures:dump
rake db:flextutes:load


実は csv をお手軽ダンプできるものは無かった
 (YAML はある )
機能その2
カラムの変更点を検知して値を自動補完する
1つか2つカラムが増減しても、よく変わる
 部分のカラムは設計上重要では無いのでエ
 ラーが出ても開発を完全停止させないほうが
 いい
RSpec で使用可能
同じ書式で使える
fixtures :users
flextures :users
読み込むファイルを切り替え可能
flextures :users => "login_test/users"
FaftoryFilter
FactoryGirl 風の書式でデータを動的に変更可
  能

  Flextures::Factory.define :users do |f|
   f.last_login_date = Time.now
  end
( 実は ActiveRecord のモデルをもらっているの
   で、 AcitiveRecord で可能は事はここででき
   る)
Case1: テストデータの生成
      ( 実演含 )
想定させる使い方
ソーシャルゲームを仮定して users テーブルを
 作成
データ生成:その 2
10 人分のデータを生成したいので、 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 以下に移
 動
検証環境のデータを取り込み
持ってきたデータを spec/fixtures/battle 以下に
  移動させて
rake db:flextures:load DIR=battle
DB に検証環境のデータを取り込まれたので
rails console でコンソールを起動して周辺の
  コードを試し打ちしたり ruby-debugger でブ
  レークポイントを貼ったりしてバグ探し
検証環境のデータを取り込み
原因がわかったら spec にバグを再現するテス
  トを作成
データの切り替えは RSpec 中で以下の様に記
  述 
flextures :users => "battle/users",
  :items=>"battle/items", :battle_log =>
  "battle/battle_log"
検証環境のデータを " そのまま " 持ってきて
テストケースとして使用可能
最大の利点
テスト用のデータと開発環境で使うデータを
  同じ場所で管理できる
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...
現在の欠点2
FactoryFilter への機能集中 ( 1テーブル1個し
  かフィルタを持てない)
一応ファイル名を取得したり対処法はあるけ
  ど、まだまだ研究不足
あと、まとめ
別に fixtures でのデータ読み込みとかは dis っ
 ていない(読み込み速度でかなわない )
FactoryGirl も混ぜて使える(柔軟性ではこち
  らが上 )
まとめ
綺麗に適応する必要はない
DB のデータを csv でダンプする目的だけで
 使ってもよし
テスト用のデータを大量生成するために使っ
 てもよし
RSpec で fixture を切り替えるためだけに使っ
 てもよし
とまぁ色々言いましたが
Gemfile に「 gem "flextures" 」して  bundle
install するだけなので、とりあえず使ってみて
                 ください
      (CSV 吐き出しだけしたいなら、オススメは 1.0.6)
Gemfile に「 gem "flextures" 」して  bundle
install するだけなので、とりあえず使ってみて
                 ください
ありがとうございました

More Related Content

PPTX
サイボウズ・ラボ成果発表会
PDF
噛み砕いてKafka Streams #kafkajp
PDF
Pgconf asia-201612203-pg reversi-ja
PDF
20150513 legobease
PDF
利用者主体で行う分析のための分析基盤
PDF
リレーショナルな正しいデータベース設計
PDF
データベース設計徹底指南
PDF
今さらながらRSpecに入門してみた
サイボウズ・ラボ成果発表会
噛み砕いてKafka Streams #kafkajp
Pgconf asia-201612203-pg reversi-ja
20150513 legobease
利用者主体で行う分析のための分析基盤
リレーショナルな正しいデータベース設計
データベース設計徹底指南
今さらながらRSpecに入門してみた

Similar to Rails-Plugin Flexturesの紹介 (20)

PDF
Haikara
PDF
地獄Spec
PDF
地獄Spec
PDF
Railsハイパー実践講座-第35回NaCl勉強会
PDF
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
ODP
Fabrication
PDF
こんな辛いテストはいやだ
PPTX
R spec勉強会
PDF
Red Data Tools
PDF
Ruby 3の型推論やってます
PPT
PPT
CPANの依存モジュールをもう少し正しく検出したい
ODP
kpfx07 LT ruby-processingでイケメンになりたい
PDF
Ruby初級者向けレッスン 第46回 ─── Test::Unit
PDF
Rubykansai 81
PDF
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails (増補日本語版)
ODP
RSpecのここがすごい!
PDF
Rails あるある
PDF
RSpec と Cucumber
Haikara
地獄Spec
地獄Spec
Railsハイパー実践講座-第35回NaCl勉強会
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
Fabrication
こんな辛いテストはいやだ
R spec勉強会
Red Data Tools
Ruby 3の型推論やってます
CPANの依存モジュールをもう少し正しく検出したい
kpfx07 LT ruby-processingでイケメンになりたい
Ruby初級者向けレッスン 第46回 ─── Test::Unit
Rubykansai 81
Hypermedia: The Missing Element to Building Adaptable Web APIs in Rails (増補日本語版)
RSpecのここがすごい!
Rails あるある
RSpec と Cucumber
Ad

More from baban ba-n (12)

ODP
Typusとadministrateを比較してみよう
ODP
Typusと付き合ってきた話
ODP
ハッカソン。来た、見た、負けた! Spajam2016仙台予選
ODP
ガラホ、なるものに対応してきた
ODP
Minitest調べてみた
ODP
人工言語ロジバン超入門編
ODP
普通のエンジニアが【ロジバン】やってみた
ODP
プログラミング言語Cyanの紹介
ODP
Rubyのコードを読んでみよう(オブジェクト編)
ODP
Rubyのソースコードを読んでみよう(入門編)
ODP
rails 管理画面作成gem Typus解説
PDF
名前重要 超重要
Typusとadministrateを比較してみよう
Typusと付き合ってきた話
ハッカソン。来た、見た、負けた! Spajam2016仙台予選
ガラホ、なるものに対応してきた
Minitest調べてみた
人工言語ロジバン超入門編
普通のエンジニアが【ロジバン】やってみた
プログラミング言語Cyanの紹介
Rubyのコードを読んでみよう(オブジェクト編)
Rubyのソースコードを読んでみよう(入門編)
rails 管理画面作成gem Typus解説
名前重要 超重要
Ad

Rails-Plugin Flexturesの紹介