テスト実行時間を可視化する

開発をしていると意図せずテストが遅くなることがあります。
実行時間を可視化をしていれば、早急に検出することができ調査の役に立ちます。可視化していきます。

実行時間を可視化するにあたって本記事では、railsアプリケーションにtest-queueというテスト並列実行ライブラリを使用します。
test-queue は実行後に、キーがテストクラスで、実行時間がバリューになっているHashインスタンスをシリアライズした値を .test_queue_stats というファイルに
書き出します。(次回テスト実行時に各workerの終了時間バラツキを抑えるために出力している)

{ HogeModel => 11.1}

可視化する手順ですが、前述した .test_queue_stats をAPIサーバ経由でDBに登録してBIツールあたりで集計 && グラフ化します。
APIサーバへの送信はcronで定期実行するイメージです。

今回は、 その.test_queue_stats の値をDBに登録するための簡単なAPIサーバを作りました。
https://github.com/jiikko/metrix_gateway
1POSTリクエストすると1レコードinsertする感じです。
下記shellスクリプトは、テストサーバにある .test_queue_stats をデシリアライズしてcurl コマンドでAPIサーバにPOSTしています。

curl_cmds=$(ruby <<-RUBY
stats_hash = Marshal.load(File.open('/app/.test_queue_stats'))
stats_hash.each do |key, value|
  gsubed_key = key.sub('RSpec::ExampleGroups::', '') # 共通な文字列なので削除する
  puts "curl 'http://${APP_HOST}/api/v1/boards/${BOARD_ID}/rows' -X POST -d \"key=#{gsubed_key}&value=#{value}\" -o /dev/null"
end
RUBY
)
eval "$curl_cmds"

集計するSQL

SELECT sum(rows.value) as total,
       `on`
FROM `rows`
INNER JOIN boards ON boards.id = `rows`.board_id
AND boards.name = "outing_test_queue_times"
GROUP BY `ON`

APIサーバとBIツールのセットがあれば、POSTリクエストするだけなので、テスト実行時間の可視化以外にもなんらかの可視化が簡単にできそうです。

以上。