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

# 背景
JmeterでGMailに来ているURLを手当たり次第踏んでいく。というツールを作成中の事。
MailReaderSamplerの挙動がよくわからない・・・・
imapはリファレンス通りやってもつながらない。
pop3は繋がる。でも本文どうやって抽出するんだ？みたいなことに。
具体的には、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/d4461010-90b9-7358-0348-5fa34830b30e.png)

こんな感じでネストしていて、この本文を後処理の正規表現抽出とかで取る方法がわからない
（最下層の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, "example@gmail.com");
		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も同一フォルダに配置します。


# 実行イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/e440953a-c59c-74df-ffe5-4a40fdd0c8c9.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238561/aae071fe-ed2a-e13f-e222-fe2ba4ca2007.png)

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

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

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