$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RSpecの実行速度を3.5倍にした話
Search
Naomichi Yamakita
June 23, 2015
0
12
RSpecの実行速度を3.5倍にした話
Naomichi Yamakita
June 23, 2015
Tweet
Share
More Decks by Naomichi Yamakita
See All by Naomichi Yamakita
ClickHouse活用によるパフォーマンス改善について
naomichi
0
37
SRE が駆動するプロダクト品質と アーキテクチャ進化の仕組み
naomichi
0
160
今こそ聞きたい!ガバメントクラウド
naomichi
0
32
AWSにおける横断的なログ分析と コストの管理
naomichi
1
6.3k
失敗から始まるリアーキテクト: SREの実践例で見る改善の道筋
naomichi
0
790
プロダクト横断で可視化する ダッシュボードの開発
naomichi
0
370
第一回ライブラリ開発について考える会
naomichi
0
120
Serverless Application Repositoryでトイルを削減する
naomichi
0
330
SRE的観点から日常を振り返る
naomichi
0
1.1k
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
The untapped power of vector embeddings
frankvandijk
1
1.5k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
86
How to Think Like a Performance Engineer
csswizardry
28
2.4k
How to train your dragon (web standard)
notwaldorf
97
6.4k
The SEO identity crisis: Don't let AI make you average
varn
0
35
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.5k
Utilizing Notion as your number one productivity tool
mfonobong
2
190
Google's AI Overviews - The New Search
badams
0
870
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
0
1k
For a Future-Friendly Web
brad_frost
180
10k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Transcript
RSpecの実行速度を3.5倍にした話 Shinjuku.rb #26 2015/6/23 株式会社メタップス プロダクト統括部 SPIKE戦略推進チーム 山北 尚道
None
SPIKEとは • テクノロジーでお金の在り方を変える o 決済サービス § 決済手数料のかからない決済サービス o SPIKEコイン §
保有額に対して年間1%の割合で増えるプリペ イド型の電子マネー o SPIKEマーケット § SPIKE会員様を対象とした商材の優待販売
SPIKEにおけるRSpecの勘所 • コントローラやモデル、ライブラリクラス 単位でテストケースを作成 • Spring (Application preloader) を併用 •
Circle CIによるテストの自動化 • テストカバレッジは一定の割合以上を維持
開発者の環境
最近の課題 テストが遅い
何故時間がかかるのか? 1. Gem読み込みすぎ? 2. テストコードの書き方? 3. Docker? 4. I/O? 5.
MySQL? 6. SQLiteにしてみるとか?←今ココ
ベンチマークを取ってみることに • テスト対象: コントローラクラス o フォームウィザードを提供するクラス(入力→確認 →完了) o HTTP通信、DBアクセス (I/O)
のコードが含まれる • テスト数: 10
結果 テスト環境 検証結果 (実行時間 - 初期化時 間) MySQL+ Redis on
Docker 61.97s MySQL + Redis on localhost 48.75s SQLite + Redis on localhost 17.69s ※各検証における初期化時間は約16秒 約3.5倍高速化!
テストコードをSQLiteに対応させる施策1 # ERROR: Index name 'fk_xxx...xxx_idx' on table 'xxx' is
too long; the limit is 62 characters… # BEFORE: add_index "fk_xxx...xxx_idx", ["is_valid"], name: "yyy", using: :btree # AFTER: add_index "fk_xxx_idx", ["is_valid"], name: "yyy", using: :btree インデックス名が長いとエラーが発生
テストコードをSQLiteに対応させる施策2 # 大文字で'USD'という値を登録 INSERT INTO xxx(code) VALUES('USD'); # MySQL (※BINARY属性なし)
xxx.where(code: 'usd').count > 1 # SQLite xxx.where(code: 'usd').count > 0 レコードの大文字・小文字は区別される
テストコードをSQLiteに対応させる施策3 # MySQL: pry(#<xxx::xxx::xxxController>)> orders.first[0] => Sun, 10 Nov 2013
# SQLite: pry(#<xxx::xxx::xxxController>)> orders.first[0] => "2013-11-10” エイリアスカラムが日付として認識されない SELECT DATE(xxx_at) AS xxx_at
テストコードをSQLiteに対応させる施策4 # MySQL pry(#<xxx::xxx::xxxController>)> ActiveRecord::Base.connection.select('SELECT * FROM users') => #<ActiveRecord::Result:0x007fe681252ff0
# SQLite pry(#<xxx::xxx::xxxxController>):1> ActiveRecord::Base.connection.select('SELECT * FROM users') NoMethodError: protected method `select' called for # 一部のメソッドがサポートされていない (!)
SQLite版RSpecの実行 デモ
以上です ご清聴ありがとうございました。 github.com/naomichi-y