0


JMeter接口测试

基础

一.接口测试分类

内部接口:测试被测系统各子模块之间的接口,或者被测系统提供给内部系统使用的接口。

外部接口:

    1.被测系统调用外部的接口

    2.系统对外提供的接口(要求高)

接口测试重点:检查接口参数传递的正确性,接口功能的正确性,输出结果的正确性,以及对各种异常情况的容错处理,以及权限控制,分页,调用次数的限制。

二.目前接口架构设计

1.基于SOAP架构,基于XML规范,基于WebService协议。

特点:接口地址以?wsdl(WebService描述性语言)结尾

比较老的项目

2.基于RPC架构,基于dubbo、thrift协议、SpringCloud微服务。适用高并发项目

3.基于RestFul架构,基于json规范,基于http协议。大多数项目

RestFul规则:

接口地址:http://127.0.0.1/user,对于不同的请求get(查询)、post(新增)、put(修改)、delete(删除),对用户做不同的操作

接口开发返回字段

(1)error_code错误码,0成功,其他失败

(2)message错误码的中文说明

(3)result返回的具体数据

Json是目前最流行的数据格式,只有两种数据类型:

(1)键值对:{key:value}

(2)数组:[arry1,arry2]

fiddler抓取一个包,右击Save->Selected Sessions->as Text...,通常和开发对接时需要将包发送给开发看,内容如下:

POST http://47.107.116.139/phpwind/index.php?m=u&c=login&a=dorun HTTP/1.1 请求行

请求头

Host: 47.107.116.139 请求主机
Connection: keep-alive 连接状态:保持活跃
Content-Length: 112 内容长度
Accept: application/json, text/javascript, /; q=0.01 数据格式
X-Requested-With: XMLHttpRequest 异步请求
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 客户端类型,浏览器
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 内容类型
Origin: http://47.107.116.139
Referer: http://47.107.116.139/phpwind/index.php?m=u&c=login
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: csrf_token=3c4e568fd6b135f2; Cookie信息,客户端发送给服务器的,第2-N次的时候都带着服务器发送过来的Set-Cookie

W2S_visitor=5v7F0fO8YqLTh3WrIboAAlM%2FeAuLDfhcbA4AyIYtO2pUlN1FjOIOFQ%3D%3D; W2S_lastvisit=568%091652927139%09%2Fphpwind%2Findex.php%3Fm%3Du%26c%3Dlogin%26a%3Dcheckname

请求正文

username=msxy&password=msxy&backurl=http%3A%2F%2F47.107.116.139%2Fphpwind%2F&invite=&csrf_token=3c4e568fd6b135f2
HTTP/1.1 200 OK 响应行

响应头
Server: nginx
Date: Thu, 19 May 2022 02:25:42 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.6.36
Set-Cookie: 服务器发送给客户端的,只在第一次请求的时候 W2S_lastvisit=571%091652927142%09%2Fphpwind%2Findex.php%3Fm%3Du%26c%3Dlogin%26a%3Ddorun; expires=Fri, 19-May-2023 02:25:42 GMT; Max-Age=31536000; path=/
Content-Encoding: gzip
Vary: Accept-Encoding

响应正文

8f
? 幜?C%?諥籲緽З]@BJ?膺I筙v^,鵆咢h!2=陜NG叀z??=?詺顉窺lvP金?璚焪?6顿?稅罠駩?.?辣]伐??烥Km內?棼???
0

请求:请求行、请求头、请求正文(请求行包含请求方式 路径 协议)

响应:响应行、响应头、响应正文

三.市面上的接口测试工具

Jmeter+Ant+Jenkins

Postman+Newman+Git+Jenkins

四.Jmeter简介,安装,环境变量配置

基于Java语言压力测试工具,可以做接口测试,也可做性能测试

安装:JDK1.8以上,配置环境变量

五.Jmeter目录介绍

六.Jmeter常用组件

1.测试计划:测试起点,所有组件的容器

2.线程组:代表一定数量的用户

3.取样器:向服务器发送请求的最小单元

4.逻辑控制器:结合取样器实现一些复杂的逻辑

5.前置处理器:在请求之前的工作

6.后置处理器:在请求之后的工作

7.断言:判断请求是否成功

8.定时器:负责请求之间的延迟间隔。常用的有固定,高斯,随机

9.配置元件:配置信息

10.监听器:收集结果

顺序:测试计划-》线程组-》配置元件-》前置处理器-》定时器-》取样器(请求)-》后置处理器-》断言-》监听器

作用域:

必须组件:测试计划、线程组、取样器

辅助组件:剩余的

辅助组件作用于父组件,同级组件以及同级组件下的所有子组件

七.Jmeter执行接口测试

1.拿到api接口文档(可通过Fiddler工具抓包得到),熟悉接口业务,接口地址,鉴权方式,出参,入参,错误码

接口文档项目 showdoc swagger

2.编写接口测试用例(一个接口大概有20-30个用例)

测试思路:

正例:输入正常入参,查看接口成功返回

反例:

鉴权:空,错误,鉴权过期,鉴权次数限制

参数:空,类型错误,长度错误,错误码的覆盖

其他:黑名单限制、分页

3.使用接口测试工具执行

4.Jmeter+Ant+Git+Jenkins实现持续集成,输出接口测试报告。通过电子邮件发送

执行接口测试

1、新建线程

线程数代表请求多少次

Ramp-Up:代表要用多长时间将线程数加载起来。比如5,5个用户,意味着每隔1.25秒上线一个

Cookie:每次都会带上服务器发送给客户端的cookie

调度器:压力测试中,持续多长时间,多长时间后启动

Set-Cookie:只在第一次请求的时候,服务器才会发送cookie给客户端

2、配置元件

  • 存线程组下必须有HTTP Cookie管理器(储cookie信息,自动管理)

  • HTTP请求默认值

      http:80  https:443
    
  • 用户定义的变量 全局变量

3、取样器

Http请求 不设置会引用配置元件中的,设置后会覆盖配置元件中的

发送http请求,状态为30x时,如果勾选了【自动重定向】,会自动重定向直接跳转到最终页面,【跟随重定向】会记录每个中间每个过程。

【对POST...】文件上传有关,一般不勾选

实战:获取接口同一鉴权码token接口

鉴权码的获取方式两种:

(1)通过接口获取,此接口需要appid,secret,每个微信只有一对

     wx8c1dd816b09d827c     3a268734262c0b22120dea8580dceafc

(2)登录后自动生成, 需要username,password

参数可以带在后面,也可添加在下面

反例:grant_type为空

4、查看结果树

有错误提示,容错处理

接口文档额错误码说明

post请求-编辑标签接口

参数是json格式键值对,在消息体数据里传参

消息体数据和参数不能共存,因为参数是键值对,消息体数据是json,是表单传参,post请求

如果还有其他参数,写在路径里面

先启用获取鉴权码的例子获取到鉴权码,再启用编辑标签窗口的例子返回结果

get和post区别

请求传参方式不同,get是在地址栏后面以?的方式和传参,多个参数之间用&分隔;post是以表单的方式传参

get不安全,post安全

get传参有长度限制,post没有

Jmeter接口关联

RegExp Tester正则表达式的测试

1.使用正则表达式实现接口关联

以xx开头,(.*?)代表要匹配的内容

新建一个正则表达式提取器来取值 $1$代表取第一个取到的值

新建一个调试取样器,可查看全局变量

这时路径中便可写正则表达式 ${xxx}

取两个值

2.使用Jsonpath表达式实现接口关联

$固定开头,.代表以根目录开始(..代表从任意目录开始),取key值

$.expires_in $..expires_in

新建一个JSON提取器取值,JSON提取器只能用于返回是JSON格式的

路径中引用变量名

实现接口业务闭环

增,改,删,查

创建标签接口

解决乱码:jmeter.properties文件

提取出新增时的id,用正则表达式提取器

修改和删除标签时用的是创建的id值

Jmeter动态参数处理

名字不能重复添加,可打开函数助手对话框,设置一个随机数规则,添加到名字后面

将生成的随机函数写入参数中

编辑标签接口

删除标签接口

上传文件接口

注意:图片文件和脚本要在同一目录

返回图片的路径,这个路径要在浏览器中可访问到

另一种方式,直接勾选multipart / form-data,但要设置一下

实现改为Java

如发生错误,图片路径使用相对路径

Jmeter接口测试断言

添加【响应断言】后就不需要看结果,只需看断言是否成功,一般有状态断言和业务断言两种

一般业务断言选择响应文本+字符串+主要业务取得的字段,状态断言选择响应代码+等于+200

1、状态断言

    断言响应码是否为200

2、业务断言

当有错误时断言会提示

Jmeter接口测试调试方案

1.通过【查看结果数】里的请求信息和响应信息判断

2.使用【调试取样器】

3.Jmeter结合Fiddler(在没有接口文档,通过抓包获取接口信息时使用)

使Jmetet中发送的请求在Fiddler中可以看到,再和原来抓的包对比,就可知道哪里出错了。

让Fiddler作为代理服务器。(8888端口被fiddler监控)

当jmeter发送请求时,会通过8888端口发送,从而被fiddler就可以监控到这个请求。

(1)在【HTTP请求默认值】中设置代理服务器(请求完后要把代理服务器去掉)

主要对比请求头和请求数据这两个数据,如果一致,基本没问题。

CSV参数化处理

验证反例,正例和反例的区别仅仅是参数不同,新建一个data.csv文件,里面包含一组正例+三组反例。

assert_str代表断言字符串,当grant_type为空时返回的状态码为40002

在当前请求下,添加【配置元件】【CSV 数据文件设置】

修改请求中的取值方式,取的是数据文件中的值

修改断言中获取值的方式

默认值只执行第一条数据,若要数据多执行几组,修改线程数

但是当线程组设为4后,里面所有的接口都会执行4次,现在只需当前接口执行4次,可添加【逻辑控制器】【循环控制器】,再将需要循环的接口放入循环控制器下

注意,将循环四次接口复制到原来的增删改查中使要注意顺序,只有先获得token值后才可增删改查

必须带请求头的接口

百度搜索,输入接口的路径和参数却得不到预期的响应数据,和在浏览器中看到的不一致,因为该请求必须带请求头。

Fiddle抓包,找到含wd的,复制所有请求头,添加【配置元件】【HTTP信息头管理器】粘贴信息头

HTML Source Formatted方式查看,便和百度中的一样了

(注:用参数的方式传wd参,结果不正确,加到url后面可以,未解决)

User-Agent请求头是必须的,代表用浏览器发送请求,不加的话代表Jmeter发送请求,浏览器不响应。

哪些需要请求头哪些不需要,是开发设置的

如果没有接口文档的情况下,怎么做更好

可以使用jmeter的脚本录制功能,不用抓包,只要在页面上访问就会录制脚本(使用jmeter自带的http代理服务器实现,把jmeter作为代理)

1.在测试计划下添加【非测试元件】【HTTP代理服务器】,端口默认8888,目标控制器为一个干净的线程组,Type为默认,如果录制不到再选java

2.设置本机的请求通过代理发送,地址为jmtet安装的主机地址

3.点击启动,在浏览器中访问一个请求

4.录制的请求如何知道自己需要的,HTTP代理服务器中过滤排除,在后面加.*

5.将需要的请求放入新的线程组,有请求数据的包就是需要的包,录制完后intenet设置还原。

例如:访问47.107.116.139/phpwind/,进行访问首页和登录操作,可用的接口提取出来建立一个线程组,运行看是否能响应成功。

注意:登录接口中的csrf_token是在访问首页接口中得到的,需要用正则表达式提取出来,再在登录接口中调用。

Fiddler简介

位于客户端和服务器之间的一个HTTP代理

作用:接口测试和接口调试,线上环境调试,判断前后端的bug等

实现:默认是没有设置代理的,当fiddler打开后,自动改变了浏览器的代理设置,端口为8888,所有的请求都会经过这个端口

有锁的包,Tunnel to是通道包,对我们没用,需要隐藏

是否要将fiddler作为代理,是需要勾选的

Fiddler默认抓不到https的包,设置抓取https包 tools->options

1、

2、

Inspectors查看

WebForms中查看用户名和密码,Raw查看报文

AutoResponder线上服务器调试

Composer接口测试

FiddlerScript 弱网测试

Filter 过滤器

抓包

1.设置过滤器

2.Shift+F5去缓存刷新,可以抓到所有的包

3.登录,怎么知道具体是哪个包,在WebForm中看是否有输入的用户名和密码

调试线上环境

将原先的图片替换掉,先将原来的图片拖到右面,下拉处选择Find a File,找到替换图片,点击save

也可将代码复制另存为另一个html文件后,修改代码,再引入。

Jmeter中的Bean Shell组件和语言规则

Bean Shell是一种完全符合Java语法规则的脚本语言,同时还有自己的语法规则

Jmeter中有哪些Bean Shell

1.前置处理器中Beanshell预处理程序

2.定时器中Beanshell定时器

3.取样器:Beanshell

4.后置处理器:Beanshell

5.断言BeanShell

6.监听器BeanShell

BeanShell的内置变量很语法规则

1.log 打印日志

打开日志

2.vars 表示:Jmetervariables,操作jmeter变量(只能在当前线程组使用)

1)【用户定义的变量】

获取定义的变量值

2)正则表达式,JSON提取器

3)定义变量

BeanShell里的变量是通用的,在一个里面设置的变量在同一线程组的其他BeanShell组件中可以取到

3.props 用于存取Jmeter的全局静态变量(可以跨线程组)

在配置文件中的变量是全局变量,也可设置,但设置的值不会显示在配置文件中

4.prev 获取到前一个取样器返回的信息 (如响应码和响应数据)

5.ctx 获取上下文所有的变量

比如有的接口需要加密处理,加密方式是开发自定义的,Jmeter就无法实现,我们可以在【用户定义的变量】中定义用户名和密码,在BeanShell中提取出来并做自定义的加密规则。

凡是Jmetet做不到的都可以使用BeanShell解决。

Jmeter执行数据库操作

1、准备数据库的驱动jar包

方式一:在测试计划里面引用,最下面

方式二:放到jmeter的lib目录,常用

2、新建一个【JDBC Connection Configuration】,放在前面

    phpwind是数据库名称

3、新建【JDBC Request】

test表示使用的是"test"这个连接,写SQL语句,结果保存在result变量中

4、使用BeanShell提取数据表中的用户名和密码字段(取第一条数据),保存在变量中

5、将取得的数据在其他请求中使用,查看请求体a和b是否传出值了

Jmeter的非GUI(界面)方式运行

Jmeter最终要和Jenkins持续集成,那么就要摆脱工具,在dos窗口中

1.执行JMX文件的命令:jmeter

2.命令行参数 -n:非界面方式运行 -t:指定jmx文件的位置 -l:指定生成的jtl格式的结果

jmeter -n -t 鉴权码.jmx //执行完后没有结果

jmeter -n -t 鉴权码.jmx -l result.jtl //执行完的结果保存在result.jtl文件中

jtl文件不能直接打开看,需要在jmeter【查看结果树】中引用再查看

-e:生成html报告 -o:指定html报告存放的文件夹(必须是空目录),

jmeter -n -t 鉴权码.jmx -l result.jtl -e -o report //存放在report文件夹下

实现方式:Jmeter

怎么测:模拟客户端,向服务器发送请求

测什么:测试服务器针对客户端请求,回发的响应数据是否与预期结果一致

人眼对比、断言

Get(查询) delete(删除)请求没有请求体 只有post(添加,常用在登录) put(修改)请求有请求体

Jmeter+Ant+Jenkins实现持续集成

1、下载Ant并解压,解压之后把ant的bin目录设置到path环境变量中

官网下载地址 ,注意下载Java8的版本

检查是否安装成功

2、需要一个build.xml文件,并且把build.xml和脚本文件(鉴权码.jmx)放在同一目录下

3、配置全局配置文件jmeter.properties

4、输入ant命令执行所有用例

jmeter中可扩展的功能:接口加密,接口签名,BeanShell(自定义函数,引用外部java文件,class文件,jar包),websocket协议接口,dubbo协议接口

有jmeter和postman,为什么还要接口自动化

好多项目都是敏捷开发,接口巨大,需要实现团队协作,版本控制

功能已经限定,很难扩展

不同协议的接口

找错,定位问题

生成的报告不好

日志监控太简陋

用jmeter等工具的情况:小型项目,外部项目

所有数据驱动

标签: 测试工具

本文转载自: https://blog.csdn.net/qq_44278313/article/details/124856464
版权归原作者 爱吃的同学 所有, 如有侵权,请联系我们删除。

“JMeter接口测试”的评论:

还没有评论