压测的目的
对于Web接口压测的目的最终是要在对数据库造成压力的情况下观察压测服务器的cpu是否达到预警值、memory是否发生激变甚至泄露、响应结果的error率以及数据库服务器读写方面的情况是否正常等等情况。
测试环境的准备
我们要准备压测服务器和压力机,并建立二者之间的联系。
压测服务器
用来提供服务的,也就是我们的测试服务器,上面发布的是压测分支,我们首先要基于压测基准分支拉一个压测分支并push到远端,然后把开发的代码合到压测分支上再push到远端,发布到压测服务器。
一般来说,我们的压测服务器是单节点的tomcat,而线上环境往往是多台服务器组成的负载均衡集群。
压力机
压力机是用来提供压力的,我们通过jmeter来做并发。实际测试中,压力机可以选择本机,也可以选择压测服务器。
不同点是:
本机有jmeter界面,测试结果很直观,而压测服务器上是没有ui的;
优缺点是:
选择本机的优点就是压测结果展示方便,Windows图形化压测结果展示,但是缺点是本机到压测服务器之间的网络情况会影响压测结果的准确性。而在压测服务器上进行就不存在这个问题。
建立联系
在压力机上把hosts切换到压测环境上,这样就可以对压测环境进行加压。
测试数据的准备
对于数据库方面施加压力,我们是通过分析http请求,找出能够对数据库产生压力的参数(这个参数往往会被用于与数据库进行交互,比如进行增删改查),然后对参数进行mock,做出足够数据量和满足复杂度的参数,通过并发http请求的方式来间接对数据库施加压力。
这是针对与参数来做数据,以便模拟足够多样的http请求。再就是我们会在数据库表中插入一定量的数据,以满足数据库方面的数据量要求,模拟现实情况下数据库表中的数据量。
前者是针对用户行为做数据,后者是针对数据库现状进行模拟,二者共同为压测提供模拟数据支持。
压测脚本的准备
我们通过jmeter来制定压测计划,在jmeter中创建压测计划,添加线程组,然后在线程组中添加http请求、聚合报告、查看结果树、图形结果等。
调试没问题,脚本可以跑通了,就可以对线程组设置线程属性(设置并发量),在调度器配置中设置好持续并发时间进行压力测试了。我们可以把本机做压力机,在本机切换hosts到压测环境进行压测。
也可以把配置好的jmeter脚本连通jmeter文件夹一起打包zip文件发到压测linux服务器上,然后在自己的目录下“unzip jmeter.zip”,“cd”到解压后的目录下,“chmod 777 jmeter.sh”添加执行权限,然后“./jmeter.sh -n -t 你的压测.jmx -l result.jtl”来执行压测。
压测结果会保存到result.jtl文件中,在当前目录下。我们可以在服务器执行压测过程中观察测试结果,也可以在测试结束后在linux服务器上查看与分析result.jtl文件(也可以通过“sz result.jtl”命令将文件下载到本机,具体的下载存放路径在SecureCRT的Options->Session Options->X/Y/Zmodem中设置)。
实际的压测过程中,我们会不断修改线程数,更改并发量。随着并发线程数的增加,当平均响应时间开始显著增加而每秒的吞吐量近乎不变的时候,这个并发量所对应的每秒吞吐量就是瓶颈点所在。
压测过程中会遇到的问题
在压测过程中,可能会遇到“NoHttpResponseException (the target server failed to respond)”。
这是由于jmeter自身设置的问题导致的,修改jmeter.properties中的httpclient4.retrycount和httpclient4.idletimeout值就可以了,然后修改jmeter中设置http请求继承自HttpClient4。
在压测过程中,可能会遇到“java.net.URISyntaxException: Illegal character in query at index xxx”。
这可能是由于你对于http请求参数没有勾选编码造成的,解决办法如下:
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
跨过困难,追逐自由的风;超越极限,创造不可思议。不管何时何地,坚持信念,全力奋斗。梦想是指引,努力是动力,你将绽放辉煌,书写属于自己的传世壮丽!奋斗不止,成就非凡!
奋斗是内心的旋律,永不止息的力量。不论起点如何,坚持才是胜利的关键。放飞梦想,勇往直前,你将创造出属于自己的辉煌,书写人生最美的篇章!
心怀梦想,无所不能;燃烧激情,超越极限。披荆斩棘,勇往直前,不断追求卓越。奋斗之路虽崎岖,但信念与努力铸就辉煌。坚定前行,开创属于自己的传世传奇!