如何使用 JSR223 预处理器脚本为每个线程使用不同的变量 (groovy)

How to use different variables for every thread with a JSR223 PreProcessor-script (groovy)

我有这个 jmeter 文件,它在多个端点上进行多次调用(这是一个回归测试)。对于每个端点,都有生成 JWT 的相同 JSR223 预处理器脚本。 JWT 是使用变量(每个线程不同)创建的,这些变量在 'User defined variables'(也是每个线程一个)中设置并使用 vars.get().

导入到脚本中

在 运行 时间脚本不更新每个线程(或每个循环)的变量。如果脚本 运行s 是 运行 1 中最后一个线程的脚本的两倍,则在 运行 2.

中的第一个线程中使用

我想它必须对缓存做些什么,但我不知道是什么。

我试过勾选和不勾选复选框:'Cache compiled script if available'。

// get values from 'User defined variables'
String sharedSecret = vars.get("sharedSecret");
String uitgifteDatumTijdOffset = vars.get("uitgifteDatumTijdOffset");
String uitgifteDatumTijd = Instant.now().minusMillis(Long.parseLong(uitgifteDatumTijdOffset)).toString();
String kvkNummer = vars.get("kvkNummer");
String ean13Code = vars.get("ean13Code");
String cnCertificaat = "Test met uitgiftedatum: " + uitgifteDatumTijd + " en EAN13-code: " + ean13Code;

// construct your body data - JSON entity in case below
JsonObject jo = new JsonObject();

jo.addProperty("KvKNummer", kvkNummer);
jo.addProperty("EAN13-code", ean13Code);
jo.addProperty("UitgifteDatumTijd", uitgifteDatumTijd);
jo.addProperty("CN-Certificaat", cnCertificaat);

String jsonString = jo.toString();

// perform JWT-signing of body data
byte[] bytesEncoded = Base64.encodeBase64(sharedSecret.getBytes());
String secret = new String(bytesEncoded);

try {

    String jwtToken = Jwts.builder()
    .setHeaderParam("alg","HS512")
    .setHeaderParam("typ","JWT")
    .setPayload(jsonString)
         .signWith(SignatureAlgorithm.HS512, secret) // base64EncodedSecretKey
         .compact();

    // put JWT-signed body data into variable
    vars.put("jwtToken", "Bearer " + jwtToken);

    } catch (Exception ex) {
        prev.setSuccessful(false);
        log.error(ex.getMessage());
        System.err.println(ex.getMessage());
    }

我希望这个脚本为每个线程使用不同的变量。但现在它正在复制最后一个值。

在 CSV 数据集配置中保留以下设置

Sharing Mode = All Threads

现在,如果您 运行 有 5 个线程,请确保您在 CSV 中有 5 个条目。

使用 JSR223 预处理器中的变量使用 vars.get() and vars.put

在采样器中传递该值

每个线程将从 CSV 中选取唯一值并进行处理。

脚本生成相同的 JWT 令牌值,因为您向它提供了相同的输入变量。

User Defined Variables 文档中的一些相关引用:

  • The User Defined Variables element lets you define an initial set of variables, just as in the Test Plan.

  • Note that all the UDV elements in a test plan - no matter where they are - are processed at the start.

  • For defining variables during a test run, see User Parameters. UDVs are processed in the order they appear in the Plan, from top to bottom.

  • For simplicity, it is suggested that UDVs are placed only at the start of a Thread Group (or perhaps under the Test Plan itself).

所以我的期望是您的多个用户定义变量实例被合并为一个,并且您的 Groovy 脚本正在使用底部用户定义变量配置元素中定义的值。您可以使用 Debug Sampler and View Results Tree listener combination.

仔细检查变量值

要为每个用户提供不同的初始变量,请选择 User Parameters instead as User Defined Variables set up the "global" set of variables which is shared across different threads and even Thread Groups