RailsプロジェクトでApache JMeterを使ってみる

Apache JMeter - Apache JMeter™

Apache JMeter はパフォーマンス計測用のツールです。
Webアプリケーションのテストをするための様々な機能が用意されているので、複雑なテストを行うことができます。

今回はRailsアプリケーションのパフォーマンス計測をしてみたいと思います。

Railsプロジェクトを作成する

$ mkdir demo;cd demo
$ echo demo > .rbenv-gemsets
$ gem install bundler
$ gem install rails
$ rails new .
$ rake db:create
# Gemfile

gem 'devise'
$ bundle install
$ rails generate devise:install
$ rails generate devise User
$ rails g scaffold Message title:string body:text
$ rake db:migrate
$ rails c
> 1.upto(10) { |i| User.create(email: "user#{i}@example.com", password: 'password') }

$ rails s

Apache JMeter をインストールする

$ wget http://ftp.kddilabs.jp/infosystems/apache//jmeter/binaries/apache-jmeter-2.11.tgz
$ tar zxfv apache-jmeter-2.11.tgz
$ cd apache-jmeter-2.11/bin/

Apache JMeter を起動する

$ java -jar ApacheJMeter.jar

日本語にする

[Options] > [Choose Language] > [Japanese]を選択する。

スレッドグループを作成する

[Test Plan]を右クリック > [追加] > [Threads(Users)] > [スレッドグループ]を選択する。

スレッド数: 一度のテストで生成するスレッド(クライアント)数。
Ramp-Up 期間(秒): 全スレッド数を生成する時間。
ループ回数: スレッドを繰り返す回数。

各設定項目は上記のような内容になっています。では設定してみましょう。

名前: メッセージ機能
スレッド数: 10
Ramp-Up 期間(秒): 10
ループ回数: 3

30スレッドを10秒で負荷テストするということになります。

f:id:kzy52:20141018225354p:plain

ログイン用のシナリオを作成する

「一度だけ実行されるコントローラ」を作成する

[メッセージ機能]を右クリック > [追加] > [ロジックコントローラ] > [一度だけ実行されるコントローラ]を選択する。

名前: ログイン

f:id:kzy52:20141018225439p:plain

ログイン画面のサンプラーを作成する

サンプラーはテスト対象のサーバへ送るリクエスト情報です。

[ログイン]を右クリック > [追加] > [サンプラー] > [HTTPリクエスト]を選択する。

名前:GET new_user_session
Webサーバー:
  サーバ名またはIP: localhost
  ポート番号: 3000
HTTPリクエスト:
  プロトコル: HTTP
  メソッド:GET
  パス: /users/sign_in

f:id:kzy52:20141018225554p:plain

ログイン処理のサンプラーを作成する

[ログイン]を右クリック > [追加] > [サンプラー] > [HTTPリクエスト]を選択する。

名前:POST user_session
Webサーバー:
  サーバ名またはIP: localhost
  ポート番号: 3000
HTTPリクエスト:
  プロトコル: HTTP
  メソッド:POST
  パス: /users/sign_in
リクエストで送るパラメータ:
  1:
    名前: user[email]
    値: ${email}
  2:
    名前: user[password]
    値:  'password'

f:id:kzy52:20141018225727p:plain

※ 「${email}」は後でユーザーパラメータで設定します。

メッセージ登録用のシナリオを作成する

「ループコントローラ」を作成する

[メッセージ機能]を右クリック > [追加] > [ロジックコントローラ] > [ループコントローラ]を選択する。

名前: メッセージ登録
ループ回数: 5

f:id:kzy52:20141018225853p:plain

メッセージ登録画面のサンプラーを作成する

[メッセージ登録]を右クリック > [追加] > [サンプラー] > [HTTPリクエスト]を選択する。

名前: GET new_message
Webサーバー:
  サーバ名またはIP: localhost
  ポート番号: 3000
HTTPリクエスト:
  プロトコル: HTTP
  メソッド:GET
  パス: /messages/new

f:id:kzy52:20141018230129p:plain

メッセージ登録処理のサンプラーを作成する

[メッセージ登録]を右クリック > [追加] > [サンプラー] > [HTTPリクエスト]を選択する。

名前:POST messages
Webサーバー:
  サーバ名またはIP: localhost
  ポート番号: 3000
HTTPリクエスト:
  プロトコル: HTTP
  メソッド:POST
  パス: /messages
リクエストで送るパラメータ:
  1:
    名前: message[title]
    値: 'message title'
  2:
    名前: message[body]
    値: 'message body'

f:id:kzy52:20141018230306p:plain

ユーザーパラメータを作成する

パラメータを動的に設定したい場合に使用します。
今回はログインユーザをスレッド単位で切り替えるために使用します。

[メッセージ機能]を右クリック > [追加] > [前処理] > [ユーザーパラメータ]を選択する。

名前: ログイン情報
パラメータ:
    名前: email
    ユーザー1:'user1@example.com'
    ユーザー2:'user2@example.com'
    ユーザー3:'user3@example.com'
    ユーザー4:'user4@example.com'
    ユーザー5:'user5@example.com'
    ユーザー6:'user6@example.com'
    ユーザー7:'user7@example.com'
    ユーザー8:'user8@example.com'
    ユーザー9:'user9@example.com'
    ユーザー10:'user10@example.com'

これでサンプラーから${email}で指定することが可能になります。

f:id:kzy52:20141018230535p:plain

RailsのCSRF設定をする

「GET new_user_session」で右クリック > [追加] > [後処理] > [正規表現抽出]を選択する。

名前: fetch authenticity_token
参照名: authenticity_token
正規表現: <input name="authenticity_token" type="hidden" value="(.*?)" />
テンプレート: $1$

「POST user_session」、「GET new_message」も同様。

f:id:kzy52:20141018230935p:plain

次に「POST user_session」、「GET new_message」、「POST messages」の [HTTPリクエスト][リクエストで送るパラメータ] に以下を追加

名前: authenticity_token
値: ${authenticity_token}
Encode?:チェックする

「GET new_message」、「POST messages」も同様。

f:id:kzy52:20141018231248p:plain

クッキーに対応させる

[メッセージ機能]を右クリック > [追加] > [設定エレメント] > [HTTP クッキーマネージャ]を選択する。

名前: ログイン認証

f:id:kzy52:20141018231430p:plain

リスナーを作成する

テスト情報の収集、結果の表示方法を設定します。

[メッセージ機能]を右クリック > [追加] > [リスナー] > [結果を表で表示]
[メッセージ機能]を右クリック > [追加] > [リスナー] > [グラフ表示]

テストを実行する

メニュー > [実行] > [開始]

結果を確認する

総リクエスト数 = スレッド数 × ループ回数 × スレッドグループ内のリクエスト数
1秒あたりのリクエスト数 = 総リクエスト数 ÷ Ramp-Up 期間(秒)

これに当てはめると以下のようになります。

ログイン処理:20(10 × 1 × 2)リクエスト
メッセージ登録:300(10 × 3 × 10)リクエスト

総リクエスト数:20 + 300 = 320
1秒あたりのリクエスト数:320 ÷ 10 = 32

結果を表で表示

f:id:kzy52:20141018232230p:plain

グラフ表示

f:id:kzy52:20141018232241p:plain

このように Apache JMeter を使えば簡単にパフォーマンス計測をすることができます。
次回はもう少し複雑なテストや結果の見方について書いていきたいと思います。

今回作ったものは以下にアップしています。
rails-jmeter-sample.jmxを Apache JMeter で開いて使ってください。

kzy52/rails-jmeter-sample · GitHub