Jmeter性能测试实战总结

  • 来龙去脉
  • 第一个坑-了解参数化
  • 第二个坑-搞定登录态校验
  • 第三个坑-第一行代码-BeanShell

来龙去脉

公司的项目最近频繁被用户抱怨,后台系统操作起来不流畅,卡顿。经过RD同学排查,发现是由于数据量庞大,大量的查表等操作由于sql的不完善导致了mysql慢查询,从而导致了后台看起来很卡。这次性能测试的目的,也就是检查一下在一定的压力下,对服务器的数据库进行持续性地请求,找出容易产生慢查询的sql进行相应的优化。

第一个坑-了解参数化

但凡说你用过Jmeter都免不了会被问的一个问题,啥是参数化?用jmeter跑起来一个脚本不难,按照网上的教程一搜一大把,2分钟就能运行起来一个。参数化,其实就是把那些原本写死的参数做成变量存起来就行了,这样维护起来只要改参数对应的值,所有引用到这个参数的地方就都跟着改了。这次的项目比较简单,用到参数化的地方并不多,比如这个服务器ip地址,就可以写成这样:在测试计划里的“用户定义的变量”中添加一个叫host的变量,值就是你的测试服务器ip,这样就可以用${host}这个参数放在所有的请求里了,如图所示:
在测试计划里添加自定义变量
在http请求中引用参数化变量
除了这种简单粗暴的用户自定义变量方法进行参数化以外,还有两种常见的参数化手段:通过函数助手生成参数化方法。比如生成个随机数,用来做翻页的随机数。
通过函数助手里自带的方法生成随机数
另外就是所谓的右键添加配置原件->CSV Data Set Config方法,把大量的参数实例存在一个csv里(txt也可以,注意编码格式要是utf-8且no dom的,比较坑,还是csv得了),比如userId,我从库里导出了几千个userId,一条一行这样存在csv里,然后配置的时候也要写清楚变量名和csv文件的存放地址,这样在jmeter运行时,每条线程都会按顺序读取表里的一个userId进入请求参数,如图
这个csv文件可以是这样
引入CSV Data来做参数化
通过CSV data set config引入的参数化实例
以上就是我在测试中对jmeter参数进行的尝试。接下遇到的是另一个常见的问题:登录态校验

第二个坑-搞定登录态校验

这里我没有用网上的方法去做跨线程参数传递什么的,因为我们的后台系统是通过cookie和session来校验合法性的,然后就发现·,一旦我的线程数大于20,就会出现大量的登录态失败摆错。经过和RD的沟通,才发现原来服务端做了最大session数量的限制。去掉了这个限制就可以实现大量的登录接口并发操作,不再需要像一般的接口设计那样,先登录拿到一个token,再把这个token带入到下一个接口的参数中去。这样的话就不必分线程组来执行测试,免去了写java脚本传参的麻烦。虽然不太“优雅”,但是对于代码能力不强的我来说,能用起来。
登录接口放在外面,显得稍微优雅一些

第一行java代码,不是helloworld

脚本写得差不多了,开始琢磨着把参数尽量写得灵活一点。比如有个查询接口,需要传当前日期参数——这个很好办,jmeter的函数助手里有现成的time方法,很容易就实现了。但是要实现返回当前日期xx天以前的日期时遇到了麻烦,我的Jmeter版本是3.1的,并没有timeshift这个方法,而测试环境又不能换更新的版本,于是乎只能自己来实现这个功能。网上抄了段代码,改了几个参数,放在BeanShell里,就这么成了:
自己实现返回当前日期前后x天的功能
第一次做正式的性能测试,结果还是很欣慰的,作为QA人员,我认为不在于用多华丽超前的技术实现了xx功能,而是在于用有限的资源和时间发现问题,对提高产品的质量做出贡献。下一步,我还会继续研究Jmeter的更多用法,努力提高自己的能力。

你可能感兴趣的:(测试之路)