うさぎ組

kyon_mm with software

このエントリーをはてなブックマークに追加

Webアプリ性能テストツールGatling-キャプチャ&リプレイ編-

はじめに

このエントリはソフトウェアテストAdventCalendar2014の5日目の記事です。

http://connpass.com/event/4544/

3回にわけて、GatlingというWebアプリケーションの性能テスティングフレームワークについて解説します。

Gatlingのキャプチャ&リプレイ

GatlingではHTTP通信を(Gatlingのプロキシサーバーを利用して)監視して、それらを「Gatlingのテストコード」に変換してくれます。複雑なアプリケーション(非同期処理が多く入っている場合、HTTPレベルのテストが全くない場合など)のテストコード導入のハードルをさげてくれます。 下のような流れですすみます。

  1. recorder.shの実行もしくはRecorderをRUNする。
  2. startをクリックしてGatlingのRecorderを起動する。(プロキシサーバーが起動する。)
  3. PCのプロキシ設定を変更する。(Gatlingのプロキシサーバーに変更する。)
  4. 実際にHTTP通信を行う。(ブラウザ操作などを行う。)
  5. Stop&SaveをクリックしてGatlingのRecorderを終了する。

実際の操作しているスクリーンショットは次のような感じです。

../../../_images/recorder.png ../../../_images/recorder_running.png

例えばkyon-mm.bitbucket.orgを開いたときには次のようなスクリプトが生成されています。

package basic

import com.excilys.ebi.gatling.core.Predef._
import com.excilys.ebi.gatling.http.Predef._
import akka.util.duration._

class SWTestAdventSample extends Simulation {
  val httpConf = httpConfig
    .baseURL("http://excilysbank.gatling.cloudbees.net")
    .acceptCharsetHeader("ISO-8859-1,utf-8;q=0.7,*;q=0.7")
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    .acceptEncodingHeader("gzip, deflate")
    .acceptLanguageHeader("fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3")
    .disableFollowRedirect

  val headers_1 = Map(
    "Keep-Alive" -> "115")

  val scn = scenario("Scenario name")
    .exec(
      http("request_1")
        .get("/")
        .headers(headers_1)
        .check(status.is(302)))
    .pause(0 milliseconds, 100 milliseconds)
    .exec(
      http("request_2")
        .get("/public/login.html")
        .headers(headers_1))

  setUp(scn.users(10).ramp(10).protocolConfig(httpConf))

}

あとはこれらに手を加えて不要なコードを削除したり、リファクタリングしたりします。実際に実行するには、前回までの手順と同じです。

キャプチャの設定

Recorderを起動したときの設定でよく使うものを一言ずつ説明します。

  • Listening Port : HTTPとHTTPSのプロキシサーバーのポート番号を指定します。この番号をPCのプロキシサーバー設定に使います。
  • Outgoing proxy : すでに別のプロキシサーバーを使用している場合には、ここで指定することで、GatlingがキャプチャしたHTTPリクエストはそちらに流します。ユーザー/パスワードも設定できます。
  • Follow Redirect : リダイレクトを要求するレスポンスの場合に、リダイレクトのリクエストとそのレスポンスもキャプチャするかどうかを指定します。
  • output : キャプチャした内容をどこにファイルとして出力するかを指定します。
  • Filter : スクリプト化する内容をフィルタリングするための条件式を指定します。

まとめ

3回にわけてとても簡単な内容にとどめてでしたが、GatlingのGetting Start的な内容を書いてみました。もっと使ってみたい方はGatlingのGithubのWikiにもっと詳細な方法がのっているので、そちらを参照してみてください。ただ、個人的にも気にいっているツールなので今度はもっと詳細な(つまりWikiの日本語訳的な)ものを書いてみたいなとは思います。