1、Jmeter简介
(1)概念
Apache JMeter应用程序是开源软件,100%纯Java应用程序,用来进行负载测试、度量系统性能。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试函数。
(2)使用Jmeter我们能做什么?
Apache JMeter可以用于测试静态和动态资源、Web动态应用程序的性能。
它可以用来模拟大量负载对单个服务器或一组服务器、网络或对象进行压测,以测试其强度,或分析不同负载类型下的总体性能。
(3)Apache JMeter的特性包括:
支持测试许多种类的应用程序/服务器/协议类型:
Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET 等)
SOAP / REST Webservice
FTP
通过JDBC连接数据库
LDAP
面向消息的中间件(MOM)通过JMS。
Mail邮件- SMTP(S)、POP3(S)和IMAP(S)
本地命令或shell脚本。
TCP
Java对象
全功能测试IDE,允许快速测试计划记录(来自浏览器或本机应用程序),构建和调试。
命令行模式(非GUI /无头模式)负载测试支持任何Java兼容的操作系统(Linux、Windows、Mac OSX…)
一个完整的并准备好呈现动态HTML报告。
通过从最流行的响应格式、HTML、JSON、XML或任何文本格式提取数据的能力,可以轻松地相互关联。
完全可移植性和100% 纯Java。
完整的多线程框架允许多个线程同时进行采样,同时通过单独的线程组对不同的函数进行同步采样。
缓存和离线分析/重新播放测试结果。
高度可扩展的核心:
可插入的采样器允许无限的测试能力。
可脚本的Samplers(类似Groovy和BeanShell的jsr23兼容语言)
可以使用可插入计时器选择若干负载统计信息。
数据分析和可视化插件允许极大的扩展性和个性化。
函数可用于为测试提供动态输入或提供数据操作。
通过第三方开放源码库轻松地持续集成Maven、Graddle和Jenkins。
(4)Jmeter工作原理
通过多线程模拟服务器压力(Loadrunner可以选择以进程方式还是以线程方式来运行)。JMeter通过线程组来驱动多个线程(可以将线程理解为虚拟用户)运行测试脚本对被测服务发起负载,每一个负载机上都可以运行多个线程组。
控制机:当我们需要多台服务器来进行压测时,那个被选中作为管理机的服务器就是控制机。他负责管理、指挥其它负载机运行任务,并且收集负载机的测试结果,当然它本身也可以参与脚本运行;
负载机:想被测服务器发起负载的服务器。负载机受控制机管理首先要启动一个客户端程序(Agent:jmeter-server.bat),这样控制机才可以接管负载机。控制机会把运行的脚本隐蔽的发送到远程负载机,但是如果运行的测试脚本有参数文件及依赖的jar包时,控制机并不能把它们发送到远程负载机,这种情况我们后面详细介绍;
远程运行逻辑:
3.1 远程负载机首先启动Agent程序,待控制机连接;
3.2 控制机连接远程负载机;
3.3 控制机发送指令(脚本及启动命令)启动线程;
3.4 负载机运行脚本,回传状态(包括测试结果);
3.5 控制机收集结果并显示
2、JMeter安装
JMeter官网下载地址:http://jmeter.apache.org/download_jmeter.cgi
前提条件:安装jdk(注意版本)
在写本博客的时候,JMeter版本为5.1,需要JAVA 8 或JAVA 9版本
(1)Windows安装
直接下载二进制文件包中的zip文件,下载后解压
进入到安装目录,bin目录下,双击jmeter.bat文件即可打开jmeter
(2)Mac安装
直接下载二进制文件包中的zip文件,下载后解压
打开terminal,cd到安装目录,bin目录下,sh jmeter.sh
(3)Linux安装
直接下载二进制文件包中的zip文件,下载后解压
命令行,cd到安装目录,bin目录下,./ jmeter.sh
无论是使用二进制包还是通过源文件安装Jmeter都非常简单,需要大家注意的是,下载合适的JDK并配置好环境变量。
3、JMeter工作目录
(1)bin目录:包含示例脚本(examples)、报告模板(report-template)、启动文件(windows使用.bat,Mac和linux使用.sh启动文件)还有一些配置文件(日志设置、JVM设置等)
(2)docs:docs文件夹下的api文件夹包含了JMeter API离线帮助文档
(3)extras:JMeter的辅助功能,与Jenkins等集成会用到
(4)lib:JMeter组件以jar包的形式存放在lib/ext目录下,给JMeter安装的扩展插件,都存放在该目录;
(5)license:包含一些软件许可证,不必深究
(6)printable_docs:离线帮助文档,权威文档
(7)LICENSE:License说明文件
(8)NOTICE:版权声明
(9)README.md:JMeter简明介绍,后缀md是Markdown格式文件
4、JMeter常用组件
(1)测试计划
可以将其看作一个测试场景或测试用例,用来描述一个性能测试,包含测试用例相关的所有功能(比如测试用例的前置条件,预期结果等)
(2)线程组
性能测试需要模拟大量用户负载,线程组就是用来完成这个工作的。在这里我们可以设置线程数(一线程代表一用户),设置运行时间等。分为三类:
setup thread group
执行预测试操作的线程组,类似LR中的init()
teardown thread group
执行测试后操作的线程组
thread group
这个是我们常用的添加运行线程的设置项。
访问路径是:【测试计划】——>【Threads(Users)】
(3)取样器sampler
就是通过像服务器发送请求来模拟用户操作,同时也接收服务器响应。取样器有很多种(Jmeter 4.0 默认20种),常用的有HTTP请求,FTP请求等。取样器的访问路径是:【测试计划】——>【线程组】——>【Sampler】
(4)断言
断言就是用来验证响应结果是否正确的,类似LR中的检查点。断言的访问路径是:【测试计划】——>【断言】
(5)监听器
Jmeter的测试结果需要添加监听器来收集,监听器有两个任务:
监听结果,并且保存测试结果到文件,这些结果数据可以供再次分析使用
展示结果,Jmeter可以以表格或图形的方式展现结果,方便测试人员分析
访问路径是【测试计划】——>【监听器】
取样器、断言、监听器组合在一起就可以帮助我们完成发送请求、验证结果、记录结果三项重要的工作。
(6)前置处理器
用于在实际的请求发出之前对即将发出的请求进行特殊处理。在请求发送前,可以需要准备环境或参数,那我们就可以在前置处理器中完成这些工作。比较典型的应用有:
对数据库进行操作前需要先建立一个数据库连接,可以用前置处理器完成;
当发出的请求需要包含session信息时,可以用前置处理器填充;
访问路径:【测试计划】——>【前置处理器】
(7)后置处理器
后置处理器一般放在取样器之后,用来处理服务器的返回结果,比如一个Web应用程序,我们登录后会返回一个SessionID,这个SessionID在登录之后的业务操作过程中会作为验证条件,验证用户是否合法登录了。我们利用取样器模拟这个请求时就需要带上这个属性,那么如何获取呢?这时候就用到了后置处理器,等同于LR中的关联。
访问路径:【测试计划】——>【后置处理器】
(8)配置元件
性能测试中为了模拟大量用户操作,我们往往需要做参数化,JMeter的参数化就是通过配置元件来完成的。比如通过CSV Data Set Config,可以帮助我们从文件中读取数据。具体用法我们后续介绍。
前置处理器、后置处理器、配置元件都是为取样器提供数据支持的,取样器关注的是业务逻辑。
(9)定时器
定时器用于操作之间设置等待时间,有点类似LoadRunner中的think time
对于类似“秒杀”这种活动,使用定时器再适合不过了。为了足够真实的模拟用户负载,我们有时会需要模拟这些请求在同一时刻发送,就好像把大家集合到一条起跑线上,然后一声令下,同时起跑。Jmeter提供了多种定时器以满足各种场景。
访问路径:【测试计划】——>【线程组】——>【定时器】
(10)控制器:
逻辑控制器包含两类,一类用于控制测试计划中取样器节点发送请求的逻辑顺序的控制器,如if控制器,循环控制器;一类是用来组织可控制取样器节点的,如事务控制器、吞吐量控制器
(11)Test Fragment
是一个辅助组件,在此节点下几乎可以放置任何Jmeter测试元件,但一般不会运行,他有什么作用呢?
在脚本开发过程中用来备份元件
Test Fragment下的元件可以被模块控制器调用,我们可以利用它来模块化请求,然后供模块控制器调用
(12)工作台
工作台的主要功能在于:
启动HTTP代理,从而可以录制HTTP请求
备份脚本(这里的脚本是不会运行的)