全网最新最细最全最牛的jmeter接口测试,性能测试,没有之一,如有雷同纯属抄袭。

Posted 测试架构师北凡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网最新最细最全最牛的jmeter接口测试,性能测试,没有之一,如有雷同纯属抄袭。相关的知识,希望对你有一定的参考价值。

目录

 

1、接口简介

2、接口测试简介

3、环境搭建

4、RESTful风格  

5、Json说明

6、Jmeter简介

7、Jmeter环境搭建

8、Jmeter使用

8.1 Jmeter发GET请求

8.2线程组

8.2.1 并发执行

8.2.2 顺序执行

8.2.3 线程组-Ramp-Up Period(in senconds)

8.2.4 线程组-循环次数

8.2.5 线程组-调度器

8.2.6 setUp和tearDown

8.3POST请求

8.4 HTTP请求默认值

8.5 Jmeter参数化

8.5.1方式一:CSV DATA Set Config

8.5.2方式二:不用外部文件

8.5.3方式三:用户自定义变量

8.5.4方式四:使用函数参数化

8.6直连数据库

8.7 Debug用法

8.8 Jmeter关联_xpath提取器

8.9 Jmeter关联_正则表达式

8.10 Jmeter断言

8.10.1 响应码和返回内容断言

8.10.2 断言返回内容的长度

8.10.3 断言响应时间

8.11Jmeter集合点

8.12 Jmeter函数

__time()函数:

__Random()函数:

__CSVRead()函数:

__setProperty() 、__property() 属性相关函数:

8.13 Jmeter分布式

8.13.1 Jmeter分布式环境搭建

8.13.2 Jmeter分布式测试

8.14 Jmeter控制器

8.14.1 if控制器

8.14.2 循环控制器

8.14.3 forEach控制器

8.15 Jmeter组件QPS

8.16 Jmeter其他组件

8.17 Jmeter各组件的执行顺序

8.18 Jmeter 扩展组件-图形监视器

8.19 Jmeter组件:FTP

9 Jmeter项目实战

9.1项目准备

9.2功能测试

9.3自动化测试

9.4性能压力测试

10 生成html测试报告


下面主要就是讲一下Jmeter工具的用法,用法非常简单,比起loadrunner不知道简单多少,并且开源免费~~

 

1、接口简介

接口定义

接口:

    就是数据交互的入口和出口,是一套标准规范。

接口(硬件类接口)

    是指同一计算机不同功能层之间的通信规则称为接口。比如USB接口。

接口(软件类接口)

    前后端共同遵守的一套数据交互的规范

接口优点:

    前后端开发相对独立,都遵循文档规范就可以了,提高了效率。

    扩展性灵活,人员变动不受太大影响。

2、接口测试简介

接口测试,就是测试后端的实现是否符合接口规范。

测试都测什么?

    一是程序的功能、安全性

    二是效率(性能)

怎么测?

    模拟客户端向服务器发送数据,然后查看响应。

比如说:登录功能的接口,一般情况是发送一个带有用户名和密码数据的请求到后台,后台再返回一个json格式数据,比如前端需要显示用户名,那么后台就要返回一个用户名。接口测试就是要测返回的这个数据是否符合接口文档的格式,内容是否正确等。

接口测试分类:

web接口测试(B\\S架构)

    一种是服务器接口测试(公司自己的程序)

    一种是第三方接口测试(别的公司的接口,比如微信支付接口)

模块接口测试(C\\S架构)

3、环境搭建

测试接口的插件/工具:

    火狐浏览器:RESTClient

    谷歌浏览器:POSTman

    Java实现的测试工具:Jmeter

安装好这些工具,方便后期使用,下面简单说了一下RESTClient、Postman如何安装,Jmeter会在后面重点说明。

 

一、火狐插件RESTClient安装

  1. 打开火狐浏览器,点击右侧的选项按钮,选择附加组件

    

        2.搜索RESTClient

         3.搜索到后点击进去,点击添加到firefox

二、postman工具

  chrome浏览器被屏蔽了,可能搜不到postman,直接去网上下载一个插件rar包,解压。点击扩展程序,加载已解压的扩展程序。

这种方式的话,一定要注意chrome浏览器版本和postman版本有对应关系,比如:

chrome的65.0.3311.4版本对应postman插件的4.1.3版本。

再或者可以下载一个postman.exe文件,安装到电脑中。

使用postman做简单的接口测试

get方法:

打开postman,比如查询功能,像下面这个截图,默认是GET方法,后面输入链接,点击send,下面就返回了数据,检查返回的数据和状态字,都是正确的。

POST方法:

示例是参考这个api文档:

CNode:Node.js专业中文社区

里面有一个接口为:

用postman测试,就选择POST,输入链接:https://cnodejs.org/api/v1/accesstoken

然后点击下面的key,输入accesstoken,再点击value,输入你的accesstoken,就可以查询到结果:

点击下图标红的地方,可以切换输入post数据的风格:

4、RESTful风格  

开发测试时,大家的都会遵守的一些默认的规范,这些约定俗成的,大家习惯的作法,非强制性的。RESTful风格也是这样一种规范。

RESTful具体规范内容:URL实现方式、提交数据的实现方式、响应的数据的实现方式等。

接口一般就是和后台交互数据的,针对数据常用的就是增删改查操作,RESTful针对增删改查都有哪些规则呢?

 

增加数据(比如注册,向后台新增数据):

  1. URL:应该使用POST方式
  2. 提交数据方式:

                方式1:URL?key=value&key1=value1

                方式2:json格式

        3.响应的数据:

                状态码200/201+刚才添加的记录

查询数据(比如搜索):

  1. 一般是GET方式
  2. 提交数据方式:

    常用方式1:URL?key=value&key1=value1

    3. 响应的数据:

    状态码200/201+查询到的数据

修改数据:

  1. 一般是POST/PUT方式

  2. 提交数据方式:

    方式1:URL?key=value&key1=value1

    方式2:json格式

  3. 响应的数据:

      状态码200/201+修改后的数据

删除数据:

  1. 一般是GET/DELETE方式

  2. 提交数据方式:

    方式1:URL?key=value&key1=value1(常用)

    方式2:json格式

  3. 响应的数据:

    状态码200/204+无

5、Json说明

Json是一种数据载体,是一种轻量级的数据交换格式。常见的还有html、xml等,而互联网本质就是各种数据传输,数据传输的数据载体就可以用json、html、xml等。

相比较来说,json描述更简洁,如果数据量小的话,用json很方便,效率更高。

json语法:

  1. 键值对格式:‘key1’:’value1’, ‘key2’:’value2’, ‘key3’:’value3’
  2. 数组/列表格式:[’value1’, ’value2’, ’value3’]
  3. 组合格式:‘key1’:[1,2,3], ‘key2’:[4,5,6], ‘key3’:’value3’

        [‘key1’:’value1’, ‘key2’:’value2’, ‘key3’:’value3’]

6、Jmeter简介

Jmeter是Apache组织开发的基于Java的开源的压力测试工具。可以模拟高并发和多次循环的测试场景,能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC),可移植性

Jmeter的作用

  • 接口测试
  • 性能测试:内在算法,执行效率(响应时间)等
  • 压力测试:外在的压力(最多并发用户数,负载测试)
  • web自动化测试
  • 数据库测试
  • java程序测试

Jmeter优点:

  • 支持多协议:http、https、ftp、ftps等
  • 开源、免费
  • 小巧并且功能强大

Jmeter缺点:

  • 不支持IP欺骗
  • 不支持前端测试

 

7、Jmeter环境搭建

Jmeter是基于java开发的,所以要运行Jmeter,必须要先安装java环境(百度一下就知道怎么安装了),然后下载Jmeter,去apache官网下载:

Index of /jmeter/binaries

下载的时候要注意看这句话:Apache JMeter 5.2.1 requires Java 8+,Apache Jmeter版本和java版本的对应关系

Jmeter下载下来后,解压,长这样:

 

双击进入bin文件夹,找到ApacheJMeter.jar文件,双击打开就启动了Jmeter工具。

能启动起来看到类似下面这个图的界面,环境就ok了。

安装好之后,配置环境变量,win7:计算机右键->属性->高级系统设置->环境变量->下面的系统变量中,新建一个变量,变量名:JMETER_HOME,变量值:你的Jmeter安装路径比如:D:\\Jmeter\\apache-jmeter-3.1

然后修改Path,后面新增一个%JMETER_HOME%\\bin;注意如果前面有别的环境变量,要有分号隔开。再增加几个环境变量,都是后续会用到的:

%JMETER_HOME%\\lib\\ext\\ApacheJMeter_core.jar;%JMETER_HOME%\\lib\\jorphan.jar;%JMETER_HOME%\\lib\\logkit-2.0.jar

8、Jmeter使用

8.1 Jmeter发GET请求

用一个简单的小例子,说明一下使用Jmeter发送一个get请求的操作步骤:

第一步:打开Jmeter后,输入一个测试用例的名字,比如测试名称输入“测试计划1_helloworld”,然后ctrl+s保存:

第二步:右键点击左侧的“测试计划1_helloworld”,选择“添加”--Threads--线程组,输入一个名字,比如“线程组01”,保存。

第三步:右键点击“线程组01”,点击添加--Sampler--HTTP请求

第四步:上面添加了一个http请求,接下来就是构建http请求了,输入一个http请求的名字,比如“HTTP请求01_查询最新新闻”,下面主要填写如图圈红部分,服务器名称或者IP,端口号,协议,方法,编码,以及路径。

注意:这里的服务器名称或者IP,端口号是你要测试的网站的IP地址和端口,一般是公司的某台服务器,公司会提供。协议,一般就是HTTP和HTTPS,方法常用的get、post等,编码一般写utf-8就可以,路径就是你的测试路径,我这里直接写的知乎的一个开放API路径,如果上面有写了服务器和端口,下面这个路径是可以省略前半部分的。根据实际情况写即可。

比如测试这个接口:https://news-at.zhihu.com/api/4/news/latest,下面这两种写法都可以:

第五步:上面构建好了要发送的请求,接下来要添加一个监听器,在发送请求的时候会把结果记录下来。右键测试计划--添加--监听器--察看结果树

第六步:点击工具栏里面的绿色倒三角,就执行了HTTP01请求,察看结果树里面可以看到响应结果。

8.2线程组

进程概念:正在执行的程序

线程概念:线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位。一个进程有多个线程。比如迅雷下载,每一个下载任务就是一个线程。

线程组:按照线程性质被线程执行的分组。

并发执行:多个线程同时执行,每个线程结束的顺序和开始的顺序不一定一致。

顺序执行:按照线程的启动顺序挨个执行,一个线程执行结束再开始另一个线程。

 

8.2.1 并发执行

在Jmeter中,如何设置并发执行?

拿8.1讲过的例子来说,如下图:

进程可以认为是测试计划,线程组就是线程组01,打开线程组,可以看到下图所示的线程属性,可以设置线程数,加入改成2,再执行一次:

执行结果就会看到两个线程结果:

结果1:

结果2:

这样设置就等同于两个用户并发执行了~

8.2.2 顺序执行

那么顺序执行呢?

右键点击测试计划,可以看到有一个“独立运行每个线程组”复选框,勾选上,然后我再添加一个线程组,这样运行后,就可以看到是挨个线程组运行了:

运行结果:

8.2.3 线程组-Ramp-Up Period(in senconds)

上面讲了线程数,表示用户数。线程属性中还有一些其他值,点击线程组03,如下图:

Ramp-Up Period(in senconds):这个值的意思是在多少时间之内执行完全部线程。单位是秒。比如这里写10,线程数改为3,那就是10s之内运行3个线程,平均3秒钟执行一个。

8.2.4 线程组-循环次数

循环次数:单个用户循环的次数。如果改成2,线程数为3,那就是3个用户将这个线程组中的请求分别执行2次。循环次数勾选永远的话,就是一直执行,直到点击停止按钮:

8.2.5 线程组-调度器

调度器有两种用法:

第一种:

勾选调度器,输入持续时间和启动时间,点运行。

持续时间意思是持续发送请求的时间,6秒钟之内一直发。

启动延迟:意思是点击运行后,延迟几秒中再发请求。

第二种:

就是下面的启动时间和结束时间。可以输入具体的启动时间值和结束时间值。

ps:使用调度器的时候,上面的循环次数勾选“永远”。

8.2.6 setUp和tearDown

  前面讲顺序执行的时候,勾选“独立运行每个线程组”,线程组就会按照顺序依次执行,但是这里还有两个特殊的线程组,setUp和tearDown。setUP线程组会在所有线程组执行前执行,tearDown线程组在所有的线程组执行完毕后执行。

  如何添加?

  右键单击测试计划--添加--Threads--setUp Thread Group/tearDown Thread Group

setUp线程组:一般可以用来加载程序运行时需要的资源

tearDown线程组:可以用来放一些保存运行结果的代码

 

8.3POST请求

如何用Jmeter实现用户注册?

大体步骤和上面的类似,创建一个线程组,线程组中添加一个取样器sample--http请求,然后修改服务器名称或IP,修改方法为POST,修改路径,接下来就是修改body内容,一般是json数据、Form表单、xml或者javascript等。

如果测试注册功能呢?拿下面这个例子来说:

前三步和发GET请求是一样的,第四步,点击Parameters中的添加按钮,输入键值对即可:

第四步也可以点击Body Data,直接输入内容:

如果查看结果树里面的内容过多需要清除的话,可以使用工具栏中的:

这里还需说明一个HTTP请求头里面的概念:Content-Type。

  应该都知道,发post请求是需要有数据的,但是数据的格式是什么,要怎么告诉浏览器呢?就是请求头里面的“Content-Type”键。

之前用Jmeter,没有修改Content-Type,但是也都正常执行了,那是因为Jmeter会有默认的Content-Type,那就是:x-www-form-urlencoded,如果你的接口刚好使用的是这种格式,就没问题。但是如果你的接口只能接受json数据,这样就会出问题。

当Content-Type为默认x-www-form-urlencoded时

  如果是get请求,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url;如果是post请求,浏览器把form数据封装到http body中,然后发送到server。

比如图:

如果你的接口是需要其他格式的:比如:”application/json”、”application/xml”、“application/javascript”,Jmeter中应该怎么去修改呢?

选中“测试计划”,右键,选择“添加”--“配置元件”--“HTTP信息头管理器”,点击“添加”,输入键值对即可,如下图:

需要注意的是:注释可以不写,Content-Tpye的值为:

  application/json;charset=utf-8。这里面的分号必须是英文的。

  charset=utf-8的作用是为了保证浏览器各种字符都可以识别。

  json也可以修改为xml或者JavaScript,看自己的需求到底是什么。

  请求头如果写的是json,那么你对应的请求中的Body Data就需要是json格式。

 

8.4 HTTP请求默认值

我们测试的时候,如下图的服务器名称或者IP,以及端口号,HTTP请求的协议,编码格式等一般都是一样的,此时我们可以将这些数据抽离出来,放到HTTP请求默认值中,这样你新建HTTP请求的时候可以不用写这些重复的值了。

  如何抽离?

  在测试计划1_helloworld这里右键点击添加--配置元件--HTTP请求默认值,将相同的内容添加到这个页面中保存即可。

8.5 Jmeter参数化

参数化的概念和其他的自动化测试中的参数化概念一样,就是为了执行批量操作,比如批量注册,批量登录,用户名和密码需要很多不同的值,此时就可以用到参数化。

8.5.1方式一:CSV DATA Set Config

CSV DATA Set Config是Jmeter的一个参数化组件,通过这个组件可以动态获取并设置数据,实现类似批量操作。

拿登录来说,假如要测试同时5人登录,那么就需要5个账号密码。如何实现参数化?

1.首先要编写登录测试用例,设置循环次数为5次,post需要发送的账号和密码先填空。

2.编写一个外部文本文件,存储要登录的5个人的账号密码

3.Jmeter添加一个参数化组件CSV Data Set Config,每次循环时都读取文本文件的一行数据,将数据的账号密码字段分别填入post数据中。

步骤:

1、新建一个线程组,循环次数为5

2、添加HTTP请求,写上路径、方法以及BodyData,BodyData只需要写键

3、添加一个CSV组件:右键单击“线程组”->添加->配置元件->CSV Data Set Config。

filename:参数文件的路径

file encoding:编码格式,要注意你的参数文件必须是utf-8无BOM格式。

Variable Names:这项内容,可以认为是列名,或者给参数起的名字,多个名字用逗号隔开。

Delimiter:这里默认有一个逗号,表示你的参数文件里面的参数用逗号分隔的。

我的dataLogin.txt的内容是这样:

我需要用到两个参数,所以Variable Names我写两个变量名;dataLogin.txt中参数用逗号分隔的,所以Delimiter中写逗号。根据实际情况改即可。

4、去修改HTTP请求中的Body Data:name=$username&passwd=$pwd

要注意格式必须是$变量名

如果你的Body Data需要是json数据,大概写法是这样:

”name”:”$username”,

“passwd”:”$pwd”

之后运行试试吧,应该是会出来5个结果,每个结果对应的是一个参数对应的返回信息。

ps:循环次数也可以大于5次,大于5次的时候,就是把参数用完后再从头开始使用。

ps:除了可以修改循环次数为5次,线程数改为5,也会依次执行每组参数。

8.5.2方式二:不用外部文件

步骤:

1、再新建一个线程组,此时线程数设置为3,添加一个HTTP请求,和上面的第2步一样。

2、右键点击线程组->添加->前置处理器->用户参数。

输入名称,名称就是变量名,用户是代表每个用户的变量值。下面四个按钮可以添加变量、删除变量、添加用户、删除用户。

目前我这里写了3个用户。

3、第三步和CSV的方法的最后一步一样,去修改POST的Body Data。

name=$username&passwd=$pwd

8.5.3方式三:用户自定义变量

还是直接举例来说吧,例如如下接口:

以下 api 路径均以 https://cnodejs.org/api/v1 为前缀

1、get /topics 主题首页

接收 get 参数

  • page Number 页数
  • tab String 主题分类。目前有 ask share job good
  • limit Number 每一页的主题数量
  • mdrender String 当为 false 时,不渲染。默认为 true,渲染出现的所有 markdown 格式文本。

  示例:/api/v1/topics

2、get /topic/:id 主题详情

接收 get 参数

  •  mdrender String 当为 false 时,不渲染。默认为 true,渲染出现的所有 markdown 格式文本。
  •  accesstoken String 当需要知道一个主题是否被特定用户收藏以及对应评论是否被特定用户点赞时,才需要带此参数。会影响返回值中的 is_collect 以及 replies 列表中的 is_uped 值。

  示例:/api/v1/topic/5433d5e4e737cbe96dcef312

步骤一:新建一个线程组:线程组03_用户自定义变量,添加两个HTTP请求,第一个请求测试主题首页,服务器名称或者IP应该是:cnodejs.org,路径:/api/v1/topics;第二个详情测试主题详情,服务器名称或者IP是:cnodejs.org,路径:/api/v1/topic/5433d5e4e737cbe96dcef312;

步骤二:可以看出来,步骤一中的路径“/api/v1”这一部分是重复的,不只是这两个请求是这样,所有的请求都是以/api/v1开头,针对这个重复部分,可以提取出变量,以后可以不用重复写这部分,如果这部分需要修改,那么也只需要改一个地方即可。所以第二步就是添加一个用户变量来保存这部分内容,在测试计划的地方右键->添加->配置元件->用户自定义的变量,点击添加按钮,输入变量名和值。如图:

第三步就是使用这个变量替代HTTP请求中的重复部分:

  改好之后运行就可以看到结果了,和不使用全局变量是一样的结果只是这样的话更方便,如果路径长的话,也不用担心路径写错。

  运行的时候,以前的线程组可以先禁用,禁用后再运行就只会运行没有被禁用的。在线程组或者HTTP请求上右键,点击禁用即可。

  另外还有一点,就是查看结果树中,响应数据默认的是显示text形式的结果,这个示例的结果是json,用text显示就非常不好看,可以修改一下显示的方式:

  第三种方法就说完了,这个方法用的地方不是很多,一般只用来存储全局使用的变量,了解下即可。

8.5.4方式四:使用函数参数化

比如

获取网易新闻API

请求方式:POST

请求地址:https://api.apiopen.top/getWangYiNews

如果要查询多页,那么就需要每次只修改page即可,像这样:

https://api.apiopen.top/getWangYiNews?page=1&count=5

https://api.apiopen.top/getWangYiNews?page=2&count=5

https://api.apiopen.top/getWangYiNews?page=3&count=5

此时就可以使用一个函数来代替页码。步骤:

1、依然是新建一个线程组,新建一个HTTP请求,将各项内容填好,Body Data的内容是:page=1&count=5

2、然后在菜单栏的“选项”里面有一个“函数助手对话框”,点击它,或者点击工具栏的倒数第二个按钮,或者是快捷键Ctrl+Shift+F1

3、弹出函数生成对话框后,选择一个功能,我们选__counter,函数参数,第一个参数可以写FLASE,表示这个计数器是所有的线程共用一个,如果是True,表示每一个线程使用一个计数器。然后我们点击生成,就会在左侧的框中生成一个字符串,复制这个字符串:

4、将上面的字符串粘贴到Body Data中:page=$__counter(FLASE,)&count=5

5、然后我们将这个线程数设置为2,循环次数设置为3,运行测试下,测试结果看到请求中的POST数据的page值是从1-6变化的

如果__counter()函数的第一个参数设置为True,结果应该是page会从1-3变化,2个用户,所以会有2个1-3.

这里还有很多其他的函数可以使用,甚至可以自定义函数,后期再继续学了。总体来说,使用函数参数化的用法就是:$函数名(参数)

 

8.6直连数据库

jmeter本身没有提供连接数据库的功能,需要使用第三方jar包。这里使用mysql数据库举例,使用方式:

1、在测试计划的属性下面有一个Add directory or jar to classpath(添加文件夹或jar包),点击添加,选择mysql连接java的jar包。

我的放到了:D:\\Jmeter\\apache-jmeter-3.1\\self\\mysql-connector-java-5.1.35-bin.jar

2、配置数据库连接信息:在测试计划处右键->添加->-配置元件->JDBC Connection Configuration

Variable Name:自定义参数名字,在JDBC Request中会用到;

Database URL:jdbc:mysql:// 数据库IP地址:数据库端口/数据库名称;
(jdbc:mysql:相当于一个协议,类似http:一样,固定这样写,就是告诉Jmeter是mysql数据库,如果是别的数据库,mysql改一下即可,比如jdbc:sqlite:)

(数据库名称后面可以加参数:?useUnicode=true&characterEncoding=utf-8)

JDBC Driver Class:com.mysql.jdbc.Driver;mysql数据库的驱动

Username:数据库用户名;

Password:数据库密码;

3、然后在线程组中添加一个JDBC请求:右键线程组->添加->Sampler->JDBC Request

这里要注意添加的是JDBC Request,不是HTTP请求,JDBC Request属性中:

Variable Name:是第二步里面的Variable Name,必须写一样。

Query Type: 目前常用的就是Select Statement(sql语句是select的时候选择这个);sql语句是删除、修改、添加的时候选择Update Statement

下面的文本框中写你的sql语句。

这样3步完成,运行就可以在察看结果树中看到select的结果了。

查到了数据库的内容,接下来就是使用这些内容了。

还用之前参数化时用的接口api.apiopen.top/developerLogin

4、先去修改一下JDBC Request里面的查询语句为select name,pwd form login,然后在下面变量名的位置,写上两个变量

Variable name:就是存储的数据库取出来的值,username对应name,pwd对应pwd。

5、然后添加一个HTTP请求:api.apiopen.top/developerLogin,将上面保存的值传给HTTP请求的name和pwd

Body Data中写:name=$username_1&passwd=$pwd_1

需要注意的是,username保存的是查出来的所有符合条件的name值,想要取其中的某一个值,需要后面跟下划线+数字的形式表示你想使用第几条数据。

运行就可以看到结果了。

 

8.7 Debug用法

  还是接着上面的来说明Debug的功能,在我们的HTTP请求或者JDBC Request请求上右键,添加->后置处理器,选择Debug PostProcessor

然后运行,可以看到运行结果多了一个Debug PostProcessor

从结果看,可以看到密码都被存到了pwd_1、pwd_2、pwd_3中,并且pwd_#可以用来表示总共有几条记录。

8.8 Jmeter关联_xpath提取器

关联,意思是两个请求有关联性,比如一个请求的结果需要用到另一个请求中。上面讲到的从数据库取出数据给HTTP请求就是一种关联。

现在我们新建两个HTTP请求,一个请求百度首页,一个请求搜狗首页,将百度首页响应回来的title中的内容提取出来,去搜狗里面搜索,这里我们使用xpath提取器,步骤:

1、新建两个HTTP请求,如下图:

2、在HTTP请求_访问百度那右键,选择添加->后置处理器->XPath Extractor,

  一般在HTTP请求结束后需要做的操作都放到了后置处理器中,我们现在需要把访问百度的请求发送完之后,利用xpath拿到响应中的内容,所以去后置处理器中添加XPath Extractor控件,这个控件主要需要注意3个点:

    Use Tidy:因为是返回的是html,必须勾选Use Tidy。

    引用名称:就是变量名,你取出你想要的值后放到变量中。

    XPath query:写xpath表达式

    缺省值:意思是没有找到xpath就用这个值替代。

3、将HTTP请求_访问搜狗的请求的路径改成:/?query=$queryText,这个是第2步中的xpath变量名。

然后运行,可以看到结果:

8.9 Jmeter关联_正则表达式

上面8.8节是使用xpath提取器提取信息使用,事实上也可以使用正则表达式,上面的第2步,改成:在HTTP请求_访问百度那右键,选择添加->后置处理器->正则表达式提取器

引用名称:依旧是变量名

正则表达式:就是你需要提取的内容,()括号表示提取字符串中的部分值,()前后是提取的边界内容。正则表达式如果不懂,需要单独学习一下。

模板:正则表达式的提取模式。这里是固定格式:$数字$,

如果正则表达式有多个提取结果,则结果是数组形式,模板$1$,$2$等等,表示把解析到的第几个值赋给变量;从1开始匹配,以此类推。

若只有一个结果,则只能是$1$;

匹配数字:

正则表达式匹配数据的结果可以看做一个数组,表示如何取值:0代表随机取值,正数n则表示取第n个值(比如1代表取第一个值),负数则表示提取所有符合条件的值。

示例2:

比如我先拿到网易新闻的热点新闻标题,然后到搜狗中去搜索。

1、添加HTTP请求,网易新闻API请求,服务器名称:api.apiopen.top,路径:/getWangYiNews

2、添加正则表达式提取器,

引用名称为:queryText;

正则表达式为:"title":"(.*?)"

模板:$1$

匹配数字:1

3、添加HTTP请求,搜狗或者百度等,路径为:/?query=$queryText

运行即可。

如果从标签语言中,比如html或者xml,一般用xpath提取器即可,如果是文本的话,用正则表达式。

Jmeter添加聚合报告:

聚合报告可以看到发送请求的响应时间、吞吐量、错误率等

添加方法:右键测试计划->添加->监听器->聚合报告

8.10 Jmeter断言

断言意思就是判断你程序响应结果是否正确。请求成功并不代表结果正确,所以增加断言机制提高正确性。类似于LR中的检查点。

HTTP请求中断言主要包括:

  • 断言状态的响应码
  • 断言响应的内容
  • 断言响应内容的长度
  • 断言响应的时间

下面挨个讲解如何添加断言

8.10.1 响应码和返回内容断言

前面有添加一个搜狗首页的HTTP请求,继续拿这个请求举例,或者拿百度请求举例都一样。在请求上点右键,添加->断言->响应断言:

出来如下图,下图我添加了一个要测试的模式,写了一串字符串“搜狗搜索引擎 - 上网从搜狗开始”,Apply to选择“Main Sample only”,要测试的响应字段选择“响应文本”,模式匹配规则选择“Substring”。这样意思就是说我想判断我的响应文本是否包含“搜狗搜索引擎 - 上网从搜狗开始”字符串。

详细说明每一项内容:

响应断言页面,第一块内容是名称和注释,跟其他页面一样,起个名字,写个注释。

Apply to(断言应用的范围):

  • Main sample and sub-samples – 可以同时应用到主取样器和子取样器。
  • Main sample only - 只能应用到主取样器。
  • Sub-samples only - 只能应用到子取样器
  • JMeter Variable Name to use –应用到指定名称的变量(对指定的变量的值进行提取)

  取样器就是sampler,在线程组右键->添加->sampler->HTTP请求,这里的sampler除了包含HTTP请求还包含很多其他的请求,FTP、JDBC等等,这些都叫取样器。

我们这里只添加了一个取样器,没有添加子取样器,那就默认选中的Main sample only就可以了,不需要修改。

要测试的响应字段: