13

何百人ものユーザーでサイトのさまざまなリンクをテストし (ログインする必要はありません)、JMeter を使用して何度かループする必要があります。テストするすべてのリンクがファイルから読み取られるように、これらのリンクを「CSVファイル」に入れたいと思います。

このタスクを達成するにはどうすればよいですか?

4

2 に答える 2

22

test-params のリストを含む csv ファイルの種類を準備し、それを使用して、少なくとも以下を使用してテストサンプラーをパラメーター化します。

  1. CSV データ セットの構成

    詳細については、次のリンクを参照してください。

    JmeterでGETパラメータにCSVデータを使用するにはどうすればよいですか?
    jmeter を使用して複数の Web サイトをテストするjmeter の
    httprequest パスで csv パラメータを
    使用する CSV Data Set Config を使用する場合、スレッドが同じ入力行を使用するように強制する

  2. Jmeter 機能:

  3. 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 でリストをリサイクルします。

于 2013-01-23T10:24:48.327 に答える
0

コメントの 1 つで、ループごとに CSV を複数回読み取ることはできないと述べられています。複数のスレッドを使用して、それぞれが CSV ファイルを 1 回読み取ることができますが、ファイルは閉じられ、次のループでは読み取られません。また、CSV をリサイクルするように設定すると、CSV ファイルは無期限に何度も読み込まれます。問題は、CSV ファイルを無期限ではなく、特定の回数だけループさせるにはどうすればよいかということです。

それに対する回答を別の投稿 ( https://stackoverflow.com/a/64086009/4832515 ) に投稿しましたが、将来そのリンクが機能しない場合に備えて、コピーして貼り付けます。


これに対する簡単な解決策が見つかりませんでした。最終的には、Beanshell スクリプトを使用することになりました。これにより、Java に非常によく似たコードを使用してカスタム処理を行うことができます。これを行う方法を示すために、JMeter プロジェクトの例を作成しました (はい、CSV の読み取りを繰り返すことだけを考えると、非常に複雑です)。


  1. ファイル:

私のファイル構造:

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 つのリクエストが送信されるはずです。

  1. スレッドグループ

ここに画像の説明を入力


  1. ユーザー定義変数

これは一種のオプションですが、ファイルパスは変更される可能性があり、構成を変更するためだけにスクリプトを変更するのは好きではありません。そのため、CSV ファイル名を「ユーザー定義変数」ノードに保存します。

CSV ファイルを JMeter テストと同じディレクトリに保存する場合は、ファイル名のみを指定できます。

JMeter ファイルを含むディレクトリ以外のフォルダに CSV を保存する場合は、絶対パスを指定してから、以下の beanshell スクリプトを少し変更する必要があります。ファイルを相対的にロードする行をコメント アウトする必要があります。 、および絶対パスからロードする行でコメントします。

ここに画像の説明を入力


  1. CSV 行を解析して保存する BeanShell Sampler

基本的にパスを取り、各行を解析して変数として保存する 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()));

  1. ループコントローラー

CSV 行ごとに 1 回ループするループ コントローラーを追加します。${linesCount}は CSV 行数のカウントであり、上記の beanShell スクリプトから計算されます。

ここに画像の説明を入力


  1. 現在の 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]);

  1. HTTP リクエスト サンプラー

抽出されたデータを使用する HTTP 要求を次に示します。

ここに画像の説明を入力


  1. 結果

これを実行すると、必要に応じて、定義したエンドポイントに 6 つの http 要求を送信することになります。

ここに画像の説明を入力

于 2020-09-27T16:51:01.120 に答える