项目期间对应用核心代码进行了重构,想要了解该次重构是否对应用的性能造成了影响,如果有,到底是下降了还是上升了,如果下降了,那将需要进行性能调优工作。基于进行性能测试对比的目的,在项目期间使用了DST平台进行了一个性能对比测试。在性能测试期间碰到了很多坑,从一个坑爬到另外一个坑,感觉自己的成长也非常的大,在此给做一些小的分享。
性能测试一般流程,无非是场景设计方案制定,环境搭建,脚本编写,脚本执行,结果分析,每一个阶段都会遇到很多的问题。在此想详细分享一下在脚本编写和执行时遇到的一些问题。
性能测试工具编写
.V4加密生成Sign总是不通过,V4脚本失败---à查看服务器上mtop的日志,看生成的sign和服务器端生成的sign有什么区别,为什么会有差别;(时间戳或者其他参数放错了,忘记放了等等)
.工具编写好后需要deploy到maven仓库,没有权限。--à问开发要settings文件,加上server的配置,拥有了deploy的权限;
.性能测试工具中原来使用的是testng框架,在eclipse里面跑需要安装一个插件,安装费时,改用了junit框架,引用的本地库的junit,导致在deploy时发生没有找到org.junit的异常--à通过pom依赖引入junit,重新deploy;
.有时候重新发布了性能辅助包后,再运行DST上面事务,发现代码并没有更新改了的二方库,需要在开启命令中添加-U,使之强制更新二方包即可以了。坑:修改H5并发问题之后,反复修改了性能二房包,但一直还是一般请求失败,后来根据日志发现,貌似DST上没有更新修改后的性能二方包,加上-U之后,正常了。
平台上运行单个脚本
.压测机所有运行的case都没有返回成功,抛异常:java.net.MalformedURLException: no protocol:,发送的请求http://ip变成一串不认识的东西---->反复本地运行都没有问题,到平台上发送的请求就不对,没有返回正确的结果。
A、性能测试脚本使用了资源文件,新建的文件夹名字为sources,而maven识别的是resources,导致打包没有打进去,运行脚本的时候,请求的前半部分无效;
B、修改后还是同样的问题,可能DST平台打包的时候,根本没有将resources文件打进去。
解决方案:不使用资源文件配置请求的url前半部分,而是在脚本里面,使用工具提供的setBaseUrl方法设置;
.有些配置文件未推送到性能机器上面,导致运行脚本时,有些配置没有调到,抛出各种异常。
平台上运行单个用例
.运行任意一个老的用例,发现大概50%的请求返回了失败。使用ab test并发数场景一样,却没有发生请求失败的情况。
A、问题在压测机上?
B、生成url的性能测试工具,对于httpClient的设置问题?
查看请求失败的日志,谷歌发现可能是端口占用未关闭导致。--à推测是生成url的问题,进一步代码review发现,性能测试工具在对返回的数据流进行读取后,忘记关闭了,导致太多的端口没有释放,导致后来新的请求没有获取到端口。修改后解决
.V4的H5性能脚本,单次发送请求成功,并发场景有一般的请求session为空。
经排查,是因为,性能测试脚本里面用了类变量,h5脚本 每个脚本都会调用两次API,第一次获取token设置回request,然后发起第二次请求api,拿到业务数据返回。多个线程并发,去设置token的动作,可能引起了并发的问题,
将修改token的值,从而使有一些业务API的请求加签后与服务端算出来的不一样,导致请求返回失败,令牌为空等情况。