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
16
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RSpecの実行速度を3.5倍にした話
Naomichi Yamakita
June 23, 2015
More Decks by Naomichi Yamakita
See All by Naomichi Yamakita
現場で試したAI駆動開発
naomichi
0
46
ClickHouse活用によるパフォーマンス改善について
naomichi
0
190
SRE が駆動するプロダクト品質と アーキテクチャ進化の仕組み
naomichi
0
220
今こそ聞きたい!ガバメントクラウド
naomichi
0
66
AWSにおける横断的なログ分析と コストの管理
naomichi
1
7.1k
失敗から始まるリアーキテクト: SREの実践例で見る改善の道筋
naomichi
0
910
プロダクト横断で可視化する ダッシュボードの開発
naomichi
0
420
第一回ライブラリ開発について考える会
naomichi
0
160
Serverless Application Repositoryでトイルを削減する
naomichi
0
370
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Evolving SEO for Evolving Search Engines
ryanjones
0
250
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
620
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
590
Game over? The fight for quality and originality in the time of robots
wayneb77
1
230
We Have a Design System, Now What?
morganepeng
55
8.2k
Balancing Empowerment & Direction
lara
6
1.2k
Being A Developer After 40
akosma
91
590k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
450
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