纪芩
(江西省网络安全研究院,江西 南昌 330019)
微信小程序是不需要用户下载安装、只需用微信扫码或搜索打开即可使用的手机应用程序。因小程序的开发门槛低、传播快、收益高,越来越多的开发者投入到小程序这一领域。马化腾在第五届世界互联网大会公开表示,目前微信小程序应用数量超过了100万,覆盖200多个细分的行业,日活用户达到2个亿。但与此同时,由于整体开发水平参差不齐,已出现越来越多的小程序质量问题,尤其是在电商、零售、旅游、直播等容易有高并发量的行业,小程序出现“服务器崩溃”“访问响应缓慢”“页面操作卡死”“支付提交失败”等性能问题更频繁,所以对微信小程序的性能进行测试很有必要。目前用开源的性能测试工具测微信小程序的性能案例很少,为此,笔者以旅游行业为例,详细介绍如何使用JMeter来测微信小程序的性能。
性能测试是指通过自动化工具模拟生产环境运行的业务压力和使用场景组合,覆盖多种正常负载、峰值负载和异常负载条件,测试系统的性能是否满足生产性能指标要求的一系列过程[1]。性能测试是一项综合性的工作,目的在于暴露性能问题,评估性能趋势。通俗来说,性能测试实质上就是利用工具去模拟大量用户操作来验证系统能够承受的负载情况,找出潜在的性能问题,分析并解决;找出系统性能变化趋势,为后续的扩展提供参考。
常见的Web性能测试可以分为以下几类:
(1)负载测试:不断加大负载(不同虚拟用户数)来确定在满足性能指标情况下系统能够承受的最大用户数,这种测试可以帮我们对系统进行定容定量,找到系统性能拐点。
(2)压力测试:也叫强度测试,它是指逐步给系统增加压力,测试系统的性能变化,使系统某些资源达到饱和或系统崩溃的边缘,从而确定系统所能承受的最大压力。
(3)并发测试:模拟多用户并发访问同一应用、同一操作的测试,记录是否会产生一些问题。
(4)配置测试:为了合理地调配资源,提高系统运行效率,通过测试手段来获取、验证、调整配置信息的过程,通过这个过程我们可以收集到不同配置反映出来的不同性能,从而为设备选择及配置提供参考。
(5)容量测试:是指在一定的软硬件及网络环境下,测试系统所能支持的最大用户数、最大存储量等。容量测试通常与数据库、系统资源(如CPU、内存、磁盘等)有关,用于规划将来需求增长(如用户增长、业务量增加等)时,对数据库和系统资源的优化。
一般来说,性能测试的完整过程包括分析、设计、准备、执行和总结5个阶段,常见的Web性能测试指标有:并发数、平均响应时间、服务器资源占用率、错误率、吞吐率等。
Apache JMeter是Apache组织开发的基于Java的性能测试工具,它是一款开源桌面应用软件,可用来模拟用户负载来完成性能测试工作。JMeter可以对Web应用进行测试,也可 以 对Java请 求、JMS、EJB、WebService、JDBC、FTP、JSR223、Socket等协议进行测试,除此之外,还可以通过扩展JMeter功能来满足特定的测试需求。
在Web性能测试中,JMeter软件被当作Web服务器与浏览器之间的一个代理网管,模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况[2]。JMeter体系结构由取样器、前/后置处理器、配置元件、控制器、断言、监听器、线程组等元件组成,它的基本工作原理是建立一个线程池,多线程运行取样器产生大量负载,在运行过程中通过断言来验证结果的正确性,通过监听器来记录测试结果[3]。如果取样器中有参数化的需求,可以通过配置元件或者前置处理器来完成;如果有关联需求,可以通过后置处理器来完成;如果想要设置应用场景,比如模拟多少用户、运行多长时间,可以设置线程组;如果想要模拟并发场景,可以利用定时器来设置;如果想要控制业务的执行逻辑,可以用控制器来完成。
JMeter具有开源免费且操作简单、可进行功能扩展、测试脚本易于维护等众多优点,正因如此,JMeter是目前使用率最高的性能测试工具之一。
本文选取“云游吉安”微信小程序的“关键词搜索”操作作为测试点来进行性能测试,测试工具版本为JMeter 5.1.1。“云游吉安”微信小程序是吉安市文广新闻出版旅游局推出的一款涵盖吃、住、行、游、购、娱、文化、历史八个版块,内容丰富,可为游客提供人性化服务体验的小程序,用户规模庞大。
根据小程序的实际使用需求,制定性能指标如表1。由于“云游吉安”是一款真实在用的商业小程序,没有开发方的配合,有些性能指标比如服务器CPU占用率和内存使用率无法进行测试获取,故不列入本文性能测试指标。笔者首先从1500并发数开始测试,分5次逐渐增加并发数到3500,分析各个性能指标结果的变化。
表1 性能测试指标
微信小程序可在手机端微信和电脑端微信中运行,经过多次尝试,笔者发现在手机端微信进行测试时JMeter工具录制不到有效脚本,Fidder、Burpsuite等抓包工具可录制到有效脚本,因此需要通过Fidder、Burpsuite录制脚本导出.jmx格式然后在JMeter上运行,而且脚本还要进行开发和调试,此方法比较繁琐。最终,笔者选用“云游吉安”微信小程序电脑端进行脚本录制及测试。脚本录制之前,电脑端要设置代理,地址为:127.0.0.1,端口号可自行设置,这里设为8886,和JMeter中的HTTP代理服务器端口号一致。
初次录制时,打开JMeter按常规步骤添加线程组、HTTP代理服务器、HTTP Cookie管理器等元件,在HTTP代理服务器中,端口号设为8886,目标控制器选择:测试计划>线程组,分组选择:不对样本分组,其余设置默认,然后启动HTTP代理服务器,接着在电脑端微信操作“云游吉安”小程序,录制结束后发现JMeter无法录制到有效内容,只录制到个别无效请求。检查发现这些请求都是https协议,因为录制http和https有不一样的规则,https是http+SSL,需要安全证书,所以被禁止访问。
再次录制时,启动JMeter的HTTP代理服务器,此时会在JMeter安装目录的bin目录下生成一个安全证书文件ApacheJMeterTemporaryRootCA.Crt,随后需要在JMeter选项>SSL管理器中导入此证书,导入后关闭JMeter。同时,电脑端也要导入JMeter刚刚生成的安全证书,笔者使用的电脑操作系统为Windows 10,导入证书过程为:在“运行”里面输入certmgr.msc,进入到证书管理器,点击“受信任的根证书颁发机构”,选择要导入的证书,点击导入即可。
再次打开JMeter进行最后一次录制,启动HTTP代理服务器后,在电脑端微信打开“云游吉安”小程序,接着点击首页关键词搜索框,页面随即跳转到专门的搜索页面,搜索框输入“井冈山”回车后,搜索结果页面如图1所示。
图1 搜索结果页面
录制结束后对脚本进行分析,将明显的无用HTTP请求删除,再对其余HTTP请求一一进行分析。通过在每条HTTP请求下面添加监听器>察看结果树,运行脚本后分析每条HTTP请求提交的数据和服务器对其的响应数据,直到出现正确的请求和响应数据,说明脚本调试成功,随后可以删除脚本中的无效请求,只保留“关键词搜索”操作对应的请求。调试成功的脚本如图2、图3所示,图2中同请求一起发送各参数值及图3中察看结果树的响应数据均与录制时的图1一致。图2中HTTP信息头管理器Referer值为:https://servicewechat.com/wx7827424d4fb6f317/67/page-frame.html。
图2 关键词搜索——HTTP请求
图3 关键词搜索——察看结果树
在脚本中添加简单控制器、同步定时器、聚合报告、图形结果、响应断言、断言结果等元件,在响应断言中测试模式里面输入“井冈山”、自定义失败消息里面输入“查询失败”,其余设置默认,然后按照测试计划分5次进行多用户并发测试。分别将线程数和定时器中模拟用户组数量设为1500、2000、2500、3000、3500,运行脚本后,性能测试结果(聚合报告)如图4~图8所示,将图4~图8的结果数据进行整理,得出表2。
图4 1500并发数的聚合报告
图8 3500并发数的聚合报告
从表2可知:
表2 性能测试结果
(1)系统的平均响应时间随着并发数的逐步增加不断增长,当并发数为3500时,平均响应时间达到3.134秒,不满足性能测试指标要求。
(2)随着并发数的增加,系统的吞吐率先增后降,当并发数为3000时,吞吐率达到最大值591.0事务/秒,而后开始急剧下降,当并发数为3500时,吞吐率降至156.0事务/秒,不满足性能测试指标要求。
综上所述,并发数不超过3000时,系统各性能测试结果均满足指标要求。当并发数为3000~3500时,系统平均响应时间超时,错误率出现,吞吐率从峰值急降,系统性能开始出现瓶颈,瓶颈原因可能与服务器的配置、网络带宽以及程序代码逻辑有关。
用开源性能测试工具JMeter对微信小程序进行性能测试的案例目前很少,所以本文测试方法具有一定的新颖性。传统思想是用微信手机端运行小程序进行测试,那样很可能会录制失败,或者录制难度和繁琐度会大大增加。本文作者的创新点在于运用JMeter对微信小程序电脑端进行性能测试,此测试方法准确有效,操作简单易上手。读者后续可以自行选择一些感兴趣的微信小程序参照本文方法进行测试,如果定的性能指标中并发数较大,可考虑采用多台负载机进行分布式测试。
图5 2000并发数的聚合报告
图6 2500并发数的聚合报告
图7 3000并发数的聚合报告