Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RSpecの実行速度を3.5倍にした話

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Naomichi Yamakita Naomichi Yamakita
June 23, 2015
12

 RSpecの実行速度を3.5倍にした話

Avatar for Naomichi Yamakita

Naomichi Yamakita

June 23, 2015
Tweet

More Decks by Naomichi Yamakita

Transcript

  1. SPIKEとは • テクノロジーでお金の在り方を変える o 決済サービス § 決済手数料のかからない決済サービス o SPIKEコイン §

    保有額に対して年間1%の割合で増えるプリペ イド型の電子マネー o SPIKEマーケット § SPIKE会員様を対象とした商材の優待販売
  2. 結果 テスト環境 検証結果 (実行時間 - 初期化時 間) MySQL+ Redis on

    Docker 61.97s MySQL + Redis on localhost 48.75s SQLite + Redis on localhost 17.69s ※各検証における初期化時間は約16秒 約3.5倍高速化!
  3. テストコードを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 インデックス名が長いとエラーが発生
  4. テストコードをSQLiteに対応させる施策2 # 大文字で'USD'という値を登録 INSERT INTO xxx(code) VALUES('USD'); # MySQL (※BINARY属性なし)

    xxx.where(code: 'usd').count > 1 # SQLite xxx.where(code: 'usd').count > 0 レコードの大文字・小文字は区別される
  5. テストコードを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
  6. テストコードを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 # 一部のメソッドがサポートされていない (!)