この記事は GRIPHONE Advent Calendar 2019 13日目の記事です。
こんにちは、サーバエンジニアの遠藤です。
早速ですが、リリース前には欠かせない負荷テストを行う為のツールといえば?そうJMeterですね!
という事で今回はJMのチップスをご紹介していきたいと思います。
※準備
実際に試す場合は”JMeter Plugins Manager”を入れておくと簡単に環境が作れ便利となります。
https://jmeter-plugins.org/install/Install/
Custom Thread Groups
まずはこれ!スレッドグループの拡張プラグインになります。
https://jmeter-plugins.org/wiki/ConcurrencyThreadGroup/
色々な負荷テストがありますが、なんでもかんでも負荷は対象サーバが倒れるまでAPI激打!という訳にはいきません。
そこで、負荷のかけ具合をコントロールする必要があるのですが、その時に便利なのがこのプラグインです。
例えばこんな条件
1人の滞在時間は10分・最初の1分で1000人流入・次の1分で500人流入・さらに次の1分で250人流入、、、
つまり、なだらかに流入数が減っていくと想定してみます。
既存のスレッドグループはこのようなカーブを描く負荷のかけ方は難しいのですが、プラグインに含まれる”Ultimate Thread Group”を使うと良い具合にかけることができます。
上記の通り、負荷の設定が可視化されるので、設定が間違っていないかの確認も合わせてできるのも良い所です。
他にも、例えば通常1000人程が利用するシステムだが、特定タイミングで10倍流入してくる状況を再現してみます。
スケールアウトするか?とかフェールセーフに倒れて動くか?といった挙動確認に使えそうですね。
Selenium
次はお馴染みのseleniumです。
負荷試験ではなくUIテストになりますが、組み合わせて使うことができます。
予め”Selenium/WebDriver Support”プラグイン、chromeの”webDriver”をダウンロードして入れておきます。
“Chrome Driver Config”と”WebDriver Sampler”を追加し、ConfigにはWebDriverのパスを設定します。
WebDriver Samplerの中身はこんな感じ。
WDS.sampleResult.sampleStart()
WDS.browser.get('https://www.google.com/')
java.lang.Thread.sleep(1000)
var pkg = JavaImporter(org.openqa.selenium)
var button = WDS.browser.findElement(pkg.By.id('hptl'))
button.click()
WDS.sampleResult.sampleEnd()
if(WDS.browser.getTitle() != '概要 - Google') {
WDS.sampleResult.setSuccessful(false)
WDS.sampleResult.setResponseMessage('unexpected title')
}
java.lang.Thread.sleep(1000)
※実行するとブラウザが自動で動きます
スクリプトによりボタンを押したり、要素の存在を確認したりできるが便利ですね。
JMと組み合わせる事により複雑なシナリオが作り安いのがメリットなのではないでしょうか。
Debug Sampler
サーバ開発とは何かと勝手の違うシナリオ開発ですが、もしどんな変数が定義されてるのか困った時にはDebug Samplerを使ってみましょう。
まず2つほど変数を追加します。
vars.put("foo", "1234567")
def map = ['name':'taro', 'age':23]
vars.putObject("baa",map)
実行してみます、、、一番下に先ほど追加した変数が出力されているのが確認できました。
Debug Samplerの設定を変える事で JMeter Properties, System Propertiesなども確認する事ができるので、例えば設定ファイルの読み込み状況や起動時オプションの確認にも使えるのではないでしょうか。
mylib的な共通スクリプトを作る
最後はメソッドをまとめて定義しJMの各スクリプトで共有したい!という場合の手軽な方法の紹介となります。
まず共通メソッドファイルであるmylib.groovyを作り、jmeter/scriptsフォルダを作成して保存します。
def add(arg1, arg2){
return arg1 * arg2
}
return this
すると、JMのJSR223Samplerからはこんな感じに読み込んで使う事ができるようになります。
def mylib = evaluate(new File("../scripts/mylib.groovy"))
mylib.add(10,10)
vars.putObject("mylib", mylib)
また、上記のようにputObjectで保存する事で、以後のJSR223SamplerではgetObjectで取り出して使う事ができます。
mylib = vars.getObject("mylib")
mylib.add(20,30)
このmylib.groovyスクリプトはダイナミックに読み込まれる為、
JM再起動なしで、書き換え<->再実行のサイクルができるのも手軽な点です。
あとがき
いかがでしたでしょうか、
負荷ツールは多々ありますが、負荷コントロールという点においてもJMは使いやすいですよね。
ただ、使い方など資料が見つかりにくかったり、とっつきにくいと感じる部分もあるので、そんな時の参考になれば幸いです。