使用JMeter的JSF ViewState错误

时间:2017-09-21 13:53:17

标签: jsf jmeter performance-testing viewstate

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

以下是viewstate表格回复:

   <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

我该如何处理?

2 个答案:

答案 0 :(得分: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. 如果您的测试假设有两个(或更多)HTTP Request个采样器,您需要将CSS / JQuery Extractor应用于每个,因为ViewState将更改每次通话,因此您每次都需要提取它。或者,您可以将CSS / JQuery Extractor放在与HTTP Request采样器相同的级别,JMeter的后处理器正在服从Scoping Rules,因此单个Extractor将应用于其范围内的所有采样器。类似的东西:

    JMeter CSS JQuery Extractor

答案 1 :(得分:0)

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

  • 正则表达式: value =&#34;(。*?)\ d&#34;

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

  • 正则表达式: value =&#34;。+(\ d)&#34;

现在使用以下代码为每个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 ,依此类推。