SlideShare a Scribd company logo
1 of 69
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
スローテスト刑事
(デカ)
第74回�Ruby関⻄�勉強会
京都⼥⼦大学�C508
2016-09-11�(Sun)
伊藤�浩⼀�(@koic)
(株)永和システムマネジメント
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
わたし
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
わたし
(株)永和システムマネジメントで
働く会社員。Rubyとかメタルと
か好きです。
https://github.com/koic✓
https://twitter.com/koic✓
https://koic.hatenablog.com✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
�
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
御礼
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
�
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
今⽇の話
Railsアプリケーションのスロ
ーテスト対策について
✓
XP�で伝えられる�Testing�と�
Continuous�Integration�への
現実的課題点について考察
✓
現場での実践とポイント
オンプレJenkins✓
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
まとめ
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
Thanks�(デカ部屋)
@1syo✓
@onk✓
@yattom✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
フルビル
ド何分で
すか?
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
とあるアンケート
10分以内に抑えるようにして
います
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
10分と
いう目標
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
目標と現
実の差を
知る
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
ある現実
だいたい3,795�examplesほど✓
ある時点で�rake�stats�した
Code�LOC:�12796✓
Test�LOC:�23518✓
Code�to�Test�Ratio:�1:1.8✓
✓
素朴にテストを書いて実⾏とか
だと1時間越え
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
1時間越え
24つのPull�Requestが出たら
1⽇の処理量を越える
✓
というか翌朝出社しても終わら
ない
✓
ないわー✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
86,400
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
時間の重み
1⽇は86,400秒✓
例えば60秒かかるスローテス
トが30つあると、
✓
⼀⽇に処理できるCIの上限は
48つ以下
チームは⼀⽇何回のコミットをして
ますか?
✓
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
⾦を払いま
すか?労⼒
を払います
か?
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
最速での事件解決法
札束で殴る✓
潤沢な⾦と権⼒✓
お⾦がんばれ✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
労⼒を⾦で解決する
問題解決の基礎戦略のひとつ✓
潤沢な⾦と権限のあるプロジェ
クトは動きやすい
あまりそういったプロジェクトばか
りでないのが現実
✓
今⽇の話は制約の中でどうしていく
か
✓
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
スローテスト刑事�(デカ)�の
⽇常
テストの並列化と個別のチュー
ンナップを頑張る
✓
まるで靴底をすり減らした聞き
込みのように地道な作業
デカだからね✓
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
TL;DR
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
コアでスケー
ルアウトしメ
モリでスケー
ルアップする
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
私のオススメ
倍速レベルで速くなる並列化を
初⼿にすると良い
投資対効果が⾼い✓
✓
DBのデータファイルのメモリ
化でディスクIO削減
RDBMS自体のパフォーマンスが上
がるわけではないので、20%の速度
向上など⼀定⽐率で頭打ちはある
✓
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
Topics
1.�Parallel✓
2.�DB✓
3.�Tips✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
1.Parallel
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
Gemfileに以下を書いて
bundle�install�(1/4)
parallel̲tests�/�test-queueとい
った並列化ライブラリがある。
�����������������������������������������
ここはparallel̲testsを例にする。
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
各種設定を並列対応�(2/4)
データベースを並列分用意して、
config/database.ymlを対応する
�����
���������������������������������������������������������
RDBMSに並列実⾏分のスキーマ�
(あるいはDB)�を用意する
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
並列分のスキーマ作成�(3/4)
rake�db:migrate�の実⾏より�
rake�db:schema:load�の⽅が速い
ので意図がないならオススメ
���������������������������
������������������������������������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
テストの並列実⾏�(4/4)
--suffixでテスト対象を絞り込んで
⾒てみても良い。
������������������������������������������
���������������������������������������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果
4コア:�約1時間のテストが約
15分になった。
✓
2コア:�約1時間のテストが約
30分になった。
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
共有リソースが容疑者
基本的に個別のテストに⼿を⼊
れず効果を得られる
✓
Isolated�Testの原則からそれ
ぞれが影響しないはず
✓
Shared�resourcesに気をつ
ける
逆にいうとだいたいここくらい✓
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
並列化まとめ
tmm1/test-queue,�grosser/
parallel̲testsなどで並列化
✓
並列化するためデータベースや
全⽂検索エンジンなどのリソー
スも並列可能にする
✓
コアの数でほぼ頭打ちになるの
でハイスペックのマシンが良い
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果が⾼い
ので最初に
やると良い
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
2.�DB
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
データファイルのtmpfs搭載
RDBMSによるが2割減などが
⾒込めたりするらしい
✓
⼀⽅でDisk�IO減は思いのほか
効いていない
✓
というかこの間、Vagrantのパ
ラメータやらtmpfs化と合わせ
てしておくREDOログの設定し
くっててMac�MiniのCI死んだ
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
Vagrantメモリ割当の変
問題.�この設定で�vagrant�reload�
してテストを流しました�(配点2点)
��������������������������������������
��������������������������������������������������������
���������������������������������������������������������������
������������������������������������������������������
������������������������������������������������������
���
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
まだ⽣傷が
癒えていな
いので割愛
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
データベースのクリーニング
を整理する
スローテストの原因は、だいた
いデータベースがネック
CI�実⾏もアプリケーションでの実
⾏もボトルネックは同じ
✓
✓
amatsuda/
database̲rewinderというプ
ロダクトもあるが、ここでは
DatabaseCleanerのお話
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
DatabaseCleaner.strategy
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
spec̲helper.rb
あるいはrails̲helper.rbに以下が
あれば⾼速化の狙い目。
���������������������������������
����������������������������������
�������������������������������������������������������������
������
�������������������������������������������
�����
���
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
DatabaseCleaner.strate
gyはできるだけ
transactionに任せる
データベースのデータ挿⼊と取得
で異なるスレッドが現れる
JavaScriptのテスト以外は
truncationではなく、同⼀スレッ
ドで扱えるtransactionにする。
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
容疑者探し
example.metadata�が⼿掛かり。
���������������������������
�����������������������������������
�������
容疑者の絞り込みまで出来るとあ
とはやるだけなので割りと楽。
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
やること
@javascriptを必要な場所に移す
������������
��������������
�����������������������������
���������
��������������
��������������������������
���������
�����������������������������
���������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果�1�BEFORE
�����������������������������������������������������������
�����������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果�1�AFTER
�����������������������������������������������������������
�����������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果�2�BEFORE
�����������������������������������������������������������
����������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果�2�AFTER
����������������������������������������������������������
����������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果�3�BEFORE
�����������������������������������������������������������
�����������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果�3�AFTER
�����������������������������������������������������������
�����������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果�4�BEFORE
�����������������������������������������������������������
����������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
効果�4�AFTER
����������������������������������������������������������
����������������������
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
全体効果
約40分のテストが35分になっ
た。
9%ほど削減✓
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
あとは地道に細かいチューニ
ング
投資対効果が⾼いテストからチ
ューニングしていく
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
3.Tips
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
プロファイリング
推測するな、計測せよ�(--profile)
��������������������������������
������
������������������������������
�����
������������������������������������������������������������������������������������������
�����
������������������������������������������������������������������������������������������
�����
������������������������������������������������������������������������������������������
����
オリコンチャート的な。
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
sleepを取り締まる
grep�sleep�.�|�wc�-l�で⾒つか
った件数以上の待ち時間が発⽣
スローの原因場所は⾒つけやすい✓
✓
JavaScriptの関わるE2Eテス
トでの遭遇率⾼い
✓
1秒もsleepするならDBに状態
を問い合わせた⽅が速い
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
DRY
テストの重複を消す✓
コピペによる迷宮⼊り✓
コードを書いた時点でないと⾒
つけることが現実的には困難?
Code�Climate的な静的解析で⼿掛
かりを⾒つけたりできる?
✓
知⾒を知りたい✓
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
断捨離
使われていないテスト�(と呼び
出される不要な)�コードを捨て
る
✓
⾜し算より引き算の⽅が難しい✓
コードを捨てることができて⼀
⼈前
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
最適化
before(:all),�before(:each),�
aggregate̲failures�あたりの
最適化
✓
毎回の初期化が必要かどうかは
⼀考の余地有り
✓
最近は�1�example(it,specify)�
で�1�テストケースよりも速度
重視に思考が変わってきた
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
できるだけインメモリ
不要な�AR�オブジェクト作ら
ない�(factory�で関連作らず�
nil�にしておく)
✓
DB�にアクセスさせない�
(FactoryGirl.create�->�build)
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
system�呼び出さない
他のテストで担保している遅い
外部コマンド�(ImageMagick)�
をスタブ化するなど
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
無駄な処理
サムネイル作らない✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
付録
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
対象絞り込み
変更と関係のあるテストだけ実
⾏するという選択肢
✓
タグ(rspec�--tag)で対象のテ
ストを絞る
ただし全テストを⾒たいCIの前段ま
で
✓
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
ci�skip
rails/railsはじめ常套⼿段✓
コメント修正といったレビュー
をパスすれば良いだけのものは
テストしない
CI�の設定✓
✓
ci�skip�/�CI�SKIP�/�skip�ci�/�
SKIP�CI�いずれでも受⼊れるよ
うにしておくと良い
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
To�be�continued...
スローテスト刑事�(デカ)�の捜
査は続く
✓
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
�
スローテスト刑事�(デカ) Powered�by�Rabbit�2.1.8
Dying�Message
札束で殴る✓
潤沢な⾦と権⼒✓
お⾦がんばれ✓

More Related Content

More from Koichi ITO

Bundler 2 の胎動
Bundler 2 の胎動Bundler 2 の胎動
Bundler 2 の胎動Koichi ITO
 
アプリがパッチにまみれたら
アプリがパッチにまみれたらアプリがパッチにまみれたら
アプリがパッチにまみれたらKoichi ITO
 
Stairway to The Pragmatic Rails Programmer
Stairway to The Pragmatic Rails ProgrammerStairway to The Pragmatic Rails Programmer
Stairway to The Pragmatic Rails ProgrammerKoichi ITO
 
最軽の開発手法 dX 改
最軽の開発手法 dX 改最軽の開発手法 dX 改
最軽の開発手法 dX 改Koichi ITO
 
Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから
Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれからRailsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから
Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれからKoichi ITO
 
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選Koichi ITO
 
10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム
10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム
10年生きる Ruby / Rails アプリケーションプログラマーのエコシステムKoichi ITO
 
俺の開発日誌
俺の開発日誌俺の開発日誌
俺の開発日誌Koichi ITO
 
ghq gem-src and more
ghq  gem-src and moreghq  gem-src and more
ghq gem-src and moreKoichi ITO
 
RuboCopとXPコーディング規約
RuboCopとXPコーディング規約RuboCopとXPコーディング規約
RuboCopとXPコーディング規約Koichi ITO
 
俺たちの新人教育!!
俺たちの新人教育!!俺たちの新人教育!!
俺たちの新人教育!!Koichi ITO
 
Gate of Agile Web Development
Gate of Agile Web DevelopmentGate of Agile Web Development
Gate of Agile Web DevelopmentKoichi ITO
 
RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術Koichi ITO
 
Motivationware
MotivationwareMotivationware
MotivationwareKoichi ITO
 
達人プログラマーへの道
達人プログラマーへの道達人プログラマーへの道
達人プログラマーへの道Koichi ITO
 
Let's get ready for next Ruby
Let's get ready for next RubyLet's get ready for next Ruby
Let's get ready for next RubyKoichi ITO
 
Agile Software Development with Edge Ruby
Agile Software Development with Edge RubyAgile Software Development with Edge Ruby
Agile Software Development with Edge RubyKoichi ITO
 
Safe navigation operator in Ruby
Safe navigation operator in RubySafe navigation operator in Ruby
Safe navigation operator in RubyKoichi ITO
 
プロの無職についての考察:序
プロの無職についての考察:序プロの無職についての考察:序
プロの無職についての考察:序Koichi ITO
 

More from Koichi ITO (20)

Bundler 2 の胎動
Bundler 2 の胎動Bundler 2 の胎動
Bundler 2 の胎動
 
アプリがパッチにまみれたら
アプリがパッチにまみれたらアプリがパッチにまみれたら
アプリがパッチにまみれたら
 
Stairway to The Pragmatic Rails Programmer
Stairway to The Pragmatic Rails ProgrammerStairway to The Pragmatic Rails Programmer
Stairway to The Pragmatic Rails Programmer
 
最軽の開発手法 dX 改
最軽の開発手法 dX 改最軽の開発手法 dX 改
最軽の開発手法 dX 改
 
Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから
Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれからRailsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから
Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから
 
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
 
10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム
10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム
10年生きる Ruby / Rails アプリケーションプログラマーのエコシステム
 
俺の開発日誌
俺の開発日誌俺の開発日誌
俺の開発日誌
 
ghq gem-src and more
ghq  gem-src and moreghq  gem-src and more
ghq gem-src and more
 
RuboCopとXPコーディング規約
RuboCopとXPコーディング規約RuboCopとXPコーディング規約
RuboCopとXPコーディング規約
 
俺たちの新人教育!!
俺たちの新人教育!!俺たちの新人教育!!
俺たちの新人教育!!
 
Gate of Agile Web Development
Gate of Agile Web DevelopmentGate of Agile Web Development
Gate of Agile Web Development
 
RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術RubyKaigi 2015 の Drinkup を支える技術
RubyKaigi 2015 の Drinkup を支える技術
 
Motivationware
MotivationwareMotivationware
Motivationware
 
達人プログラマーへの道
達人プログラマーへの道達人プログラマーへの道
達人プログラマーへの道
 
Let's get ready for next Ruby
Let's get ready for next RubyLet's get ready for next Ruby
Let's get ready for next Ruby
 
職と人
職と人職と人
職と人
 
Agile Software Development with Edge Ruby
Agile Software Development with Edge RubyAgile Software Development with Edge Ruby
Agile Software Development with Edge Ruby
 
Safe navigation operator in Ruby
Safe navigation operator in RubySafe navigation operator in Ruby
Safe navigation operator in Ruby
 
プロの無職についての考察:序
プロの無職についての考察:序プロの無職についての考察:序
プロの無職についての考察:序
 

スローテスト刑事 (デカ)