46
地獄の RSpec おおはら@Drecom Co., Ltd. 逃げちゃだめだ、逃げちゃだめだ・・・

地獄Spec

Embed Size (px)

DESCRIPTION

Railsだったり勉強会地獄のRspec

Citation preview

Page 1: 地獄Spec

地獄のRSpec

おおはら@Drecom Co., Ltd.

逃げちゃだめだ、逃げちゃだめだ・・・

Page 2: 地獄Spec

警告 このプレゼンを見てから7日以内にspecヲ20コGreenにしないといけません。さもなくば貴方のプロジェクトは炎上し、メンバーは疲れ果て疾走し行方不明になる可能性があります。

貴方のプロジェクト、大丈夫ですか・・・?

Page 3: 地獄Spec

提供

DRECOMWith entertainment

R

Page 4: 地獄Spec

自己紹介

おおはらつねのり

アプリケーションエンジニア

所属:広告事業本部

twitterアカウント:@ohrdev

Page 5: 地獄Spec

経歴

Rails歴:2年半

札幌の会社からドリコムへ転職

元SIer(元IT亡者)

ソーシャルゲームはヤった事ない(シゴトハノゾク)

Page 6: 地獄Spec
Page 7: 地獄Spec

今日のおはなし

Page 8: 地獄Spec

テスト

Page 9: 地獄Spec

RSpec

Page 10: 地獄Spec

質問1

spec

Page 11: 地獄Spec

最初

。 何時

Page 12: 地獄Spec

グリーン維持は大変

Page 13: 地獄Spec

質問2

グリーン維持してる?

Page 14: 地獄Spec

理想的なプロジェクトなら・・・

Page 15: 地獄Spec
Page 16: 地獄Spec

だが現実はキビシイ・・・

Page 17: 地獄Spec
Page 18: 地獄Spec

現実

Page 19: 地獄Spec
Page 20: 地獄Spec

うちのシステムでRSPEC導入した時の話

Page 21: 地獄Spec

組織(広告事業部)

開発

営業 企画

カスタマーサポート

受注

クライアント

Page 22: 地獄Spec

サービス(poncan)

ソーシャルアプリ向けリワード広告サービス

http://www.slideshare.net/CyLab/poncan2

リワード広告とは:

ユーザーに広告を提供し、その成果に対して

一定の報酬(ポイント等)を支払うサービス

Page 23: 地獄Spec

システム(poncan)

Rails2.3.8 + passenger

Ruby1.8.7

MySQL5

Memcached(acts_as_cached)

Resque/Redis

Page 24: 地獄Spec

運用

止めれない(サーバー停止のメンテは基本なし)

Migrationは使用しない(できない)

→openark kit/oak-online-alter-table

(1日のリリース:2.1回)

(1日コミット数:22.3回)

(毎日リリース・毎週機能追加・拡張)

Page 25: 地獄Spec

背景

テストコード(メンテされて)なかった リリースまでに(チェックで)時間かかる 漏れや事故が多い

Page 26: 地獄Spec

poncan

事故バグ

漏れ

テストコード(のメンテ)不足

安心感

Page 27: 地獄Spec
Page 28: 地獄Spec

Specを書けよデコ助野郎!

Page 29: 地獄Spec

RSpec

開発メンバー

Page 30: 地獄Spec

①導入前の状態

有効なRSpecほぼ無し

自動生成されたtestunitが少々

誰も動かしていない

当然メンテもしていない

Page 31: 地獄Spec

②導入直後にやった事

メンテされていないテストコードは削除

-流用できないコード多数

 -そもそも仕様が既に変わっている

自動生成されたコードも削除

テスト用データ

 -fixturesからFactoryGirlに移行

Page 32: 地獄Spec

②失敗・教訓(導入直後)

とりあえず動くだけでは不十分

-実行時間が長いと流さなくなる

自動で動かさないと忘れる

 -autotest使うようにした

テストデータを全てFactoryGirlで賄うのは面倒

 -マスタデータはfixtures

-トランザクションデータはFactoryGirl

Page 33: 地獄Spec

③しばらく経って(1週間位)やった事

Specを書く対象を絞った

 -まずはmodelから書いていく事にした

 -controllerは後回し

Page 34: 地獄Spec

③失敗・教訓(しばらく経って)

ビジネスロジック部分をspecの対象にすべきだった

 -modelだけでは不十分で、(Fat)controllerのロジック部分も対象にしないと無意味

万遍なくspecを書こうとして途方に暮れた

 -全部書く時間ない・モチベーション下がる

 -修正の入った箇所から充実させていった

Page 35: 地獄Spec

④慣れてきた頃(1ヶ月位)にやった事

CIを導入した

-手軽なBigTunaを採用

遅い処理の改善

 -テストダブル(モック・スタブ)に置き換え

 -migrationからschema.rb読み込みに変更

Page 36: 地獄Spec

④失敗・教訓(慣れてきた頃)

CIの失敗通知が続いてREDに慣れてしまった

 -失敗だけでなく失敗数も通知するようにした

 -オールグリーンを目標に設定

 -だんだんREDが減っていくのを見てモチベ△

メンバー間のspecの書き方に統一性が無くなってきた

 -勉強会・共有会で書き方をある程度共有

 -THE RSPEC BOOK

Page 37: 地獄Spec

⑤充実してきた頃(3ヶ月位)にやった事

カバレッジを指標にした

 -rake spec:rcov

テストデータの整理

 -モデル(テーブル)数80くらい

Page 38: 地獄Spec

⑤失敗・教訓(充実してきた頃)

カバレッジは万能じゃない

 -「レガシーコード=テストの無いコード」なので意味はあるが・・・

 -Reekを取るようにした(お手軽/ReekViewer) https://github.com/Shinya131/reek\viewer

FactoryGirlがパンクした

 -factory.rbに全てぶっ込むのではなく、factoriesフォルダ以下にファイル分割配置

 -リレーション指定やりすぎると破綻(メンテ不能)に

Page 39: 地獄Spec

⑥グリーンになって(5ヶ月位)にやった事

trunkとbranchに対してそれぞれCIを回した

 -管理・配信・配信(mixi特化)アプリごとに、それぞれ計6つのCIを回す

 -trunkとbranchの差分を全てチェック(苦行)

レッドからグリーンにするではなく、グリーンを維持するように目標をシフト

Page 40: 地獄Spec

⑥失敗・教訓(グリーンになって)

Trunkはグリーンだけど、branchはレッドという状況に

 -息の長いbranchだと未マージ・マージ漏れが発生しうる

 -特定のコードをbranchにマージする・しないで赤だったり緑だったりするケースがある

なるべくtrunkとbranchの差分を小さくするように意識

Page 41: 地獄Spec

⑦そして今に至る・・・

ビフォー

Page 42: 地獄Spec

⑦そして今に至る・・・

アフター

Page 43: 地獄Spec

結果どうなった?

リリース頻度が加速

 -漏れ・事故が少なくなった

 -即リリース・即bug発見・即修正・即リリース・・・

“ある程度”安心できる

trunkとbrunchの差分が減った

100%bug潰すのは無理だけど、即発見・修正はできる

Page 44: 地獄Spec

今後

Rails2.3.8から、Rails3.xにVerUp

 -Jenkins + rvm + rails3.x でCI回す

もうなにも怖くない(CIまわしてればある程度)

Seleniumで面もチェック

 -目確認は(最低限しか)したくない

引き続きGREEN維持

Page 45: 地獄Spec

まとめ

RSpecちゃんとしたら、リリース頻度あがった

Specメンテ => CI導入 じゃなくて、

CI導入 => Specメンテ ってするとウマく回った

BUG潰し・予防よりもBUGの早期発見・早期修正に役立った

BUGは出る時は出る、Rspec/CIは万能じゃないので注意

Page 46: 地獄Spec

ドリコムメンバー募集

ドリコム広告事業本部では、テスト好きなメンバーを募集しています。

http://www.drecom.co.jp/recruit/