功能测试对于测试人员来说并不陌生,功能测试执行的大体流程是根据需求说明书设计测试用例,测试执行,测试总结。同样性能测试的执行过程也是如此。然而,功能测试与性能测试的区别在于,功能测试是单用户,性能测试是多用户,是从1到N的量变。由于无法通过手工操作模拟多用户并发,因此需要借助工具来实现用户操作被测系统某场景的动作流程,也就是编写测试脚本。那么,如何开展性能测试呢?
1、需求分析
通常开发人员会提供接口文档以及非功能需求文档。标准的接口文档中描述了接口请求地址,请求方式,参数类型以及请求报文和响应报文示例。如果接口文档中描述内容不是很清楚,测试人员可以通过抓包工具比如Fiddler,Chrome浏览器Network等来获取接口详细信息。根据“非功能性需求”可以确定这些交易需要满足什么样的性能,如每秒TPS 、响应时间、资源使用情况如CPU、内存、网络带宽等。
2、测试脚本开发
脚本的正确性是进行有效性能测试的前提。在脚本调试过程中,通常是先设置单用户,然后再设置多用户并发。根据接口文档信息进行脚本开发,首先是创建一个线程组,设置单用户即线程数为1,如图1所示:
图1 创建线程组
然后添加取样器模拟用户请求,如图2所示:
图2 添加请求
在性能测试中,为了能够真实模拟用户请求通常需要将请求的报文进行参数化处理。在进行参数化处理时,首先确定哪些参数需要进行做参数化处理,例如图2中的id,starttime和endtime;其次准备数据源,也就是给参数赋值;最后将脚本中的常量用变量代替,如${ID}。经过了上述三个步骤,就完成了一次简单的参数化处理。常用的参数化方式有CSV,函数式,编程式等。笔者以CSV参数为例,如图3所示:
图3 CSV参数化
笔者将数据源保存在txt文件中,数据之间以‘,’隔开。需要注意的是,在利用CSV配置文件进行参数化处理时,由于数据文件data.txt文件末尾存在空行,导致读取的参数值为EOF。小伙伴不要再踩类似的坑了啊!!!
最后,添加监听器。常用的监听器有查看结果树、聚合报告和图形结果。其中查看结果树可以查看某一个具体的请求是否成功以及查看错误日志;聚合报告以表格的形式详细列出本轮脚本执行的请求数、响应时间、错误率、吞吐量以及带宽等信息;图形结果以折线图的形式形象地标线了某个时间段系统性能指标的变化趋势。
3、测试执行
(1)指定测试策略
在测试执行之前需要制定测试策略,本次性能测试所采用的策略是采用阶梯负载测试获取测试环境下应用的性能拐点,采用单交易负载测试验证待测交易在并发情况下的性能表现并进行调优,采用单交易疲劳测试验证单交易长时间运行时的性能是否稳定。具体如下:
阶梯负载测试:每3-5分钟加载若干用户,直至系统资源或性能指标超出预期范围,忽略思考时间,不设置迭代等待时间。
单交易负载测试:多用户单交易执行15-20分钟,忽略思考时间,不设置迭代等待时间。
单交易疲劳测试:单交易持续运行8-12小时,且交易量峰值达到该交易的日交易量峰值。
(2)测试执行
笔者将测试脚本上传至Xmeter性能测试平台来执行测试。Xmeter支持用户直接上传Jmeter脚本作为测试用例,测试脚本一般以.jmx为后缀名。当一个测试用例需要引入其他外部文件(比如使用CSV Data Set Config时),Xmeter支持用户将.jmx和其他外部文件打包成.zip文件上传。具体的操作过程,读者可以参考Xmeter用户使用指南,详细介绍了Xmeter的操作流程。
4、监控调试
在进行系统性能分析时,首先要弄清楚监控的服务器是PCServer还是云上资源。Windows系统有自带的性能监控工具Performance Monitor,在帮助测试人员分析系统瓶颈的时候非常有用。使用Windows性能监视器,可以跟踪应用程序和服务的性能影响,并且可以在超过用户自定义的最佳性能阈值时产生报警或执行操作。笔者在进行本次性能测试实践时,监控的服务器是云上资源,使用了Pod监控工具,即Prometheus + grafana 。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程,非常适合做虚拟化环境监控系统,比如VM、Docker、Kubernetes等。Grafana 用于数据展示,如图4所示:
图4 Grafana数据展示
5、测试报告
首先从Xmeter中导出性能测试报告,进行系统性能分析并提出解决方案或优化建议,再次对调优后的系统进行性能测试以验证方案的正确性,最后对本次性能测试进行总结,这样就完成了一次简单的性能测试。
作者:文苑