目录
一、前言
在日常开发过程中,我们经常需要对项目进行相应的压力测试来衡量项目的各项指标,例如QPS、运行时间等。
压测相关的一些指标:
QPS(Queries Per Second):每秒能够响应的查询次数,也即是最大吞吐能力(吞吐量)。
TPS(Transactions Per Second):每秒处理的事务数目。一个事务是指一个客户端向服务器发送请求然后服务器做出反应的过程。TPS 的过程包括:客户端请求服务端、服务端内部处理、服务端返回客户端。
例如,访问一个页面会请求服务器 3 次,那么访问这一个页面就会产生一个TPS,三个QPS。
因此,本文总结了常见的压力测试步骤,希望可以更好的帮助读者熟悉压力测试的相关操作。
二、基础知识
1. 什么是压力测试
软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。软件压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行软件压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网络带宽。
压力测试涵盖,性能测试,负载测试,并发测试等等,这些测试点常常交织耦合在一起。
顾名思义:压力测试,就是 被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定(资源占用情况)。
比如:2000个用户同时到一个购物网站购物,这些用户打开页面的速度是否会变慢,或者网站是否会奔溃。
2. 压力测试的步骤
抽象步骤
-
定义测试目标和指标:确定测试所需达到的目标和指标,例如系统吞吐量、响应时间、连接数等。
-
制定测试方案:根据测试目标和指标,制定测试方案,包括测试场景、负载模型、测试数据等。
-
准备测试环境:搭建测试环境,包括硬件、软件、网络等,确保测试环境与生产环境相似。
-
进行预热测试:在正式测试之前先进行预热测试,测试环境的稳定性和准确性。
-
进行负载测试:按照测试方案进行负载测试,记录并分析各项指标的数据。
-
分析测试结果:根据测试数据,分析系统的瓶颈和弱点,确定优化方案。
-
优化系统:针对测试分析结果,进行系统优化,包括硬件升级、软件调优等。
-
重复测试:进行多次测试,确保系统的性能稳定和可靠。
生产步骤
(1)确定存量数据的规模(用户一般会要求制造出3-5年的存量数据);
(2)确定需要进行压力测试的业务(一般是用户使用最频繁,或者业务操作复杂的业务);
(3)确定操作用户的的数量、各类操作用户的比例;
(4)峰值业务量的要求(一般是1个小时内最多要处理的笔数);
(5)对实时业务响应时间的要求(如在峰值情况下,单笔业务的处理时间(如小于60秒));
(6)对于批量处理过程的时间要求(如进行日终(月终、年终)处理、与外系统间批量数据传输时的时间)。
以上信息,通常需要业务人员来确定。
为了进行压力测试的技术准备,需要如下资料:
(1)系统概要设计(了解系统技术架构,确定测试方法);
(2)如果自己开发接口程序,需要了解接口报文规范;
(3)数据库设计(我们需要据此编写程序,准备存量数据)。
为了开发脚本需要了解如下信息:
(1)操作手册(脚本录入或者手工开发脚本);
(2)参数化脚本(动态化数据需要进行关联);
(3)脚本回放(验证脚本是否可以成功的创建数据)。
测试场景:
(1)单用户运行压力测试场景;
(2)多用户运行测试场景,查看系统资源消耗等调优工作开始。
另外,还有测试环境的事情需要落实。压力测试一般要求环境配置较高,最好与生产环境一致或者接近。
3. 注意事项
-
测试负载要尽可能接近实际使用场景,避免人为制造不真实的测试负载。
-
测试数据要真实可信,尽可能使用真实数据或者与真实数据相似的数据。
-
测试环境要与生产环境相似,包括硬件、网络、软件等。
-
测试结果要统计全面,从多个角度分析系统性能,确定系统的瓶颈和弱点。
-
测试结果要客观,避免主观误判和人为干扰。
4. 几款流行的压力测试工具
(1)JMeter
Apache JMeter是Apache组织开发的基于Java的压力测试工具,用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java 对象、数据库,FTP服务器,等等。
JMeter可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的强度和分析整体性能。
另外,JMeter能够对应用程序做功能回归测试,通过创建带有断言的脚本来验证你的程序是否返回了期望的结果。
为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。
(2)LoadRunner
LoadRunner是惠普旗下一款自动负载测试工具,它能预测系统行为,优化性能。LoadRunner强调的是整个企业的系统,它通过模拟实际用户的操作行为和实行实时性能监测,来帮助更快的确认和查找问题。此外,LoadRunner 能支持最宽范的协议和技术,量身定做地提供解决方案。
(3)其他测试工具
Siege是一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,
记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。
TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线请求导入到测试系统中去。
TCPCopy的特点是可以拷贝线上真实流量,模拟用户数据。
三、实际操作
1.安装Jmeter
- jmeter官网:https://jmeter.apache.org
- 解压后,进入bin目录,使用jmeter.bat启动程序。(注意:因为JMeter是使用JAVA写的,所以使用JMeter之前,先安装JAVA环境,这个自行搜索安装).
- 改为中文显示:Options -> Choose Language 改为简体中文
2. 项目压测
项目压测包含了web程序 + 数据库 + 缓存 +其他等指标,体现出了项目整体的性能,比较有参考意义,如果程序性能比较低,可对其他指标进行压测来查找原因(性能瓶颈一般出现在数据库)。
创建线程组
在“测试计划”上右键 【添加】->【线程(用户)】->【线程组】
设置线程数和循环次数,我这里设置线程数为1000,循环10次
配置元件
在线程组上右键【添加】->【配置元件】->【HTTP请求默认值】
配置 HTTP请求默认值:协议、服务IP、端口
添加 Http请求
在“线程组”右键 【添加-】->【取样器】->【HTTP 请求】
设置路径和数据(参数可录入简单类型,消息体数据可录入json)
如果是json数据,需要添加HTTP信息头管理器
在线程组上右键 【添加】->【配置元件】->【HTTP信息头管理器】,添加 Content-Type:application/json
添加监听器
(这里截图是测试后的)
线程组上右键【添加】->【监听器】->【聚合报告】
线程组上右键 【添加】->【监听器】->【察看结果树】
执行测试
下图的绿色按钮为开始执行,如果要重新执行需清除上一次结果。
四、总结
在项目上线之前,都需要做压力测试,目的是看下我们的网站能抗住多少的压力,能承担多少并发,如果不做压力测试,一旦出现大访问量时,我们的网站会挂掉,所以压力测试真的很重要,应该重视起来!