【问题标题】:How to use different variables for every thread with a JSR223 PreProcessor-script (groovy)如何使用 JSR223 PreProcessor-script (groovy) 为每个线程使用不同的变量
【发布时间】:2019-08-20 18:31:56
【问题描述】:

我有这个 jmeter 文件,它在多个端点上进行多次调用(这是一个回归测试)。对于每个端点,都有相同的 JSR223 PreProcessor 脚本来生成 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());
    }

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

【问题讨论】:

    标签: multithreading groovy jmeter jwt jsr223


    【解决方案1】:

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

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

    • 用户定义的变量元素允许您定义一组初始变量,就像在测试计划中一样。

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

    • 有关在测试运行期间定义变量,请参阅用户参数。 UDV 按照它们在计划中出现的顺序从上到下进行处理。

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

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

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

    【讨论】:

    • 我已将“用户定义的变量”部分更改为“用户参数”部分,并且可以正常工作。非常感谢!
    【解决方案2】:

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

    Sharing Mode = All Threads
    

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

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

    在 Sampler 中传递该值

    每个线程都会从 CSV 中挑选唯一值并对其进行处理。

    【讨论】:

    • 脚本不使用 CSV 数据集配置元素。它从“用户定义的变量”元素中检索数据。对于每个线程,该元素都已到位并包含不同的值。
    • 在共享代码中,您已指定: // 从 'CSV Data Set Config' 元素中获取变量 String sharedSecret = vars.get("sharedSecret"); ....
    • 你是对的,那是我的错误,我从另一个脚本中复制了那部分。我已经更改了帖子,因此它与实际脚本对应
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多