我想设置一个 JMeter 测试计划来建议网站 (URL) 是否基于 Drupal(完全基于来自该站点的 HTTP 响应)并将其与我在环境中拥有的现有数据进行比较。(我意识到使用 HTTP 方法,而不是说检查站点的文件系统,是“不确定的”,但我很好奇这种方法有多有用)
JMeter 命令行可能如下所示:
JMeter -t "DrupalAssertions.jmx" -Jurl=http://my.dot.com -Jdrupal=true
我提供了要测试的 URL 和一个附加属性“drupal”,表明我对该站点是否基于 Drupal 的最佳猜测。
在我的测试计划中,我添加了一个 HTTP 请求以返回 URL 页面的 HTML 内容。然后我可以成功地添加一个响应断言来测试一个模式(比如(?i)(drupal)
一个可悲的缺少模式),看看它是否包含在响应中。
这一切都很好,或者正如预期的那样,但我想做的是在同一个响应断言中将“drupal”属性的值与该模式测试的结果进行比较。我知道我在这里遗漏了一些简单的东西,但我不知道该怎么做。
我想尝试使用这样的表达式:
(?i)(drupal) == ${__P(drupal)}
在一个模式中,但这不起作用。比较断言的名称看起来很有希望,但我不知道如何将该属性合并到比较中。
更新:PMD UBIK-INGENIERIE 建议的方法确实有效。我使用了这样的正则表达式提取器:
<RegexExtractor guiclass="RegexExtractorGui" testclass="RegexExtractor" testname="Extract Drupal in Response" enabled="true">
<stringProp name="RegexExtractor.useHeaders">false</stringProp>
<stringProp name="RegexExtractor.refname">drupalInResponse</stringProp>
<stringProp name="RegexExtractor.regex">(.*drupal.*)</stringProp>
<stringProp name="RegexExtractor.template">$0$</stringProp>
<stringProp name="RegexExtractor.default">__false__</stringProp>
<stringProp name="RegexExtractor.match_number">1</stringProp>
</RegexExtractor>
其次是这个 BeanShell 断言:
// Variable "drupalInResponse" is "__false__" by default
if ( !(vars.get("drupalInResponse").equals("__false__") ) ) {
vars.put("drupalInResponse","true");
}
else {
vars.put("drupalInResponse","false");
}
print("\n\nThe value of property 'drupal' is: " + props.get("drupal") + "\n");
print("\n\nThe value of variable 'drupalInResponse' is: " + vars.get("drupalInResponse") + "\n");
if (vars.get("drupalInResponse").equals( props.get("drupal") ) ) {
print("Site Drupalness is consistent with your beliefs");
}
else {
print("You're wrong about the site's Drupalness");
Failure = true;
FailureMessage = "Incorrect Drupal assumption";
}
在正则表达式提取器中,我设置了一个我认为与我感兴趣的模式不匹配的默认值,然后与 BeanShell 断言中的“drupal”属性进行了丑陋的 Java 比较。
希望以某种方式可以在单个组件中做出断言,而不是由两个部分组成,但是您不能与“工作”争论:)