何百人ものユーザーでサイトのさまざまなリンクをテストし (ログインする必要はありません)、JMeter を使用して何度かループする必要があります。テストするすべてのリンクがファイルから読み取られるように、これらのリンクを「CSVファイル」に入れたいと思います。
このタスクを達成するにはどうすればよいですか?
何百人ものユーザーでサイトのさまざまなリンクをテストし (ログインする必要はありません)、JMeter を使用して何度かループする必要があります。テストするすべてのリンクがファイルから読み取られるように、これらのリンクを「CSVファイル」に入れたいと思います。
このタスクを達成するにはどうすればよいですか?
test-params のリストを含む csv ファイルの種類を準備し、それを使用して、少なくとも以下を使用してテストサンプラーをパラメーター化します。
詳細については、次のリンクを参照してください。
JmeterでGETパラメータにCSVデータを使用するにはどうすればよいですか?
jmeter を使用して複数の Web サイトをテストするjmeter の
httprequest パスで csv パラメータを
使用する CSV Data Set Config を使用する場合、スレッドが同じ入力行を使用するように強制する
Jmeter 機能:
jmeter-plugins のCSVサンプラーからの変数。
1.テスト URL を csv ファイルで準備します。たとえば、次の形式で行います。
url1
url2
...
urlN
http://
テスト URL にプレフィックスが含まれていないことを確認します( HTTP 要求パラメーター-> サーバーに従って)。
2.以下のようにスクリプトにスキーマを使用します。
CSV Data Set Config:
Filename: [path to your csv-file with test-urls]
Variable Names: testURL
Recycle on EOF?: True
Stop thread on EOF?: False
Sharing mode: Current thread
Thread Group:
Number of Threads: N
Loop Count: M
HTTP Request // your http call
Server Name or IP: ${testURL} // use variable with extracted URL
これにより N 人のユーザーが開始され、各ユーザーは test-url のリストから M エントリを読み取ります。M > テスト URL のリストのエントリ数の場合、ユーザーは EOF でリストをリサイクルします。
コメントの 1 つで、ループごとに CSV を複数回読み取ることはできないと述べられています。複数のスレッドを使用して、それぞれが CSV ファイルを 1 回読み取ることができますが、ファイルは閉じられ、次のループでは読み取られません。また、CSV をリサイクルするように設定すると、CSV ファイルは無期限に何度も読み込まれます。問題は、CSV ファイルを無期限ではなく、特定の回数だけループさせるにはどうすればよいかということです。
それに対する回答を別の投稿 ( https://stackoverflow.com/a/64086009/4832515 ) に投稿しましたが、将来そのリンクが機能しない場合に備えて、コピーして貼り付けます。
これに対する簡単な解決策が見つかりませんでした。最終的には、Beanshell スクリプトを使用することになりました。これにより、Java に非常によく似たコードを使用してカスタム処理を行うことができます。これを行う方法を示すために、JMeter プロジェクトの例を作成しました (はい、CSV の読み取りを繰り返すことだけを考えると、非常に複雑です)。
私のファイル構造:
JMeterExample
|
⊢--JMeterTests.jmx // the JMeter file
⊢--example.csv // the CSV file
私のCSVの内容:
guest-id-1,"123 fake street",
guest-id-2,"456 fake street",
guest-id-3,"789 fake street",
したがって、このスレッド グループでは、ユーザーを 1 人だけにして、2 回ループします。CSV 1 行につき 1 つのリクエストを送信する予定です。したがって、合計 6 つのリクエストが送信されるはずです。
これは一種のオプションですが、ファイルパスは変更される可能性があり、構成を変更するためだけにスクリプトを変更するのは好きではありません。そのため、CSV ファイル名を「ユーザー定義変数」ノードに保存します。
CSV ファイルを JMeter テストと同じディレクトリに保存する場合は、ファイル名のみを指定できます。
JMeter ファイルを含むディレクトリ以外のフォルダに CSV を保存する場合は、絶対パスを指定してから、以下の beanshell スクリプトを少し変更する必要があります。ファイルを相対的にロードする行をコメント アウトする必要があります。 、および絶対パスからロードする行でコメントします。
基本的にパスを取り、各行を解析して変数として保存する Beanshell Sampler を追加します。最初の行は という変数として保存されcsv_line_0
、2 行目はというように保存されcsv_line_1
ます。私はそれがきれいな解決策ではないことを知っていますが...このきれいで簡単なタスクを実行するきれいで簡単な方法が見つかりません。以下のコードをコピーして貼り付けました。
import org.apache.jmeter.services.FileServer;
import java.text.*;
import java.io.*;
import java.util.*;
String temp = null;
ArrayList lines = new ArrayList();
BufferedReader bufRdr;
ArrayList strList = new ArrayList();
// get the file
try {
// you can use this line below if your csvFilePath is an absolute path
// File file = new File(${csvFilePath});
// you can use this line below if your csvFilepath is a relative path, relative to where you saved this JMeter file
File file = new File(org.apache.jmeter.services.FileServer.getFileServer().getBaseDir() + "/" + ${csvFilePath});
if (!file.exists()) {
throw new Exception ("ERROR: file " + filename + " not found");
}
bufRdr = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF8"));
} catch(Exception e){
log.error("failed to load file");
log.error(e.getMessage());
return;
}
// For each CSV line, save it to a variable
int counter = 0;
while(true){
try{
temp = bufRdr.readLine();
if(temp == null || temp.equals("<EOF>")){
break;
}
lines.add(temp);
vars.put("csv_line_" + String.valueOf(counter), temp);
counter++;
} catch(Exception e){
log.error("failed to get next line");
log.error(e.getMessage());
break;
}
}
// store the number of CSV lines there are for the loop counter
vars.put("linesCount", String.valueOf(lines.size()));
CSV 行ごとに 1 回ループするループ コントローラーを追加します。${linesCount}
は CSV 行数のカウントであり、上記の beanShell スクリプトから計算されます。
このスクリプトは、CSV 行ごとに 1 回実行されます。現在の行を取得して、そこにあるデータを解析します。必要なデータを取得するには、このスクリプトを変更する必要があります。私の例では、列 1 が「guestId」、列 2 が「住所」の 2 つの列しかありませんでした。
__jm__loopController__idx
は、JMeter が定義する変数であり、ループ コントローラのインデックスです。変数名は__jm__{loop controller name}__idx
.
String index = vars.get("__jm__loopController__idx");
String line = vars.get("csv_line_" + index);
String [] tokens = line.split(",");
vars.put("guestId", tokens[0]);
vars.put("address", tokens[1]);
抽出されたデータを使用する HTTP 要求を次に示します。
これを実行すると、必要に応じて、定義したエンドポイントに 6 つの http 要求を送信することになります。