JMeterを使用して抽出されたデータをファイルに書き込む
1. 概要
このチュートリアルでは、 Apache JMeter からデータを抽出し、それを外部ファイルに書き込む2つの方法を調べてみましょう。
2. 基本的なJMeterスクリプトの設定
それでは、基本的なJMeterスクリプトを作成することから始めましょう。 単一のスレッドでスレッドグループを作成しましょう(これはスレッドグループを作成するときのデフォルトです):
このスレッドグループ内で、HTTPサンプラーを作成しましょう。
設定しましょう HTTPサンプラーで実行されているAPIを呼び出す
@RestController
public class RetrieveUuidController {
@GetMapping("/api/uuid")
public Response uuid() {
return new Response(format("Test message... %s.", UUID.randomUUID()));
}
}
さらに、上記で参照したように、コントローラーから返されるResponseインスタンスも定義しましょう。
public class Response {
private Instant timestamp;
private UUID uuid;
private String message;
// getters, setters, and constructor omitted
}
これを使用して、JMeterスクリプトをテストしてみましょう。 デフォルトでは、これはポート8080で実行されます。 ポート8080を使用できない場合は、HTTPサンプラーのポート番号フィールドをに従って更新する必要があります。
HTTPサンプラーリクエストは次のようになります。
3. リスナーを使用して抽出された出力を書き込む
次に、タイプ応答をファイルに保存のリスナーを使用して、ファイルに必要なデータを抽出しましょう。
このリスナーの使用は便利ですが、ファイルに抽出できるものにあまり柔軟性がありません。 この場合、これにより、JMeterが現在実行されている場所に保存されるJSONファイルが生成されます(ただし、パスはファイル名プレフィックスフィールドで構成できます)。
4. PostProcessorを使用して抽出された出力を書き込む
データをファイルに抽出するもう1つの方法は、 BeanShell PostProcessorを作成することです。 BeanShellは非常に柔軟なスクリプトプロセッサであり、Javaコードを使用してスクリプトを記述したり、JMeterによって提供されるいくつかの組み込み変数を利用したりできます。
BeanShell は、さまざまなユースケースに使用できます。 この場合、 BeanShell ポストプロセッサを作成し、ファイルにデータを抽出するのに役立つスクリプトを追加しましょう。
次に、スクリプトセクションに次のスクリプトを追加しましょう。
FileWriter fWriter = new FileWriter("/<path>/result.txt", true);
BufferedWriter buff = new BufferedWriter(fWriter);
buff.write("data");
buff.close();
fWriter.close();
これで、文字列dataをresultというファイルに出力する簡単なスクリプトができました。 ここで注意すべき重要な点の1つは、FileWriterコンストラクターの2番目のパラメーターです。 BeanShellがファイルを上書きするのではなく追加するように、これをtrueに設定する必要があります。 これは、JMeterで複数のスレッドを使用する場合に非常に重要です。
次に、ユースケースにとってより意味のあるものを抽出したいと思います。 JMeterが提供するctx変数を利用してみましょう。 これにより、HTTPリクエストを実行しているシングルスレッドが保持するコンテキストにアクセスできるようになります。
ctx から、応答コード、応答ヘッダー、および応答本文を取得して、これらをファイルに抽出します。
buff.write("Response Code : " + ctx.getPreviousResult().getResponseCode());
buff.write(System.getProperty("line.separator"));
buff.write("Response Headers : " + ctx.getPreviousResult().getResponseHeaders());
buff.write(System.getProperty("line.separator"));
buff.write("Response Body : " + new String(ctx.getPreviousResult().getResponseData()));
特定のフィールドデータを収集してファイルに書き込みたい場合は、vars変数を利用できます。 これは、PostProcessorsで文字列データを保存および取得するために使用できるマップです。
このより複雑な例では、ファイルエクストラクタの前に別のPostProcessorを作成しましょう。 これにより、HTTPリクエストからのJSONレスポンスが検索されます。
このエクストラクタは、messageという変数を作成します。 あとは、ファイルエクストラクタでこの変数を参照して、ファイルに出力するだけです。
buff.write("More complex extraction : " + vars.get("message"));
注:このアプローチを「正規表現エクストラクタ」などの他のポストプロセッサと組み合わせて使用すると、よりオーダーメイドの方法で情報を収集できます。
5. 結論
このチュートリアルでは、BeanShellポストプロセッサーと書き込みリスナーを使用してJMeterから外部ファイルにデータを抽出する方法について説明しました。 使用したJMeterスクリプトとSpringRESTアプリケーションは、GitHubにあります。