背景
简单的说,就是一哥们离职,我来救火的,几乎0交接,你懂的。
要求
大家都知道,做压测之前我们必须要熟悉压测的接口,奈何遇到紧急救火的情况,你还想了解接口?门儿都没有,上来就直接跟我说,对对对,就这个接口,我们要做压测。什么基本信息都没有,就只知道要压测的接口,得,先抓个包看看。理一下他们所说的逻辑,从生产上抓包拿下来反参的数据,进行该接口的入参,是的,你没看错,就是要拿生产环境一个接口的反参作为要压测的入参,我的表情从一脸懵逼到一丝丝震惊再到一丢丢不安,只用了不到3秒,是的,我此刻的表情足以纳入北影教材。
以下是抓的包: ps:出于公司网络安全考虑,我仅展示我需要讲的参数。实际足有60多个参数
{
"data":
[
{
......
"xxxxxName": "",
"xxxxxMessage": "",
"xxxxxInfo": "",
"xxxxxClass": "",
"mobileNo": "",
......
"sendTime": "",
"eventTime": "",
"initTime": ""
......
}
]
}
为方便表达,xxxxName下面统一为 name ; xxxxxMessage 统一为message; xxxxxinfo统一为info; xxxxxClass 统一为class
业务:
会议评审的时候,开发人员告诉我,只需要改一个info值,好,我要资源,开发让运维从生产上给了我一个csv文件里面有info值,name值,message值,嗯?不是只需要改一个info值吗?我试了试每次只变化info值,发现报错。接着再去找开发,开发竟然跟我说,每次都要替换name,class,message,info,而且要数据要对应起来,没错 还要一一对应。我看了看手里的文件,是不是少了啥,对,class呢?不用传吗?好,传个空值 试一下,报错不行。找开发,撇了一眼,要传class,值呢?谁给我,回复我说是截取info参数里面第一行的某一段。纳尼??慢着,就是说info里面的一段信息是class的参数值?很好,这里我很想插一个表情,但是我忍住了。下面就直接介绍一下我的方案:
首先:
最先想到的当然是jmeter做csv参数化,提供的是csv文件,但是大家一定要知道,jmeter做标准的csv文件引用,一定是txt格式,然后每行为所有的参数,每两个参数中间用英文逗号[,]隔开,先将info字段、name字段、message字段做参数化变量,再把class入参也做变量,取info变量的第n到第m范围。方案虽然不完美,但是大家都知道,压测只需要验证响应时间、处理事务能力符合预期就可以了,不太关心灌的数据是否准确,验证数据准确性的测试在功能测试或接口测试的时候,就已经完成了。我只需要保证接口能正确传进去,验证后端服务的能力就可以了。所以我用了jmeter的截取函数:
"xxxxxClass": "${__substring(${xxxxxinfo},5,10,)}"
__substring后跟参数,首先跟一个变量,这个变量必须是在其他字段做好的变量参数,再后跟要截取的值,从0到n,那么5,10意思就是取第6到第11字符。具体大家可以自行调试一下。
自此第一个脱离第一个坑,且解决了4个key值的参数化。
其次:
再后面,就是时间字段。三个时间字段,我一开始大意了,全部取当前时间戳毫秒级。没错就是用的时间函数取当前时间戳的毫秒级,${__time(,)}
这个时候接口还是会报错,实在受不了开发的态度,仔细看了一下生产环境的入参,发现时间应该也是有逻辑的,仔细看了一下,也想了一下,应该是 inittime —> eventtime —> sendtime,好自此踩的第二个坑,使用longSum函数完美解决:
"sendTime": "${__time(,)}",
"eventTime": "${__longSum(${__time()},-30,)}",
"initTime": "${__longSum(${__time()},-20,)}"
再次:
没错,还有再次,没想到,竟然还有再次!!
info里面竟然有$
符,西巴,Ctrl + A 替换:$
符号替换成空格。 不影响压测结果,直接替换。自此才算是把脚本跑起来了。
结论
真难啊,这就是不熟悉接口,又没有接口文档,开发也不熟悉接口的压测。这就是没有接口测试就直接压测的结果,费了大量的人力。辗转腾挪,我只能说 难以推动。可能大家觉得没啥,不就是两个函数搞定的事情吗,如果不是亲身经历很难想象其中的艰辛。没有接口文档的情况下,不要轻易答应做接口测试;完全不熟悉的接口,不要轻易答应做压测;除非你看到他们的入参只有两三个,像我上面的六十多个入参的大接口,只能吐血挨个排查。