Jmeter简单介绍与搭配Jenkins实现自动化测试实践

Bioneck 岂安科技研发工程师

负责 Stalker 项目的部分研发与测试工作,编程爱好者,乐于使用代码解决生活中的重复工作。

最近有个需要依靠Jmeter+Jenkins实现自动化测试后部署的需求,于是看了看Jmeter的资料,这里给大家分享下。

Jmeter简介

Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。

Apache jmeter 可以用于对静态的和动态的资源(文件,Servlet,Perl脚本,java 对象,数据库和查询,FTP服务器等等)的性能进行测试。它可以用于对服务器、网络或对象模拟繁重的负载来测试它们的强度或分析不同压力类型下的整体性能。你可以使用它做性能的图形分析或在大并发负载测试你的服务器/脚本/对象。

Jmeter安装

Jmerter是基于java的,所以安装Jmeter之前必须先安装JDK依赖,JDK安装的方法网上许多这里就不多介绍了(建议安装8.0以上版本)。

安装好java后到Jmeter官网下载对应系统的压缩包解压到本地任意位置就可以使用了,这里我建议下载3.0以上版本的Jmeter,因为从3.0开始Jmeter可以直接生成可视化的HTML报告,不再需要安装插件来生成。

Jmeter测试组件

(1)负载发生器:用于产生负载,通常以多线程或是多进程的方式模拟用户行为。 (2)用户运行器:通常是一个脚本运行引擎,用户运行器附加在线程或进程上,根据脚本要求模拟指定的用户行为。 (3)资源生成器:用于生成测试过程中服务器、负载机的资源数据。 (4)报表生成器:根据测试产生的数据生成报表,提供可视化的数据显示方式。


Test Plan (测试计划):用来描述一个性能测试,包含与本次性能测试所有相关的功能。也就说本次的性能测试的所有内容是于基于一个计划的。

下面看一下一个计划下面都有哪些主要的功能模块(右键单击“测试计划”弹出菜单)。


Threads (Users)线程 用户

虽然有三个添加线程组的选项,名字不一样, 创建之后,其界面是完全一样的。之前的版本只有一个线程组的名字。现在多一个setUp theread Group 与terDown Thread Group

1) setup thread group

  可用于执行预测试操作,这种类型的线程执行测试前进行定期线程组的执行。

2) teardown thread group.

  可用于执行测试后动作,这种类型的线程执行测试结束后执行定期的线程组。

3) thread group(线程组).

这个就是我们通常添加运行的线程。通俗的讲一个线程组,,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。线程组中包含的线程数量在测试执行过程中是不会发生改变的。

测试片段(Test Fragment)

测试片段是在2.5版本之后新加的一个选项。

测试片段元素是控制器上的一个种特殊的线程组,它在测试树上与线程组处于一个层级。它与线程组有所不同,因为它不被执行,除非它是一个模块控制器或者是被控制器所引用时才会被执行。

组成

控制器

JMeter有两种类型的控制器:取样器(sample)和逻辑控制器(Logic Controller),用这些原件来驱动处理一个测试。

取样器(Sample)

取样器(Sample)是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMeter 原生支持多种不同的sampler ,如 HTTP Request Sampler 、 FTP Request Sample 、TCP Request Sample 、JDBC Request Sampler 等,每一种不同类型的 sampler 可以根据设置的参数向服务器发出不同类型的请求。

逻辑控制器(Logic Controller)

逻辑控制器,包括两类元件,一类是用于控制test plan 中 sampler 节点发送请求的逻辑顺序的控制器,常用的有 如果(If)控制器 、switch Controller 、Runtime Controller、循环控制器等。另一类是用来组织可控制 sampler 来节点的,如 事务控制器、吞吐量控制器。

配置元件(Config Element)

配置元件(config element)用于提供对静态数据配置的支持。CSV Data Set config 可以将本地数据文件形成数据池(Data Pool),而对应于HTTP Request Sampler和 TCP Request Sampler等类型的配置原件则可以修改Sampler的默认数据。(例如,HTTP Cookie Manager 可以用于对 HTTP Request Sampler 的cookie 进行管理)

定时器(Timer)

定时器(Timer)用于操作之间设置等待时间,等待时间是性能测试中常用的控制客户端QPS的手段。类似于python中的sleep。JMeter 定义了Bean Shell Timer、Constant Throughput Timer、固定定时器等不同类型的Timer。

前置处理器(Per Processors)

用于在实际的请求发出之前对即将发出的请求进行特殊处理。例如,HTTP URL重写修饰符则可以实现URL重写,当RUL中有sessionID 一类的session信息时,可以通过该处理器填充发出请求的实际的sessionID 。

后置处理器(Post Processors)

用于对Sampler 发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据。例如,正则表达式提取器 则可以用于提取响应数据中通过匹配正则表达式获得的数据。

断言(Assertions)

断言用于检查测试中得到的相应数据等是否符合预期,断言一般用来设置检查点,用以保证性能测试过程中的数据交互是否与预期一致。

监听器(Listener)

监听器可以用来对测试结果数据进行处理和可视化展示的一系列元件。 图行结果、查看结果树、聚合报告。都是我们经常用到的元件。

以上就是Jmeter的基本组成元件,我们用到的绝大部分测试计划就是依靠以上元件完成。


接下来我就根据我们的项目测试实例来实际演示一下以上元件的用法,目前项目的测试需求主要是业务测试,如果需要压力测试只需要把检查数据正确性的步骤去掉,简单的测试流程为向一个接口get请求将数据传输过去后,检查日志和数据库中是否有正确的数据。 这是我配置好后的测试计划:


添加线程组

一个测试请求是基于一个线程组完成的。一个测试计划必须有一个线程组。测试计划添加线程组非常简单。在测试计划右键弹出下拉菜单(添加-->Threads(Users)--->线程组)中选择线程组即可。

jmeter中 每个测试计划至少需要包含一个线程组,当然也可以在一个计划中创建多个线程组,多个线程组在测试计划下面是并行执行的,也就是说这些线程组是同时被初始化并同时执行线程组下的Sampler。

线程组主要包含三个参数:线程数、准备时长(Ramp-Up Period(in seconds))、循环次数。

  • 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。

  • 准备时长: 设置的虚拟用户数需要多长时间全部启动。如果线程数为20 ,准备时长为10 ,那么需要10秒钟启动20个线程。也就是每秒钟启动2个线程。

  • 循环次数:每个线程发送请求的次数。如果线程数为20 ,循环次数为100 ,那么每个线程发送100次请求。总请求数为20*100=2000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。

在这里,因为是检查数据正确性只需要运行一次,所以全部设置为1。

添加参数

添加参数常用读取CSV文件将文件内容设置为变量,我比较喜欢的是添加Beanshell元件,编写java脚本直接生成数据。 在线程组上右键菜单选择添加--->配置元件--->CSV Data Set Config就能添加CSV文件读取。

主要设置的参数有:

  • FileName:填写被读取的CSV文件地址和文件名。
  • File Encoding: 默认为ANSI。
  • Varible Names: 定义文本文件中的参数名,以逗号分隔例如a,b,c,定义后可在脚本在以Shell变量的同样的方式引用。
  • Delimiter:定义分隔符,用于将变量分开,这里定义的某个分隔符,则在Variable Names 用这里定义的分隔符,例如a,b,c 那么分隔符就是“,”。
  • Recycle on EOF: 设置为True后,允许循环取值。
  • Stop Thread on EOF: 当Recycle on EOF为false并且Stop Thread on EOF为true,则读完csv文件中的记录后,停止运行。
  • Sharing Mode: 设置是否线程共享。

添加Beanshell需要在线程组上右键菜单选择添加--->Sampler--->Beanshell Sampler就能添加Beanshell脚本文件读取。

beanshell十分强大,除了生成参数外也可以import java的包来完成许多复杂的逻辑,这里就不细说了。

参数设置后可以在后续的元件中以${参数名}的形式调用。

添加HTTP请求

生成参数后在线程组上右键菜单(添加--->Sampler--->HTTP请求)选择HTTP请求。对于jmeter来说,取样器(Sampler)是与服务器进行交互的单元。一个取样器通常进行三部分的工作:

  1. 向服务器发送请求
  2. 记录服务器的响应数据
  3. 记录相应时间信息

image.png

HTTP Sampler中可以设置的参数很多,这里就说一下一些经常使用的:

  • 名称:本属性用于标识一个取样器,建议使用一个有意义的名称。
  • 注释:对于测试没有任何作用,仅用户记录用户可读的注释信息。
  • 协议:向目标服务器发送HTTP请求时的协议,可以是http或者是https ,默认值为http 。
  • 服务器名称或IP :HTTP请求发送的目标服务器名称或IP地址。
  • 端口号:目标服务器的端口号,默认值为80 。
  • 方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
  • 路径:目标URL路径(不包括服务器地址和端口)。
  • Content encoding :内容的编码方式,默认值为iso8859。
  • 自动重定向:如果选中该选项,当发送HTTP请求后得到的响应是302/301时,JMeter 自动重定向到新的页面。
  • 同请求一起发送参数 : 在请求中发送URL参数,对于带参数的URL ,jmeter提供了一个简单的对参数化的方法。用户可以将URL中所有参数设置在本表中(如图中${did}就是调用之前生成的参数),表中的每一行是一个参数值对(对应RUL中的 key1=value1)。

在这里添加好参数后就可以进入下一步,检查数据。

添加数据库连接与数据库操作

要连接数据库首先需要下载不同数据库对应的JDBC驱动包,这里我使用的是mysql,所以下载入mysql-connector-java.jar,下载后将jar包放到Jmeter所在目录的lib文件夹中就可以了。 然后选择配置元件中的JDBC Connection Configuration添加数据库连接配置。

大部分配置读使用默认就可以,主要配置连接数据库部分:

  • Variable Name: 变量名称。需要唯一标识。与JDBC取样器中的相对应,决定JDBC取样的配置。简单理解就是在JDBC request的时候确定去哪个绑定的配置。
  • MaxNumber of Connection: 数据库最大链接数
  • PoolTimeout: 数据库链接超时,单位ms
  • Idle Cleanup Interval (ms): 数据库空闲清理的间隔时间,单位ms
  • Transaction Isolation:
  • 事务间隔级别设置,主要有如下几个选项:(对JMX加解密) TRANSACTIONREPEATABLEREAD事务重复读、TRANSACTIONREADCOMMITTED事务已提交读 、TRANSACTIONSERIALIZABLE事务序列化 、TRANSACTIONREADUNCOMMITTED事务未提交读、TRANSACTIONNODE 事务节点 、DEFAULT默认、编辑
  • Keep-Alive: 是否保持连接
  • Max Connection age (ms):最大连接时长,超过时长的会被拒绝 Validation Query:验证查询,检验连接是否有效(数据库重启后之前的连接都失效,需要验证查询)
  • Database URL:如jdbc:mysql://localhost:3306/test 表示本地数据库,3306端口,数据库名称为test
  • JDBCDriver Class: JDBC的类,如com.mysql.jdbc.Driver ,不同数据库使用把不同累,可以参考Jmeter的文档。

配置好后就可以配置具体的数据库操作。 选择Sampler添加JDBC Request。

image.png

  • Variable Name:数据库连接元件名称,填写对应JDBC Name,
  • Query Type:选择对应的数据库操作,路select,update等。
  • Query:具体的数据库查询语句,可以直接将参数写道SQL语句中,也可以使用占位符:?,将参数写到下方的Parameter velaues中,
  • Parameter Types:参数类型
  • variable names:返回结果的参数名,使用方法与读取csv文件获得的参数相同

获取到数据库查询结果后就可以检查数据正确性了

数据检查

需要检查的是JDBC request回来的数据,所以断言元件需要在数据库操作的内层。断言的种类有许多,这里就选择最常用的响应断言 右键JDBC Request,选择添加---->断言--->响应断言。

断言的设置是比较简单的:

  • apply to:是应用范围,设定匹配的范围
  • Main sample and sub-samples:匹配范围为当前父取样器,及子取样器
  • Main sample only :仅当前父取样器
  • Sub samples only:仅子取样器
  • JMeter Variable:变量值进行匹配,这里需要检查的是JDBC Request返回的值所附的变量,所以选择这一项,注意:变量名_x的形式意思是取数据返回结果的第x行。

要测试的响应文字:针对响应数据不同部分进行匹配 (1)响应文本:响应服务器返回的文本内容,http协议排除header部分 (2)响应代码:匹配响应代码,比如http请求中‘200’代表成功 (3)响应信息:匹配响应信息,处理成功返回‘成功’或者“ok”字样 (4)Response Header:匹配响应头中的信息

匹配规则: 包括:响应内容包括需要匹配的内容就算成功 匹配:响应内容要完全匹配匹配内容,不区分大小写 equals:完全相等,区分大小写 substring:响应内容包括匹配内容即为成功。 可以通过添加断言结果来查看断言的执行情况。

如果接口响应数据可以与断言匹配上,则测试用例通过,否则不通过。 查看通过结果就需要添加监听器了(Listener)

添加监听器

Jmeter有许多种类型的监听器,比如查看图形结果、聚合报告等,因为这个测试是业务测试,所以这里就选择查看结果树,针对每个元件的运行结果进行查看。 选择监听器--->响应断言 执行测试用例就可以看到测试结果了。

查看结果树,通过的测试通常为绿色。红色则代表失败了。可以查看到取样器结果,请求,响应数据,或是把测试结果写入到文件中。 测试计划配置完成之后,可以选择左上角的文件--->保存测试计划为…,来将测试计划保存到想要的地方。


以上就是Jmeter的大概使用方式与介绍。

我们经常需要Jenkins实现一键部署,但是有时候我们可能会因为失误导致部署时的代码不一定是可用的,这时候就可以使用Jmeter添加到Jenkins中,保证部署时的代码是通过了测试用例的。

接下来介绍Jmeter与Jenkins搭配使用实现自动化测试部署。

使用

在添加Jmeter测试任务之前,Jenkins需要首先安装两个插件,以方便我们对Jmeter的测试结果进行处理:

HTML Publisher plugin:可以让我们方便的在Jenkins中直接打开Jmeter的结果进行查看。 Performance Plugin:可以将测试结果的log以图表的形式整合到Jenkins中,还能根据测试结果的错误率与波动率修改Jenkins的job状态。

安装好插件以后就可以添加测试任务了,选择新建--->构建一个自由风格的软件项目。 接下来进入Jenkins配置页面。 根据需要配置好相应的源码管理,触发器和环境后,添加构建,这里Jmter运行在windows中所以添加windows shell,如果需要在Linux中构建可以选择对应Shell,使用的命令如下图,该命令是跨平台的,不管win,unix还是mac都可以使用。

命令格式为: -n -t <测试脚本文件路径> -l <日志保存路径> -e -o -n 非 GUI 模式 -> 在非 GUI 模式下运行 JMeter -t 测试文件 -> 要运行的 JMeter 测试脚本文件 -l 日志文件 -> 记录结果的文件,文件必须不存在 -e 设置测试完成后生成测试报表 -o 指定报表生成文件夹,文件夹必须为空或者不存在 -r 分布式远程执行 -> 指定远程slave节点执行测试任务 -R 设置分布式服务器列表 -> 配置远程服务器ip列表 -H 代理主机 -> 设置 JMeter 使用的代理主机 -P 代理端口 -> 设置 JMeter 使用的代理主机的端口号

接下来配置构建后操作: 选择添加构建后操作,在列表中首先是选择Publish HTML Reports。 选择增加。

HTML directory to archive中指定Jmeter生成报告的相对路径。 剩余配置一般默认就可以了。

接下来继续添加构建后操作,选择Publish Performance test result report:

  • source data files:日志文件所在的相对路径。
  • evaluation mode: 选择判断模式,一般来说选择standard mode(标准模式), 标准模式中可以选择relative threshold(相对阀值)或者error threshold(相对错误数),这里因为是只执行一次的业务测试,所以选择error threshold,并在下方配置1次测试失败就将job状态改为failed。

如果是测试数量较多,且容忍一定的错误率可以选择relative threshold,根据错误的百分比来修改job状态。

这里配置好以后就可以添加自己的后续部署任务了,再次选择增加构建后操作,选择 trigger parameterized build on other projects。

填写测试结束后需要部署的项目,并选择job状态为什么时才会触发这个构建。

以上就是一个完整的根据测试结果自动部署任务了,接下来我们保存,选择立即构建。

构建完成后的结果如图

选择HTML report可以查看HTML报告(如果使用新版本的Jenkins,因为Jenkins的安全策略默认不加载js,css等文件,所以需要在jenkins设置中执行脚本命令行:System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","sandbox; default-src 'self';"),执行完毕后重新构建就可以正常打开HTML报告。*这个命令重启后失效)

在HTML报告中可以看到测试结果的详细信息。

首页是测试结果的总览,可以看到测试的错误率等,选择左边栏可以查看更详细些的请求时间,吞吐率等信息。


配置一个自动化测试及部署任务就是这么简单,希望能够帮助到各位。 谢谢阅读。