7.创建三个监听器,可以从三个不同的层面来观察响应结果
执行一下测试计划,我们来看看三个监听器所返回的结果是怎样的。
以上是表格方式查看响应结果的情况,可以看到通过表格可以查看某个范围内的响应时间和响应状态是否正常;
以上三幅截图则是来自树形监听器,树形监听器在几种监听器中应该是最细致的,可以查看响应状态、时间、以及执行的SQL语句,乃至返回的结果均能进行验证。
至于上面的图形监听器,可以宏观的观察SQL语句在压力测试下响应的平滑度,并且有一定的统计信息,能够观察平均响应时间等。
现在我们来看另外一种方式编写我们的JDBC调用。就是使用JMeter提供的函数动态生成我们所需要不断变化的SQL语句部分。之所以需要这么做是为了方便我们观察执行的SQL语句内容。
在前面使用预编译的方式,传递动态参数的SQL语句执行的结果,大家已经看到过,在树形监听器中,我们观察到到执行过的SQL语句是:
FROM (SELECT tmp.*, ROWNUM rn
FROM (
select p.p_id, p.p_name, c.cmp_name
from test_product p, test_company c
where p.cmp_id = c.cmp_id
and contains(p.p_name, ?) > 0
--and (p.p_name like '%D%' or p.p_name like '%AIX%')
ORDER BY p.p_id desc
) tmp
WHERE 1 = 1 AND ROWNUM <= 100)
WHERE 1 = 1 AND rn >= 1
这样导致我们无法看出参数"?"当中表示的具体值是什么,这对我们在某些情况下确定SQL语句的性能是相当不利的。所以我们这里需要使用JMeter的动态函数特性。
我们创建第二个"JDBC Request"节点,而后禁用"产品名 全文关键字 JDBC Request",将新创建的"JDBC Request"重命名为"产品名 like JDBC Request",将其中的SQL语句改写为:
FROM (SELECT tmp.*, ROWNUM rn
FROM (
select p.p_id, p.p_name, c.cmp_name
from test_product p, test_company c
where p.cmp_id = c.cmp_id
AND ( ${__V(smt_${__Random(1,4,rnd)})} )
ORDER BY p.p_id desc
) tmp
WHERE 1 = 1 AND ROWNUM <= 100)
WHERE 1 = 1 AND rn >= 1
这里核心的部分就是代码行"AND ${__V(smt_${__Random(1,4,rnd)})} "。"${__Random(1,4,rnd)}"用来生成随机数,取值范围在1到4之间,而"__V(...)"函数帮助我们转义"smt_${__Random(1,4,rnd)}"生成的内容,很类似于JavaScript中的"eval"函数。
例如"${__Random(1,4,rnd)}"生成随机数为1,则"smt_${__Random(1,4,rnd)}"对应的内容为"smt_1","__V"将获取数组变量"smt"中的第一个元素,于是生成的SQL语句如下:
这里我们可以清楚的看到所执行的SQL语句。
后记
本例中我们使用了JMeter附带的函数"__split"和"__V","__Random"等等,文章对于这些函数的描述可能不够完整,亦可能不够准确,更多详尽的解释,大家可以参考JMeter官方文档。