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

时间:2019-08-20 07:20:47

标签: multithreading groovy jmeter jwt jsr223

我有这个jmeter文件,它在多个端点上进行多次调用(这是回归测试)。对于每个端点,都有相同的JSR223预处理器脚本生成JWT。通过在“用户定义的变量”中设置的变量(每个线程一个)创建JWT(每个线程一个变量),并使用vars.get()将其导入脚本中。

在运行时,脚本不会按线程(或按循环)更新变量。如果脚本运行两次,则运行1的最后一个线程中的脚本正在运行2的第一个线程中使用。

我想它必须在缓存中做些什么,但我不知道该怎么办。

我尝试检查但未选中复选框:“缓存编译的脚本(如果可用)”。

// 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());
    }

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

2 个答案:

答案 0 :(得分:0)

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

Sharing Mode = All Threads

enter image description here

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

enter image description here

在JSR223预处理器中使用vars.get() and vars.put

使用变量

enter image description here

在采样器中传递该值

enter image description here

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

答案 1 :(得分:0)

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

User Defined Variables文档中的几个相关引号:

  
      
  • “用户定义的变量”元素使您可以定义一组初始变量,就像在“测试计划”中一样。

  •   
  • 请注意,测试计划中的所有UDV元素(无论它们在哪里)都将在开始时进行处理。

  •   
  • 有关在测试运行期间定义变量的信息,请参见用户参数。 UDV按从上到下的顺序在计划中显示。

  •   
  • 为简单起见,建议将UDV仅放置在线程组的开头(或可能在测试计划本身的下面)。

  •   

因此,我的期望是将您的多个“用户定义的变量”实例合并为一个,并且您的Groovy脚本使用的是底部“用户定义的变量”配置元素中定义的值。您可以使用Debug Sampler and View Results Tree listener combination仔细检查变量值。

要为每个用户提供不同的初始变量,请去User Parameters,因为用户定义变量设置了“全局”变量集,该变量集在不同线程甚至Thread Groups之间共享。