在 JMeter 中比较跨线程提取的变量

Compare extracted variable across threads in JMeter

我的目标是从我的线程组中的每个线程 POST 到一些 URL,这将在某处创建一个资产。如果一切顺利,第一个请求将创建资产,随后的请求将看到资产已经创建(或正在创建),并将重复使用相同的资产。

测试计划:

我的问题:

我不知道如何做的是最后一步 - 验证从每个线程提取的值是否相同。如何在 JMeter 中完成此操作?

我想你可以使用响应断言。

  • 测试计划:
    • 创建 N 个线程
    • HTTP 请求 - POST 一些 URL
  • 使用 Response Assertion 验证每个请求在响应中是否具有相同的字符串

当您将此断言置于测试计划级别时,它适用于所有线程。

为了达到您的要求,我们需要在所有线程之间共享该值。

属性:

我们可以使用属性来共享一个值。假设创建了一个道具 'shared',默认值为空白“”。在 beanshell assertion 中添加以下代码。如果它是空白的,那么一个线程将添加从正则表达式中提取的值。所有其他线程只会比较该值,如果不匹配,它将失败。

if(props.get("shared")==""){
    props.put("shared") = "extracted";
}else{
    if(!props.get("shared").equals("extracted")){
        Failure = true; 
    }
}

Bsh.shared:

我们可以使用 bsh.shared 共享命名空间在线程之间共享值并比较所有线程是否具有相同的值。

1.setup threadgroup 将包含这样的 beanshell 代码来创建哈希集。

import java.util.*;

if (bsh.shared.hashSet == void){
    bsh.shared.hashSet=new HashSet();
}
bsh.shared.hashSet.clear();

2.The 常规线程组将包含用于提取值的代码。提取值后,将其添加到仅存储唯一值的哈希集中。任何重复值都将被忽略。

bsh.shared.hashSet.add("value extracted");

3.teardown threadgroup will group 将检查 hashset 的大小。如果大小大于 1,则失败。

log.info(String.valueOf(bsh.shared.hashSet.size()));