JMeterで独自サンプラーを作る


背景

JmeterでGMailに来ているURLを手当たり次第踏んでいく。というツールを作成中の事。
MailReaderSamplerの挙動がよくわからない・・・・
imapはリファレンス通りやってもつながらない。
pop3は繋がる。でも本文どうやって抽出するんだ?みたいなことに。
具体的には、

こんな感じでネストしていて、この本文を後処理の正規表現抽出とかで取る方法がわからない
(最下層の1個目のリザルトにフォーカスを合わす方法がわからない)

結局、昔サンプラーを自作したことがあるので、サンプラー自作しよ。
ということに。

サンプラー自作方法もかなり忘れてたのでどうせなら記事に。

バージョン

apache-jmeter : 5.2.1
JRE : 1.8

サンプラーのコード

DemoSampler.java
package jmeter.extend.sampler;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

public class DemoSampler extends AbstractJavaSamplerClient {

    // パラメータのキーを定義
    private static final String MAIL_ADDRESS = "mailAddress";
    private static final String PASSWORD = "password";

    /* (non-Javadoc)
     * デフォルトのパラメータを設定する
     */
    @Override
    public Arguments getDefaultParameters() {
        // デフォルトパラメータの設定
        Arguments defaultParameters = new Arguments();
        defaultParameters.addArgument(MAIL_ADDRESS, "[email protected]");
        defaultParameters.addArgument(PASSWORD, "input your password");
        return defaultParameters;
    }

    @Override
    public SampleResult runTest(JavaSamplerContext context) {
        SampleResult result = new SampleResult();
        try {
            // JMeterで入力されたパラメーターをもらう
            String mail = context.getParameter(MAIL_ADDRESS);
            String password = context.getParameter(PASSWORD);

            // 時間計測開始(1)
            result.sampleStart();

            // 計測したい任意の処理
            Thread.sleep(500);

            StringBuilder bulder = new StringBuilder();
            bulder.append("this is ResponseData\n");
            bulder.append("mail : ").append(mail).append("\n");
            bulder.append("password : ").append(password).append("\n");
            bulder.append("日本語文字列文字列\n");
            bulder.append("URL : https://github.com/");

            // 時間計測終了(2)
            // (2) - (1) の時間がJMeterのレスポンスタイムとして取得できる
            result.sampleEnd();

            // JMeterの取得結果を成功にする
            result.setSuccessful(true);
            // JMeterのレスポンスコードをOK(200)に設定する
            result.setResponseCodeOK();
            result.setRequestHeaders("this is RequestHeaders");
            result.setResponseData(bulder.toString(), "utf-8");

            //こいつはどこにも出ないっぽい
            result.setResponseMessage("this is ResponseMessage");

        } catch (Exception e) {
            // 時間計測終了(2)
            // (2) - (1) の時間がJMeterのレスポンスタイムとして取得できる
            result.sampleEnd();
            // JMeterの取得結果を失敗にする
            result.setSuccessful(false);
            // JMeterのレスポンスコードをOK(200)以外の数字に設定する
            result.setResponseCode("500");
            // JMeterで表示されるレスポンスデータの中身を詰める
            result.setResponseMessage("Error!! " + e.getMessage());
        }
        return result;
    }
}

必要なライブラリはjmeterのbin以下に全部あります。

JMeterへのimport

上記のパッケージをEclipseのexport機能などでjarにして
jmeterのlibs/ext配下に配置してjmeterを再起動するだけ。
コード内でjmeterlibに最初からあるjar以外のjarに依存している場合は、
そのjarも同一フォルダに配置します。

実行イメージ

Javaリクエストを使います。
クラス名のリストにAbstractJavaSamplerClientを継承したクラスが羅列されます

result.setResponseDataに指定した文字がResponseBodyに表示されます

参考

https://qiita.com/kiida/items/6af3e46e5bae14c38242
参考というかほぼ丸パクリです。すみません。

追伸

MailReaderSamplerから普通に取れるよ!という方いらっしゃいましたらぜひ教えて下さい。