1.Jmeter简介及安装
Jmeter是一款开源桌面应用软件,可用来模拟用户负载来完成性能测试工作。Jmeter的功能在版本升级过程中已经十分强大,现在多数互联网公司都在使用Jmeter来完成产品的性能或者接口测试工作。因为开源所以更具有扩展性,能够胜任更多的工作具有更多的可能性。比如现在很多云服务器提供商自带的性能测试工具就是基于Jmeter二次开发的,目前国内外比较火热的一款一站式性能/接口测试工具MeterSphere也是基于Jmeter二次开发扩展的。
Jmeter可以对Web应用进行测试,同时也提供了Web录制功能;另外还支持Java请求、JMS、EJB、WebService、JDBC、FTP、LDAP、SMTP、Junit、Mail、MongoDB、JSR223等测试。基本上我们场景的应用类型都可以用Jmeter进行测试。除此之外,我们还可以方便的扩展Jmeter功能来满足我们特定的测试需求。当前H5盛行,手机App、小程序若火如荼,我们也可以用Jmeter来进行性能测试。Jmeter也支持Socket协议的测试。另外JMeter也很方便来进行性能自动化测试。
1.1 Jmeter运行原理
接触过LoadRunner的同学应该知道,LoadRunner是可以选择进程方式或者线程方式来运行脚本的,在Jmeter中只以线程模式运行。由于Jmeter是运行在JVM虚拟机上的,每个进程开销比LoadRunner的进程开销大,如果以进程方式来运行的话,每台负载机上的进程数据就不会允许太多,当我们要大量并发时就需要大量的负载机,这显然不科学的,再这Java本身是支持多线程的,所以Jmeter选择了以线程方式来运行。
Jmeter通过线程组来驱动多个线程(类似LoadRunner中的虚拟用户)运行测试脚本对被测服务器发起负载,每一个负载机上都可以运行多个线程组。Jmeter运行场景不仅可以在GUI方式完成,还可以使用命令行。
接下来我们就来看看这款百变甚至万能的工具是怎么安装的。为了方便后续的教学,这里我会分别提供Windows系统和Linux系统下的两种安装方法。
1.2Windows下的安装
要使用jmeter,则必须保证机器上有JDK,并且配置好了环境变量。
注:JDK选择1.8即可(JDK8),高本版JDK可能会引起某些的兼容性问题
JDK的下载和安装:官方下载,安装时一直下一步即可。
Jmeter的下载:
最新版本的:Apache JMeter - Download Apache JMeter
历史版本:Index of /dist/jmeter/binaries
环境变量的配置:
JAVA_HOME:如果没有就新建,从JAVA的角度来说,没有该变量也可以,但是很多基于JAVA的应用都是首先去查找JAVA_HOME,然后通过JAVA_HOME去获取和运行java程序的。
注:基本上99%的所谓的XX_HOME都是指bin目录的上级,即不包含bin目录的。
PATH:一般来说,是修改path变量,然后将%JAVA_HOME%\bin,%JAVA_HOME%\lib,%JAVA_HOME%\jre\bin加入path变量的值中。
此处要注意分隔符:windows是分号,linux是冒号。
这样配置后,如需变更JDK的版本,只需要修改JAVA_HOME的值即可,不需要修改PATH变量。
注意:该变量是所有系统本身就存在的,一定不要新建,一旦新建,则会将系统原来的path变量覆盖,将会导致很多系统和之前所安装的软件无法正常使用。
JDK安装配置完成后,将Jmeter解压即可使用,为了方便后续操作,也可以将Jmeter配置进系统环境变量。
1.3Linux下安装
先检查系统有没有jdk,如果有openjdk的话,建议删掉,安装原版。
命令:rpm -qa | grep java
如果有openjdk的话,删除除了 *.noarch的另外几个。命令:rpm -e --nodeps
删除完成后,再通过 tar –zxvf 命令安装,安装完后,配置环境变量。
命令:vim /etc/profile
JDK解压完成后,通过命令打开配置文件,在最后添加:(注意自己的安装路径)
JAVA_HOME=/usr/local/jdk1.8.0_191 JRE_HOME=/usr/local/jdk1.8.0_191/jre PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin: CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export JAVA_HOME JRE_HOME PATH CLASSPATH
保存,使之生效,命令:source /etc/profile
最后分别输入:java –version,java,javac三个命令检验JDK是否安装成功。
2.Jmeter目录结构详解
由于Jmeter是一款开源免安装软件,解压即可用,所以需要对其目录里的有所了解,这样可以更方便的使用该工具以及为后续需要的持续集成和可能的二次开发做准备。
set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=4096m
该属性设置的就是启动jmeter时的jvm的堆内存的大小。
注:修改配置文件,一般都需要重启才会生效。
地址:Install :: JMeter-Plugins.org
下载完成后,将plugins-manager.jar放入到jmeter\lib\ext目录下,如果此时打开了jmeter,需要重启才生效。
重启后,插件功能将会加载到options下面:
3. Jmeter结构体系
为了方便后续的讲解,我们先统一一下名词。
元件:如果不做特殊说明,后面出现的元件代表Jmeter工具菜单中的一个子菜单(功能),比如HTTP请求、事务控制器、响应断言等,就是一个元件。
组件:一组元件的集合(一个或者多个),比如逻辑控制器中有事务控制器,仅一次控制器,循环控制器等,这些都是元件,但他们被归类到逻辑控制器中,逻辑控制器就是组件。如图所示,图中每一个标签就是一个组件。
现在我们就来看看Jmeter的结构,了解它的组成。从上到下,我们可以看到,在Jmeter中:所有的活动都是基于一个测试计划;测试计划中可以包含若干个线程组;线程组里包含了我们的实际任务;如果任务简单,那么一个简单的HTTP取样器就可以完成工作;但是实际上,在某些接口测试或者性能测试过程中,我们往往需要一些其他组件来共同协作才能完成测试;如果需要对性能测试场景做一定的控制,那会用到控制器和定时器等等;当然,很多时候我们需要判断一个请求是否成功,那么可以对该取样器加上一个断言;最终,为了看到测试的结果,可以加上监听器。从图中可以看出,监听器可以对整个线程组,也可以对具体的取样器;
总之,Jmeter基本原理是在测试计划下建立一个线程池,多线程运行取样器产生大量负载,在运行过程中通过断言来验证结果的正确性,通过监听器来记录测试结果。
比如:如果取样器中有参数化的需求,可以通过的配置元件或者前置处理器来完成。
如果有关联需求,可以通过后置处理器来完成。
如果想要设置运行场景,比如模拟多少用户,运行多长时间,就设置线程组。
如果想要模拟并发场景,可以利用定时器来设置;
如果想要控制业务的执行逻辑,比如登录只运行一次,就可以用控制器来完成。
3.1 取样器
取样器用来模拟用户操作,向服务器发出HTTP请求、WebService(SOAP/XML-RPC Request)请求或者Java请求等。我们可以吧HTTP请求看成是一个没有界面的浏览器,它可以发送HTTP请求,接受服务器的响应数据。
新版Jmeter默认提供了多达30几种取样器,并且可以通过插件和二次开发继续扩展。这些取样器基本上涵盖了常见的各种协议,比如HTTP、FTP、JAVA等等,还支持BeanShell脚本。取样器的访问路径:【测试计划】-【线程组】-【Sampler】。
3.2 断言
断言用来验证结果是否正确,用过LoadRunner的同学应该会知道检查点这个功能,可以帮助我们来判断请求是否成功返回是否符合要求,在Jmeter中叫断言。其实就是用一个预设结果(值、表达式、时间长短等条件)与实际结果匹配,配到则成功,反之失败。
Jmeter的断言元件也有多种,比如响应断言、XML断言、BeanShell断言等等。用的比较多的则是响应断言。对于复杂的断言还可以通过BeanShell脚本来完成(BeanShell是类Java的脚本语言,实际上BeanShell是一个小巧的Java源码解释器,可以直接调用Java程序)。断言的访问路径是:【测试计划】-【断言】。
3.3 监听器
Jmeter的测试结果需要添加监听器来收集,Jmeter结果收集程序的设计模式就是监听器模式。Jmeter监听器有两个任务:
我们在开发测试脚本时,不可避免需要调试,监听器也提供了辅助(如查看结果树就可以在其中看到请求与响应的数据)
Jmeter监听器的访问路径是:【测试计划】-【监听器】。
【取样器】、【断言】、【监听器】组合在一起就可以帮我们完成发生请求、验证结果及记录结果三项操作。
3.4 前置处理器
在测试脚本开发过程中,我们在请求发送前可能会做一些环境或者参数的准备工作,那么我们可以在前置处理器中来完成这些工作。比如,在对数据库进行操作前需要先建立一个数据库连接,那么前置处理器就可以完成这个功能。前置处理器访问路径:【测试计划】-【前置处理器】。
3.5 配置元件
性能测试中为了模拟大量用户操作我们往往需要做参数化,Jmeter的参数化可以通过配置元件来完成,比如CSV Data Set Config,它可以帮我们从文件中读取测试数据。另外Jmeter也提供了众多函数(通过函数助手)来帮我们生产动态数据。当然配置元件的作用不仅如此,它还可以用来记录服务器的返回数据,比如HTTP Cache Manager,自动记录服务器返回的Cache信息。简而言之就是它为取样器提供预备数据,然后由取样器发出请求。取样器路径:【测试计划】-【配置元件】。
3.6 后置处理器
后置处理器一般放在取样器之后,用来处理服务器返回结果,比如一个Web应用程序,我们登录后悔返回一个SessionID,这个SessionID在登录之后的业务操作过程中悔作为验证条件,验证用户是否合法登录了。我们利用取样器模拟这个请求是就需要带上这个属性,那么如何获取呢?首先我们要知道这个SessionID是从服务器返回来的。接着获取他,用什么工具呢?Jmeter帮我们提供了元件,比如正则表达式提取器,它支持正则表达式的方式提取数据。
后置处理器就是专门用来对响应数据做处理的元件,大家可能听过关联这个词,Jmeter的关联就是通过后置处理器来完成的。访问路径:【测试计划】-【后置处理器】。
【前置处理器】、【配置元件】、【后置处理器】都是为取样器提供数据支持的,取样器关注的只是业务逻辑。
3.7 控制器
我们在收邮件时,只需要登录一次邮件即可查看多封邮件,如果这个场景要在Jmeter中实现,我们就需要控制登录的次数,如何实现呢?Jmeter逻辑控制器中的仅一次控制器就可以完成这个操作。当然,控制器不止这一个,还有很多其他控制器来完成各种需求。打游戏有攻略,各种招式完全超乎设计人员想象,控制器用法也有攻略,组合在一起也能完成各种奇葩需求。
控制器访问路径:【测试计划】-【线程组】-【逻辑控制器】。
3.8 定时器
为了足够真实的模拟用户负载,我们有时会需要模拟这些请求在同一时刻发送,就好像把大家集合在一条起跑线上,然后一声令响,同时起跑。那么我们此时需要一个集合的功能,Jmeter中可以通过定时器来完成这个需求。当然,定时器可不止有这一个功能,定时器的种类很多,每一种代表了不同的功能,基本能够满足我们的所有幻想。
访问路径:【测试计划】-【线程组】-【定时器】。
3.9 线程组
性能测试需要模拟大量用户负载的情况,线程组就是用来完成这个工作的,在此元件中我们可以设置运行的线程数(就是模拟多少用户,一线程就是一个用户)。线程组的设置十分简单。除了设置线程数以外,还可以设置运行时长,定时运行等。另外第三方插件的扩展也让Jmeter的场景设计更加丰富。访问路径:【测试计划】-【Threads(Users)】。
3.10 测试片段(Test Fragment)
前面介绍了Jmeter的组成部分,在Jmeter还有个组件,叫测试片段。测试片段是一个辅助组件,在此节点下几乎可以防止任何Jmeter的测试元件,但它不会被直接运行。它的作用在于:
3.11 非测试元件
在Jmeter4.0版本之前有个组件叫工作台,4.0版本之后合并到了非测试元件。如图
主要作用有:
3.12 Jmeter测试计划要素说明
Jmeter中一个脚本即是一个测试计划,也是一个管理单元。Jmeter的请求模拟与并发数设置都在脚本文件中一起设置,不像LoadRunner把脚本与虚拟用户分开,所以测试计划要素如下:
要素1:脚本中测试计划只能有一个
Jmeter测试计划类似LoadRunner Controller中的场景,同一时刻场景当然只能有一个,Jmeter在GUI中显示的是树型结构,测试计划是根节点,根节点当然只有一个。
要素2:测试计划中至少要有一个线程组
Jmeter负载是通过线程组驱动的,所以计划中至少要出现一个线程组,也许你只运行一个线程。Jmeter测试计划支持多个线程组。我们可以在计划下面建立多个线程组,类似LoadRunner中Group方式的场景,把不相关的业务分布在不同的线程组。
要素3:至少要有一个取样器
测试的目的就是要模拟用户请求,没有取样器脚本就毫无意义。
要素4:至少要有一个监听器
测试结果用来衡量系统性能,我们需要从结果中分析系统性能。
至于其他元件都是为这些要素服务的,到底当前元件下能够添加哪些种类的元件呢?这就不用担心了,因为Jmeter已经做了严格控制。