性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
1 性能测试技能树
性能测试是一项综合性的工作,致力于暴露性能问题,评估系统性能趋势。性能测试工作实质上是利用工具去模拟大量用户来验证系统能够承受的负载情况,找出潜在的性能问题,分析并解决。
目前主流的一些性能测试工具:Jmeter、Grinder、Ngrinder等。
资源监控工具:nmon、jprofiler、kibana、skywalking、grafana等。
具体的技能树如下:
2 性能测试成功与失败要素
性能测试几大难点:
(1) 需求分析
(2) 场景设计
(3) 性能诊断调优
(4) 环境搭建和模拟
性能测试判断是否通过:
3性能测试流程
- 业务学习:通过查看文档,手工操作系统来了解系统功能。
- 需求分析:分析非功能需求,确定性能测试范围,了解性能测试指标。
- 工作评估:工作量分解
- 设计模型:业务模型转化成测试模型。比如一个支付系统需要与银行的系统进行交互(充值或转出),由于银行不提供支持,这时会开发程序代替银行系统功能,保证性能测试能够正常开展。再比如登陆后新增人员,需要绑定测试,这也属于测试模型。模型需要关注的是如何实现,是否具有可操作性、可验证性。
- 计划编写:计划测试工作,在文档中明确列出测试范围、人力投入、持续时间、工作内容、风险评估、风险应对策略等。
- 脚本开发:录制或编写性能测试脚本
- 测试环境准备:包括服务器和负载机两部分,服务器是被测系统的运行平台,负载机是我们用来产生负载的机器,用来安装负载工具,运行测试脚本。
- 测试数据准备:根据数据模型来准备被测系统的主数据与业务数据(主数据是保证业务能够运行畅通的基础,比如菜单、用户等数据)
- 测试执行:性能测试成败关键
- 缺陷管理:对过程中发现的缺陷进行管理
- 性能分析:对暴露出来的问题进行分析,找出原因
- 性能调优:开发人员、性能测试工程师一起来解决性能问题
- 测试报告:测试工作的重要交付件,对测试结果进行报告,主要包括常见的性能指标说明(TPS、RT、CPU Using...),发现的问题。
性能测试主要交付件:
- 测试计划
- 测试脚本
- 测试程序
- 测试报告或阶段性性能报告
14.评审:对性能报告中的内容进行评审,确认问题、评估上线风险。
4 性能测试通过标准
通过标准参考如下:
分类 |
用户量 |
指标 |
优先级 |
备注 |
事务处理类 |
300 (非高峰期) |
前端系统访问响应时间≤5秒 |
中 |
|
查询类 |
300 (非高峰期) |
前端系统访问响应时间≤2秒 后端CPU利用率<=50% 后端内存利用率<=50% |
高 |
|
1000 (高峰期) |
系统访问响应时间≤10秒 后端CPU利用率<=70% 后端内存利用率<=70% |
高 |
||
3000 (极限) |
系统未崩溃 请求未返回大量错误 |
低 |
||
统计类 |
简单统计类 |
系统响应时间≤10秒 |
中 |
手动启动业务全过程跟踪 |
复杂统计类 |
系统响应时间≤30秒 |
中 |
手动启动运行月报 |
5 性能测试趋势
性能测试将会在自动化的道路上越走越远,持续集成也将更好的集成性能测试部分。
6 Jmeter体系结构
元件:jmeter工具菜单中的一个子菜单(功能),比如HTTP请求、事务控制器、响应断言等。
组件:一组元件的集合(一个或多个),比如逻辑控制器中有事务控制器,仅一次控制器,循环控制器等,这些都是元件,但是归类到逻辑控制器,逻辑控制器就是组件。
jmeter基本原理:建立一个线程池,多线程运行取样器产生大量负载,在运行过程中通过断言来验证结果的正确性,通过监听器来记录测试结果。如果取样器中有参数化的需求,可以通过配置元件或前置处理器来完成。如果有关联需求,可以通过后置处理器来完成。如果想要设置运行场景,比如模拟多少用户,运行多长时间,就设置线程组。如果我们想要模拟并发场景,可以利用定时器来设置;如果想要控制业务的执行逻辑,可以用控制器来完成。
Jmeter结构图:
6.1 安装jmeter
6.1.1 登陆官方网站,下载jmeter
http://jmeter.apache.org/,下载jmeter,如图:
6.1.2 解压后, 运行 “bin/jmeter.bat”
jmeter界面能正常打开,表示安装成功,如图:
PS:Jmeter 是支持中文的, 启动Jmeter 后, 点击 Options -> Choose Language 来选择语言
6.1.3 JDK环境变量配置
计算机→属性→高级系统设置→高级→环境变量,如图:
3-1.添加用户变量JAVA_HOME ,变量内容填写jdk的目录, 如 C:\Program Files\Java\jre1.8.0_131
3-2.添加系统变量CLASSPATH,变量值填写 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有点和分号:点表示当前路径,分号表示分隔符)
3-3.添加系统变量PATH,变量值填写%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;(注意原来Path的变量值末尾有没有;号,如果没有,先输入;号再输入上面的代码)
3-4.检验是否配置成功 运行cmd 输入 java -version (java 和 -version 之间有空格)
若如图所示 显示版本信息 则说明安装和配置成功,如图:
6.2 jmeter工具目录
• Jmeter的Home目录下包含bin、docs、extras、lib、printable_docs这5个文件夹。
• 我们需要重点知道的是bin、lib和docs目录。
6.2.1 bin文件
• Bin目录下存放的是启动文件(Jmeter启动快捷方式、报告生成快捷方式)、配置文件(日志设置、JVM设置)日志文件、启动jar包、示例脚本。
在windows下,找到bin文件下的jmeter.bat文件,双击就打开jmeter。
在linux下,找到bin文件下的jmeter.sh文件。
jmeter界面能正常打开,表示安装成功,如图:
PS:Jmeter 是支持中文的, 启动Jmeter 后, 点击 Options -> Choose Language 来选择语言
6.2.2 lib目录
Jmeter是java写的,在lib下面包含ext、junit目录、jar包。
Jar包在脚本或者jmeter运行时所需要的jar包,比如使用JDBC测试数据库时,就需要对应的jdbc驱动的jar包放入lib目录。
Ext目录下存放的是jmeter运行时的各个组件的jar包,也可以存放自定义组件和插件的jar包。
6.3 jmeter 组成
取样器:进行脚本逻辑控制
线程组:场景设置
监视器:监控我们的脚本运行,取得性能指标
6.3.1线程组
名称:可以给线程组设置一个个性化的命名
注释:可以对线程组添加备注以标记
在取样器错误后要执行的动作:就是在错误之后要如何执行,可选继续执行后续的、停止执行等。
线程数:就是需要设置多少线程执行测试。
Ramp-up Period (in Seconds):用于告知JMeter 要在多长时间内建立全部的线程。多长时间内需要把上面的线程数均匀启动完。 默认值是0。如果未指定ramp-up period ,也就是说ramp-up period 为零, JMeter 将立即建立所有线程。假设ramp-up period 设置成T 秒, 全部线程数设置成N个, JMeter 将每隔T/N秒建立一个线程。
循环次数:就是决定一个线程要跑多少次测试。
Delay Thread creation until needed:直到需要时延迟线程的创建
调度器:选中之后可以配置启动时间,立即或者预定的时间
6.3.2 取样器:模拟用户操作
取样器用来模拟用户操作,向服务器(被测试系统)发出HTTP请求、WebService请求或Java请求。
取样器路径:【测试计划】->【线程组】->【Sample】
6.3.3 监听器:记录测试结果
Jmeter的测试结果需要添加监听器来收集。监听器任务用于添加结果监听、展示结果。
路径:【测试计划】->【监听器】
【取样器】、【断言】、【监听器】组合在一起们可以完成发送请求、验证结果及记录结果。
6.3.4 断言:验证结果的正确性
断言是用来验证结果的正确性。
断言就是用一个预设的结果(值、表达式、时间长短等条件)与实际结果匹配。
断言路径:【测试计划】->【断言】。
6.3.5 前置处理器:准备环境或参数
前置处理器用于环境或参数的准备工作,比如对数据库进行操作前,需要先建立连接。
路径:【测试计划】->【前置处理器】
6.3.6 配置元件:参数化
配置元件用于模拟大量用户操作我们往往需要做参数化或者可以用来记录服务器的返回数据。
路径:【测试计划】->【配置元件】
6.3.7后置处理器:处理服务器的返回结果
后置处理器一般放在取样器之后,用来处理服务器的返回结果,比如一个web应用程序,我们登录后会返回一个SessionID,登陆后的业务操作过程中会作为验证条件,验证用户是否合法登录。Jmeter的关联通过后置处理器来完成。
路径:【测试计划】->【后置处理器】
【前置处理器】、【配置元件】、【后置处理器】都是为取样器提供数据支持的,取样器关注业务逻辑。
6.3.8 控制器:一次控制,多次查看
比如说用在登陆一次邮件,查看多封邮件。
路径:【测试计划】->【线程组】->【逻辑控制器】
6.3.9 定时器:集合
定时器模拟同一时刻发送,集合的功能。
路径:【测试计划】->【线程组】->【定时器】
6.4 jmeter脚本的两种录制方式
有2种方式的录制方式:
一、使用badboy进行录制
二、使用代理方式进行录制
6.4.1 脚本录制的流程与思路
6.4.2 Badboy演示与录制
打开百度,输入badboy,进入官网,下载对应的版本,网址如下:http://www.badboy.com.au/
如图:
下载完成后,进行安装,安装成功后,在程序中找到badboy,点击打开badboy,表示安装成功,如图:
Badboy功能区如下:
6.4.3 jmeter代理录制
HTTP代理方式进行录制的原理:解析网络数据包,按Http协议包装成Http Request,Http Response等对象。
HTTP请求默认值(添加录制控制器)
HTTP代理服务器(设置端口、IP地址)
浏览器设置:
6.4.4手动编写
根据对应的协议类型选择合适的取样器(sampler),手动编写对应的请求,实现模拟数据发送的效果。
前提:了解协议、了解抓包工具、了解性能测试工具。
7 jmeter运行原理
Jmeter是以线程的方式来运行的,JMeter是运行在JVM虚拟机上。Jmeter通过线程组来驱动多个线程运行测试脚本对被测服务器发起负载,每一个负载机上都可以运行多个线程组。Jmeter运行场景可以通过GUI方式或命令行方式中完成[命令行运行的方式对负载机的资源消耗会更小]。
jmeter运行逻辑[jmeter支持远程运行]:
- 远程负载机首先启动Agent程序,待控制机连接;
- 控制机连接上远程负载机;
- 控制机发送指令(脚本及启动命令)启动线程;
- 负载机运行脚本,回传状态(包括测试结果);
- 控制机收集结果并显示。
注意:
1.控制机:参与脚本运行,同时管理远程负载机指挥远程负载机运行的任务,并且手机远程负载机的测试结果。
2.负载机:受控制机管理[前提需要启动一个客户端程序-Agent:jmeter-server.bat],同时运行的脚本中有参数文件以及依赖的jar包时,控制机并不能把他们发送到远程负载机,需要手动拷贝。
8 jmeter测试计划要素
jmeter分一个脚本即是一个测试计划,也是一个管理单元。jmeter的请求模拟与并发数(设置线程数,一个线程代表一个虚拟用户)设置都在脚本文件中一起设置。
测试计划要素:
- 脚本中测试计划只能有一个
- 测试计划中至少要有一个线程组
- 至少要有一个取样器
- 至少要有一个监听器
附录
1、自动重定向和跟随重定向的区别
自动重定向:当重定向时,自动跳转时,只针对GET和Head请求,自动重定向可以自动跳转到最终目标页面,但是jmeter不记录重定向过程内容【在查看结果树中只能看到重定向后的响应内容】
跟随重定向:当重定向时,自动重定向可以自动跳转到最终目标页面,但是jmeter记录重定向过程内容【在查看结果树中既能看到重定向后的响应内容,也能看到重定向前的响应内容】
2、如何解决JMeter设置线程组循环不起作用?
使用badboy录制的脚本,导出到jmeter中的,会出现一个问题就是,设置线程组循环会失效。只有设置step1的循环控制器才起作用。
问题的根本原因: jmeter中的循环控制器和badboy录制的脚本的step1循环控制器是不相同的。
解决方法:
1、badboy录制的脚本,循环要在step中设置。
2、jmeter代理录制的脚本,循环在循环控制器中设置。