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
5
RSpecの実行速度を3.5倍にした話
Naomichi Yamakita
June 23, 2015
Tweet
Share
More Decks by Naomichi Yamakita
See All by Naomichi Yamakita
プロダクト横断で可視化する ダッシュボードの開発
naomichi
0
240
第一回ライブラリ開発について考える会
naomichi
0
72
Serverless Application Repositoryでトイルを削減する
naomichi
0
280
SRE的観点から日常を振り返る
naomichi
0
840
GMO Research Tech Conference 2023
naomichi
0
16
Deep dive into cloud design
naomichi
0
18
インフラを横断して可視化するダッシュボードの開発
naomichi
0
12
SREってどんな仕事___メタップスがSREチームを立ち上げたキッカケとこれから_.pptx.pdf
naomichi
0
10
SRE Innovation in Metaps
naomichi
0
270
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Fireside Chat
paigeccino
33
3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
BBQ
matthewcrist
85
9.3k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Docker and Python
trallard
40
3.1k
Code Review Best Practice
trishagee
64
17k
Rails Girls Zürich Keynote
gr2m
93
13k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
7
560
The Pragmatic Product Professional
lauravandoore
31
6.3k
Automating Front-end Workflow
addyosmani
1366
200k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
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