RSpec の –profile オプションで時間のかかる遅いテストを調べる

スポンサーリンク

RSpec で書いている Rails のテストのサンプル数が300個を超えて、全部のテストを終えるのに5分以上とかかかるようになってきました。ネットワーク超えの外部ウェブサービスのAPIを利用したり、重いDB処理を行う箇所などが含まれるのでしょうがない側面もありますけれど。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

— 環境 —
rails-4.0.1
rspec-rails-2.14.0
capybara-2.2.0

RSpec メンテナの方に –profile オプションを教えてもらった

それで、RSpec のテストが時間かかって遅い〜とつぶやいたところ、RSpec のメンテナの方からアドバイスを頂けました。Myron Marston さんありがとうございます!ブログでツイートと情報のシェアも承諾頂きました。

訳:– profile オプションを使うと遅いサンプルをリストアップできるよ。

ヘルプを見てみますと…

なるほど… ヘルプ見なきゃですね(戒め)。

時間のかかる処理を含むテストを20個抽出

遅いサンプルを20個抜き出してみます。数字のオプションなしだとデフォルトで10個。

なんと遅い20個のテストだけで全体の53%強を占めるという結果。しかも、ほとんど同じテストファイル(/spec/requests/some_webapi_pages_spec.rb)に含まれてます。それで profiling に以下が含まれていて分かったのですが、外部APIを叩く自作ライブラリの処理が遅い原因の1つだろう。

lib/some_webapi.rb で外部ウェブサービスのAPIを利用する処理を作ったのですが、この自作ライブラリのテストだけで10秒近くかかっているのが分かりました。jsonレスポンスが返ってくるのに時間がかかるのですよね…。some_webapi_pages_spec.rb の該当箇所は、このライブラリの処理を含んでいるので結果的に処理が当然遅くなる。

RSpec の –profile オプションで遅い処理を含むテストを抽出できたので、該当する部分のコードを重点的にリファクタリングして処理速度の改善を行おうと思います。また、外部API叩く箇所など毎回テストに含めると時間がかかって辛いので、普段は該当のテストをコメントアウト、もしくは以下の skip: true の設定を利用しよう。

RSpecで普段は実行したくないテストをスキップする方法 – Qiita

改めて Myron Marston さん、ありがとうございました。

スポンサーリンク
私は Rails のテストフレームワークには RSpec を使っています。サーバーのテスト用に Serverspec もおすすめです。
 
スポンサーリンク

Leave Your Message!