用Jmeter进行接口测试

Posted 程序员老波

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Jmeter进行接口测试相关的知识,希望对你有一定的参考价值。

web接口测试工具:

     手工测试的话可以用postman ,自动化测试多是用到 Jmeter(开源)、soupUI(开源&商业版)。

下面将对前一篇Postman做接口测试中的接口用Jmeter来实现。

一、Jmeter 的使用步骤

打开Jmeter 安装包,进入\\bin 中,找到"jmeter.bat", 点击打开即可。

在下图打开的Jmeter 页面中,右键“测试计划” -> “添加” -> "Threads(Users)" -> “线程组”, 建立线程组。

右键“线程组” -> “添加” -> “Sample” -> “HTTP请求”, 输入“服务器名称或IP”,对应的端口号,http默认端口号80,可以不写。

以下请求为GET, 所有“方法”那选择“GET”, 输入对应的路径,添加参数及值。

注意: “服务器名称或IP”中不用输入http://, 请求时会自动加入(eg, 输入api.test.cn).

右键“线程组” -> “添加” -> “监听器” -> “察看结果数”, 添加“察看结果数”, 以察看运行后的结果,如果所示。

这是一个简单的接口请求例子。

二、接口请求实例

1. “用户定义的变量” 的应用

以获取学生信息接口(stu_info) 为例,添加一个“用户定义的变量”,设置变量"host" 以及值,这样在获取学生信息接口(stu_info)就可以通过"$host"取得“服务器名称或IP”的值。

登陆接口(login)接口也可以应用“用户定义的变量”的方法,如上图所示,在“用户定义的变量”中添加"username", "password" 变量及对应的值, 应用到登陆接口(login)接口请求中即可。

 2. "HTTP Cookie 管理器"的应用

以金币充值接口(gold_add)为例,建立一个HTTP请求改名“金币充值”,选取请求方式POST, 输入对应的host, path以及同请求一起发送的参数和值。

由于此接口有权限验证,需要admin用户才可以做操作,需要添加cookie, 因此需要添加"HTTP Cookie 管理器"以传递Cookie。

添加"HTTP Cookie 管理器" 方法如下图所示, 右键“金币充值” -> “添加” -> “配置元件” -> "HTTP Cookie 管理器" 

设置Cookie 的名称(即username 的值),值(即login Response 中的sign 值),域(已在“用户定义的变量”中设置,只需输入变量即可,格式为$host)

最后可以通过“察看结果数”的响应数据查看结果。

3. 建立接口间的关联

以下以登陆接口(login)和金币充值接口(gold_add)为例,在这两个接口间建立关联,让金币充值接口(gold_add)可以实时取得登陆接口(login)的"sign" 值,不必再“HTTP Cookie 管理器”中手动输入最新的sign 值。

从“察看结果树”可以看出,登陆接口(login)的Response 结构为Json格式, sign 在 login_info 里面一层。

3.1 应用"jp@gc - JSON Path Extractor" 来实现

右键“登陆” -> “后置处理器 -> "jp@gc - JSON Path Extractor" 

通过“察看结果数”得到Response 的结果后, 将“JSONPath Expression” 输入"$.login_info.sign", 设置变量"sign2", 给金币充值接口(gold_add)用

因此需要在“HTTP Cookie 管理器”中将$username的值输入$sign2,代替之前手动输入的那一串码。

3.2 右键“登陆” -> “后置处理器 -> "正则表达式提取器" 

输入对应的值, "jp@gc - JSON Path Extractor" 中类似,将“引用名称”输入"sign2",以保证和“HTTP Cookie 管理器”的一致。将正则表达式中的式用login 接口返回的 "sign": "cd2b43f1688e472e3a516b5a2c6831e8",  中的一串码用(.*) 替换即可。

各参数的含义参考下表:

参数

释义

引用名称

在HTTP等请求中,引用此数据,需要用到的名称

正则表达式

用于将需要的数据提取出来

模板

表示使用提取到的第几个值:
$-1$:表示取所有值
$0$:表示随机取值
$1$:表示取第1个
$2$:表示取第二个
以此类推:$n$:表示取第n个

匹配数字(0代表随机)

0 代表随机取值,1 代表全部取值

缺省值

如果正则表达式没有搜找到值,则使用此缺省值

4. 设置断言

以“增加学生”接口(add_stu)为例,增加响应断言,以验证添加的数据是否成功。如下图所示设置

通过“察看结果数”可以看到“增加学生” 金币结果为绿色,同时响应数据里的确有断言中的设置的"1000"。

 

 5. “HTTP信息头管理器”的使用

以下图中的“获取所有学生信息” 为例,右键“获取所有学生信息” -> “添加” -> “配置元件” -> "HTTP Cookie 管理器" , 输入对应的名称和值即可。

注意:  这里的值需要输入完整的url, 包括http:// (eg, 输入http://api.test.cn)

6. POST 文件的使用方法

与其他POST请求中添加key-value, json 数据不同的是,这个需要在HTTP 请求中点击“Flies Upload” tab, 点击“添加”, 然后通过“浏览”上传本地的文件。

注意: 参数名称必须为"file"。

7. "CSV Data Set Config" 和 “函数助手对话框”的使用

以增加学生接口(add_stu)为例,在本地创建一个文件,添加name 和sex的值,对脚本设置5个线程或者循环5次,以加入这5个用户。 

右键“线程组” -> “添加” -> “配置元件” -> "CSV Data Set Config",如果仅应用于“增加学生”接口的话,可以直接在“增加学生”接口下面创建"CSV Data Set Config"。

根据下图添加对应的,"Variable Names" 输入"name" 和"sex", 以逗号隔开,为避免插入的数据乱码,将file encoding 设置为utf-8。

由于"CSV Data Set Config"中的变量名为name 和sex,因此在“增加学生”接口的"Body Data" 中将值分别替换为$name, $sex。

由于“phone”的唯一性,每次插入一条学生信息时phone 都要求不一样,所以对后面8位用随机函数来实现。

8. 数据库的应用

以下是JMeter 驱动数据库列表:

数据库

驱动

数据库url

mysql

com.mysql.jdbc.Driver

jdbc:mysql://host:port/dbname?allowMultiQueries=true

oracle

org.postgresql.Driver

jdbc:postgresql:dbname

PostgreSQL

oracle.jdbc.driver.OracleDriver

jdbc:oracle:thin:user/pass@//host:port/service

MSSQL

com.microsoft.sqlserver.jdbc.SQLServerDriver

或者

net.sourceforge.jtds.jdbc.Driver

jdbc:sqlserver://IP:1433;databaseName=DBname

或者

jdbc:jtds:sqlserver://localhost:1433/"+"library"

以下以mysql 数据库为例。

添加一个"JDBC Connection Configuration", 根据上表中对mysql的要求设置下图的值。 

添加一个"JDBC Request", 由于在Query 中有insert 和select, 所以Query Type 需要选择"Callable Statement", 如果是单个的select 或者insert,可以选取对应的Select Statement 和Update Statement。

通过察看结果数看到"JDBC Request" 请求成功,响应数据里返回insert 和select 的结果。

登陆mysql 数据库,查询发现和Jmeter 中通过察看结果数看到的结果一致。

 **注意点:修改Jmeter 中的中文乱码要将"\\bin" 路径下的"jmeter.properties" 文件中设置为 "sampleresult.default.encoding=utf-8",如下所示。

对于Jmeter 里中文显示不出来的问题,可以打开"\\bin" 路径下的"jmeter.properties" 文件,如下图所示,将这几个JS开头的注释去掉。

对于以上两个问题,修改后,需将Jmeter 重启才能起效。

用Jmeter进行接口测试及乱码问题

 

web接口测试工具:

     手工测试的话可以用postman ,自动化测试多是用到 Jmeter(开源)、soupUI(开源&商业版)。

     技术分享图片

下面将对前一篇Postman做接口测试中的接口用Jmeter来实现。

一、Jmeter 的使用步骤

打开Jmeter 安装包,进入in 中,找到"jmeter.bat", 点击打开即可。

在下图打开的Jmeter 页面中,右键“测试计划” -> “添加” -> "Threads(Users)" -> “线程组”, 建立线程组。

技术分享图片

右键“线程组” -> “添加” -> “Sample” -> “HTTP请求”, 输入“服务器名称或IP”,对应的端口号,http默认端口号80,可以不写。

以下请求为GET, 所有“方法”那选择“GET”, 输入对应的路径,添加参数及值。

技术分享图片

注意: “服务器名称或IP”中不用输入http://, 请求时会自动加入(eg, 输入api.test.cn).

技术分享图片

右键“线程组” -> “添加” -> “监听器” -> “察看结果数”, 添加“察看结果数”, 以察看运行后的结果,如果所示。

技术分享图片

这是一个简单的接口请求例子。

二、接口请求实例

1. “用户定义的变量” 的应用

以获取学生信息接口(stu_info) 为例,添加一个“用户定义的变量”,设置变量"host" 以及值,这样在获取学生信息接口(stu_info)就可以通过"${host}"取得“服务器名称或IP”的值。

技术分享图片

技术分享图片

 

登陆接口(login)接口也可以应用“用户定义的变量”的方法,如上图所示,在“用户定义的变量”中添加"username", "password" 变量及对应的值, 应用到登陆接口(login)接口请求中即可。

技术分享图片

 2. "HTTP Cookie 管理器"的应用

以金币充值接口(gold_add)为例,建立一个HTTP请求改名“金币充值”,选取请求方式POST, 输入对应的host, path以及同请求一起发送的参数和值。

技术分享图片

由于此接口有权限验证,需要admin用户才可以做操作,需要添加cookie, 因此需要添加"HTTP Cookie 管理器"以传递Cookie。

添加"HTTP Cookie 管理器" 方法如下图所示, 右键“金币充值” -> “添加” -> “配置元件” -> "HTTP Cookie 管理器" 

技术分享图片

设置Cookie 的名称(即username 的值),值(即login Response 中的sign 值),域(已在“用户定义的变量”中设置,只需输入变量即可,格式为${host})

技术分享图片

最后可以通过“察看结果数”的响应数据查看结果。

3. 建立接口间的关联

以下以登陆接口(login)和金币充值接口(gold_add)为例,在这两个接口间建立关联,让金币充值接口(gold_add)可以实时取得登陆接口(login)的"sign" 值,不必再“HTTP Cookie 管理器”中手动输入最新的sign 值。

从“察看结果树”可以看出,登陆接口(login)的Response 结构为Json格式, sign 在 login_info 里面一层。

技术分享图片

3.1 应用"[email protected] - JSON Path Extractor" 来实现

右键“登陆” -> “后置处理器 -> "[email protected] - JSON Path Extractor" 

技术分享图片

通过“察看结果数”得到Response 的结果后, 将“JSONPath Expression” 输入"$.login_info.sign", 设置变量"sign2", 给金币充值接口(gold_add)用

技术分享图片

因此需要在“HTTP Cookie 管理器”中将${username}的值输入${sign2},代替之前手动输入的那一串码。

技术分享图片

3.2 右键“登陆” -> “后置处理器 -> "正则表达式提取器" 

技术分享图片

输入对应的值, "[email protected] - JSON Path Extractor" 中类似,将“引用名称”输入"sign2",以保证和“HTTP Cookie 管理器”的一致。将正则表达式中的式用login 接口返回的 "sign": "cd2b43f1688e472e3a516b5a2c6831e8",  中的一串码用(.*) 替换即可。

技术分享图片

各参数的含义参考下表:

参数

释义

引用名称

在HTTP等请求中,引用此数据,需要用到的名称

正则表达式

用于将需要的数据提取出来

模板

表示使用提取到的第几个值:
$-1$:表示取所有值
$0$:表示随机取值
$1$:表示取第1个
$2$:表示取第二个
以此类推:$n$:表示取第n个

匹配数字(0代表随机)

0 代表随机取值,1 代表全部取值

缺省值

如果正则表达式没有搜找到值,则使用此缺省值

4. 设置断言

以“增加学生”接口(add_stu)为例,增加响应断言,以验证添加的数据是否成功。如下图所示设置

技术分享图片

通过“察看结果数”可以看到“增加学生” 金币结果为绿色,同时响应数据里的确有断言中的设置的"1000"。

 技术分享图片

 5. “HTTP信息头管理器”的使用

以下图中的“获取所有学生信息” 为例,右键“获取所有学生信息” -> “添加” -> “配置元件” -> "HTTP Cookie 管理器" , 输入对应的名称和值即可。

注意:  这里的值需要输入完整的url, 包括http:// (eg, 输入http://api.test.cn)

技术分享图片

6. POST 文件的使用方法

与其他POST请求中添加key-value, json 数据不同的是,这个需要在HTTP 请求中点击“Flies Upload” tab, 点击“添加”, 然后通过“浏览”上传本地的文件。

注意: 参数名称必须为"file"。

技术分享图片

7. "CSV Data Set Config" 和 “函数助手对话框”的使用

以增加学生接口(add_stu)为例,在本地创建一个文件,添加name 和sex的值,对脚本设置5个线程或者循环5次,以加入这5个用户。 

技术分享图片

右键“线程组” -> “添加” -> “配置元件” -> "CSV Data Set Config",如果仅应用于“增加学生”接口的话,可以直接在“增加学生”接口下面创建"CSV Data Set Config"。

技术分享图片

根据下图添加对应的,"Variable Names" 输入"name" 和"sex", 以逗号隔开,为避免插入的数据乱码,将file encoding 设置为utf-8。

技术分享图片

由于"CSV Data Set Config"中的变量名为name 和sex,因此在“增加学生”接口的"Body Data" 中将值分别替换为${name}, ${sex}。

技术分享图片

由于“phone”的唯一性,每次插入一条学生信息时phone 都要求不一样,所以对后面8位用随机函数来实现。

技术分享图片

8. 数据库的应用

以下是JMeter 驱动数据库列表:

数据库

驱动

数据库url

mysql

com.mysql.jdbc.Driver

jdbc:mysql://host:port/{dbname}?allowMultiQueries=true

oracle

org.postgresql.Driver

jdbc:postgresql:{dbname}

PostgreSQL

oracle.jdbc.driver.OracleDriver

jdbc:oracle:thin:user/[email protected]//host:port/service

MSSQL

com.microsoft.sqlserver.jdbc.SQLServerDriver

或者

net.sourceforge.jtds.jdbc.Driver

 

jdbc:sqlserver://IP:1433;databaseName=DBname

或者

jdbc:jtds:sqlserver://localhost:1433/"+"library"

 

以下以mysql 数据库为例。

添加一个"JDBC Connection Configuration", 根据上表中对mysql的要求设置下图的值。 

技术分享图片

添加一个"JDBC Request", 由于在Query 中有insert 和select, 所以Query Type 需要选择"Callable Statement", 如果是单个的select 或者insert,可以选取对应的Select Statement 和Update Statement。

技术分享图片

通过察看结果数看到"JDBC Request" 请求成功,响应数据里返回insert 和select 的结果。

技术分享图片

登陆mysql 数据库,查询发现和Jmeter 中通过察看结果数看到的结果一致。

技术分享图片

 

 **注意点:修改Jmeter 中的中文乱码要将"in" 路径下的"jmeter.properties" 文件中设置为 "sampleresult.default.encoding=utf-8",如下所示。

技术分享图片

对于Jmeter 里中文显示不出来的问题,可以打开"in" 路径下的"jmeter.properties" 文件,如下图所示,将这几个JS开头的注释去掉。

技术分享图片

对于以上两个问题,修改后,需将Jmeter 重启才能起效。






以上是关于用Jmeter进行接口测试的主要内容,如果未能解决你的问题,请参考以下文章

用Jmeter进行接口自动化测试工作流程

用Jmeter进行接口测试及乱码问题

用阿里巴巴官方给Jmeter开发的Dubbo sampler取样器进行dubbo接口测试图解剖析

用Jmeter进行接口测试

用Jmeter进行接口测试

用JMeter进行接口测试