Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
40
SRE が駆動するプロダクト品質と アーキテクチャ進化の仕組み
naomichi
0
160
今こそ聞きたい!ガバメントクラウド
naomichi
0
37
AWSにおける横断的なログ分析と コストの管理
naomichi
1
6.4k
失敗から始まるリアーキテクト: SREの実践例で見る改善の道筋
naomichi
0
800
プロダクト横断で可視化する ダッシュボードの開発
naomichi
0
370
第一回ライブラリ開発について考える会
naomichi
0
120
Serverless Application Repositoryでトイルを削減する
naomichi
0
340
SRE的観点から日常を振り返る
naomichi
0
1.1k
Featured
See All Featured
Building Adaptive Systems
keathley
44
2.9k
Fireside Chat
paigeccino
41
3.8k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
140
Side Projects
sachag
455
43k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.3k
We Are The Robots
honzajavorek
0
130
Faster Mobile Websites
deanohume
310
31k
Site-Speed That Sticks
csswizardry
13
1k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
80
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
270
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
120
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