测试开发水货 给你一个带用户参数的 Curl 命令,转成 Jmeter 脚本怎么搞?

我去催饭 · November 08, 2022 · 5327 hits

在上周的性能测试任务中,我遇到了一个问题,折腾了许久。问了一圈,最终解决了。记录一下,感谢耐心给予帮助的大佬们。

事情的起因是这样的:我在用 Jmeter 做压测时发现有一个接口的性能表现很奇怪,这是一个查询接口,tps 从第一分钟达到峰值后开始逐渐降低,同时 CPU 和内存的占用也逐步降低,始终达不到压测的水平。在排查了慢 sql,带宽等常规问题后,未果(这个问题先埋个坑,等我搞明白了再另行介绍)。研发给了我一个条 curl 语句,说你压一下这个接口试试吧,我一看这个命令,长这样:

curl --user abc:111111 -X GET http://192.166.123.456:8081/_search?query=Code=11000020211152B35

乍一看就是个普通的 get 请求么,只不过多了一个访问 ES 的用户名密码罢了,遂将它转入到 jmeter 里,新建一个 http 请求,把参数按下面这样配置:

结果一执行就傻眼了,失败。

400 bad request,说明我这个请求参数写错了,不能这么搞。在排除了不是 search?query=Code=11000020211152B35 这样奇怪的请求形式之后(是的你没看错,这个 key 是 query,value 是 Code=xxxxxxxxxxx,无语)。问题应该还是出在用户名密码的传参上面。

如果这样传参不行,那还有哪些方式呢?搜索一番后我发现在配置元件里有这么一个东西:登录配置元件。长这样:

看起来非常符合要求的样子,但是很可惜,还是 400 bad request。说明我们这个尝试方向也是不对的图片。

一个 get 请求能有多复杂呢,又不像 post 请求那样那么种传参形式。这个参数无非就是 url,header 里这些。已经尝试了两种方式,那还有 header 没有试过,那就再试试呗,但是 header 里要传 key 和 value 这种形式,我又犯了难,到底应该是把用户名当 key 密码当 value,还是遵循传统 username/password 这种分别传呢?二者都尝试过后,统统 400,bad request 图片。

这种问题,问研发他也没办法。因为研发不会用 jmeter,而请求又没有打到服务器上,日志也没有,排错也就无从查起,只能自己想办法解决。在询问了群里一圈大佬之后,有人给我出了一个主意:你看看 postman 是咋实现的?

果不其然,在这里我发现了问题的关键:

在 postman 里,会把这个用户名密码作为一组参数进行加密,放在 Authorization 这个 key 下通过 header 进行传参:

既然如此,问题似乎就很明朗了。没想到在这一步我还是栽了个坑:

还是不行吗,我都快绝望了。没想到就在这山穷水尽之际,没想到问题竟意外地解决了:

我一开始把 Authorization 字段放在了线程组下面的总体信息头管理器下,然后还漏掉了加密字符串前面的 “Basic” 前缀,结果理所当然的失败了 400.

最后我在 http 请求下面又另外新建了一个信息头管理器,把 Authorization 参数放在这里,再次尝试,请求成功。

以上就是我通过将一个带有用户参数的 curl 命令 get 请求转化成 jmeter 压测脚本的问题排查过程。如果觉得有所帮助,欢迎关注我的专栏和同名公众号。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up