【问题标题】:JSF ViewState errors using JMeter使用 JMeter 的 JSF ViewState 错误
【发布时间】:2017-09-21 13:53:16
【问题描述】:

使用JMeter 我需要提取JSF 视图状态值。我能够提取价值。

下面是视图状态表单响应:

   <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="j_id4" />

我的正则表达式提取器如下:

<input\s+type="hidden"\s+name="javax\.faces\.ViewState"\s+id="javax\.faces\.ViewState"\s+value="([^"]+)".*/>

这很好用。我得到了正确的j_id4 值和位置。

但我的大问题是每个 API 调用的值都会发生变化。第一个 API 调用视图状态值为j_id4,但下一个 API 调用视图状态将为j_id5

我该如何处理?

【问题讨论】:

  • 你能分享响应和正则表达式提取器,JSF视图状态值是否通过所有api调用继续递增1?

标签: jsf jmeter performance-testing viewstate


【解决方案1】:
  1. Parsing HTML with Regular Expressions is not the best idea,我建议改用CSS/JQuery Extractor,相关配置如下:

    • 参考名称:任何有意义的名称,即viewstate
    • CSS/JQuery 表达式:input[name=javax.faces.ViewState]
    • 属性:value
  2. 如果您的测试假设有 2 个(或更多)HTTP Request 采样器,您将需要对 每个 应用 CSS/JQuery 提取器,因为 ViewState 会在每次调用时发生变化,因此您将每次都需要提取。或者,您可以将 CSS/JQuery 提取器与 HTTP 请求采样器放在同一级别,JMeter 的后处理器遵循Scoping Rules,因此单个提取器将应用于其范围内的所有采样器。比如:

【讨论】:

    【解决方案2】:

    您可以添加2个正则表达式提取器,一个将提取j_id,表达式如下:

    • 正则表达式:value="(.*?)\d"

    第二个将提取数字4,表达式如下:

    • 正则表达式:value=".+(\d)"

    现在使用以下代码为您的每个 API 添加一个 beanshell 后处理器:

    String j_id = vars.get("j_id");// j_id is the reference name of the first regular expression extractor
    int num = Integer.parseInt(vars.get("num"));// num is the reference name for the second regular expression extractor
    num = num + 1;
    vars.put("num",String.valueOf(num));
    vars.put("JSF", j_id + num);
    

    对于第一个 API,您可以使用您正在使用的相同正则表达式,在将上述 beanshell 后处理器添加到您需要从中提取 JSF 视图状态值的所有 API 之后,使用 ${JSf} 这将保持第二个 API 的值为 j_id5,第三个 API 的值为 j_id6,依此类推。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多