このゴールディンウィークに何をしていたのかというと、ずっとJMeterを勉強しています。
自分が参画しているプロジェクトにおいて性能テストを計画した際、もともとはabを使ってシステムをいじめてしまえば良いと考えていました。一方で、計画作業をしている中で、やはり複数ユーザを模してシナリオを流すようなテストは必要であろうと判断しました。そうすると、abではない別のツールが必要になります1。
この手のテストシナリオを流すツールを考える際、やはりまずは歴史を重ねたJMeterのことを知っておきたいと思い、JMeterの勉強に勤しんでいます。
なお、いま使っているのはJMeterの5.5です。
$ jmeter -v WARNING: package sun.awt.X11 not in java.desktop _ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____ / \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \ / _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) | / ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ < /_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 5.5 Copyright (c) 1999-2022 The Apache Software Foundation
設定ファイルの考え方
まず、JMeterでは大きく分けてシステムプロパティ、JMeterのプロパティという2つの設定が存在します。両者は、user.properties
プロパティで設定するか、あるいは、jmeterのコマンドラインオプションで指定する形になります。
システムプロパティ
system.properties
にはjava.net.preferIPv4Stack
等、主としてJVMの動作を決めるプロパティが記載されます。しかし、このファイルはユーザが編集するタイプのものではなく、変更したい設定をuser.properties
にコピーし修正する運用が想定されています。実際、system.properties
ファイルには以下の記載があります。
# THIS FILE SHOULD NOT BE MODIFIED # # This avoids having to re-apply the modifications when upgrading JMeter # Instead only user.properties should be modified: # 1/ copy the property you want to modify to user.properties from jmeter.properties # 2/ Change its value there
JMeterのプロパティ
JMeterそのものの挙動を決めるプロパティはjmeter.properties
に記載があります。
例えば、反映したいプロパティを設定したファイルを指定するプロパティuser.properties
もこのファイルに記載があります。
$ grep -B3 '^user.properties' /opt/homebrew/Cellar/jmeter/5.5/libexec/bin/jmeter.properties # Should JMeter automatically load additional JMeter properties? # File name to look for (comment to disable) user.properties=user.properties
設定の読まれる順序
ざっと言ってしまえば、以下のような流れになります。
- JMeterのプロパティファイル (
--propfile
で明示的に指定しない場合は$JMETER_HOME/jmeter.properties
)が読み込まれる- ここで
user.properties
、system.properties
プロパティが読み込まれる。初期値は、いずれもプロパティ名と同名のファイルです。
- ここで
user.properties
に指定されたファイルが読み込まれるsystem.properties
に指定されたファイルが読み込まれる- コマンドラインオプションで指定されたプロパティが読み込まれる
ディレクトリの考え方
JMeterは環境変数JMETER_HOME
でそのインストールディレクトリを認識します。未指定の場合、jmeter
あるいはjmeter.bat
のディレクトリがJMETER_HOME
として設定されます。
このJMETER_HOME
を起点として、意識する必要があるのは以下の2つのディレクトリでしょう。
$JMETER_HOME/lib
$JMETER_HOME/lib/ext
前者にはJMeterのコアライブラリが配置され、後者にはJMeter用の拡張機能を配置します。
JMeterはプラグイン機構を持っており、様々な3rd. Party製のプラグインがネット上で配布されています。
このプラグイン(実体は.jarファイル)自体は$JMETER_HOME/lib/ext
へ配置することになるでしょう。
なお、JMeter Plugins :: JMeter-Plugins.orgではJMeter Plugin Managerも配布され、自前でjarファイルを配置していく作業をなくすことも可能です。 実際のところ、JMeter Plugin ManagerはデフォルトでJMeterにインストールされており、すぐ利用が可能です。便利ですね。
チームでJMeterを利用するときにプロパティファイルをどう配布するべきか
JMeterをチームで利用するにあたって難しそうだなと感じたのは、JMeterの設定(プロパティファイル)をどのようにチームで共有すべきかでした。
user.properties
周りはJMETER_HOME
から読み込まれます。また、JMETER_HOME
はJMeterのインストールディレクトリです。したがって、user.properties
をチームで共有する場合は以下の手間が発生します。
- リポジトリで
user.properties
を管理 - メンバーにチェックアウトしてもらい、
JMETER_HOME
に配置してもらう
また、メンバーがJMETER_HOME
配下のuser.properties
を変更したい場合、それをリポジトリにPUSHするのも面倒です。
この課題に対しては、-q
(-addprop
)オプションを利用するのが良さそうです。
このオプションを利用すると、jmeter.properties
を読み込みつつ「追加のプロパティファイル」を読み込むことができます。チームで利用するuser.properties
はリポジトリで管理し、メンバーはそれをチェックアウト。そしてJMeterを立ち上げる際に-q
オプションでそのファイルを指定、という流れで運用は回りそうです。
- abでも可能でしょうが、abがテストシナリオに課す制約はかなり大きいと思われます。↩