JMeter-如果Controller对某些字符串不起作用包含条件?

时间:2018-08-06 06:36:36

标签: jmeter performance-testing load-testing jmeter-3.2 blazemeter

背景
我有一个API,它返回的响应如下:

{
  "status": 1,
  "errorCode": null,
  "message": null,
  "data": [
    {
      "id": 33,
      "snapshotId": 2,
      "ceId": 29,
      "month": "Feb",
      "corpRcvPayAmt": 100000,
      "wthRcvPayAmt": -90000
    },
    {
      "id": 31,
      "snapshotId": 2,
      "ceId": 29,
      "month": "Jan",
      "corpRcvPayAmt": 0,
      "wthRcvPayAmt": 0
    }
  ]
}

data节点的大小可以从0到12(每月从空到1)不等。 data的唯一常量字段是"month"节点。其他字段值正在更改。

目标:
我想执行PUTPOST请求,这取决于data中是否已经存在特定月份。

为此,我使用正则表达式提取器将整个data字段捕获到一个变量中,如下所示: enter image description here

在上面的示例响应中,致电${data}会给我{"id":33,"snapshotId":2,"ceId":29,"month":"Feb","corpRcvPayAmt":100000.00,"wthRcvPayAmt":-90000.00},{"id":31,"snapshotId":2,"ceId":29,"month":"Jan","corpRcvPayAmt":0.00,"wthRcvPayAmt":0.00}

现在使用此字段,我只想执行一个简单的if条件,例如:如果${data}包含${month},请执行某些操作(PUT请求)。我目前正在尝试这样做:

enter image description here

问题:
条件${__groovy("${data}".contains("Jan"))}似乎不起作用。 我已经尝试执行以下操作:

  • 将条件更改为${__groovy("${month}".contains("Jan"))}只是为了查看语法是否正确。这样很好。  
  • 使用条件${__groovy("${month}".contains("Jan"))}在if控制器内添加调试采样器以打印${data}。这也会按预期打印数据。enter image description here  
  • 我还尝试过将各种js语法用于if条件,但到目前为止,groovy是令人满意的最佳结果。

    以此我可以确认以下内容:  

  • ${month}${data}被正确提取并存储  
  • 字符串包含的常规语法正常运行  
  • 由于某种原因,条件${__groovy("${data}".contains("Jan"))}不起作用。

    我在这里想念什么?预先感谢。

  • 1 个答案:

    答案 0 :(得分:2)

    在Groovy脚本中不要将JMeter Functions and/or Variables引用为:

    1. 可能与GString Template
    2. 发生冲突
    3. 对于JSR223 Test Elements,它会导致编译缓存功能发生故障,从而降低性能
    4. 您的变量可能只是分解为会导致Groovy脚本编译失败和/或故障的内容。您可以检查 jmeter.log 文件中的实际错误详细信息。

    因此,${data}不是JMeterVariables类实例的简写,而不是使用vars.get("data")来代替vars,这是从中获取JMeter Variable值的最佳方法Groovy脚本。

    整个功能应如下所示:

    ${__groovy(vars.get('data').contains("Jan"),)}
    

    还要注意,最好使用JSON Extractor从JSON响应中获取值。