接口测试
一、接口测试的简介和分类
接口分为硬件接口和软件接口。
接口:是数据交互的通道,在系统或组件之间,完成数据的传递。
接口类型
按划分形式,大致分为3类:
- 按协议分,协议不同,接口类型不同。HTTP、TCP、UDP、IP、FTP、USB
- 按语言划分。java、python
- 按范围划分。系统之间 和 程序内部。
- 系统之间:内部系统之间,内部和外部系统之间。
- 程序内部:
分类:
测试外部接口:测试被测系统和外部系统之间的接口。(只需要测试正例)
测试内部接口:
- 内部接口只提供给内部系统使用。(预算系统,承担系统。只需测试正例)
- 内部接口提供给外部系统使用。(测试必须非常全民,各种异常场景,权限控制)
二、接口测试的理论以及用例的设计
- 数据(预期结果)从哪来
- 根据用户需求
- 怎样校验:借助工具、代码模拟客户端、
用工具或代码模拟客户端,向服务器发送请求,校验服务器回发的响应数据是否与预期结果一致。
接口测试是站在用户的角度,
-
拿到接口api文档(通过抓包工具获取),熟悉接口业务,接口地址,鉴权方式,入参、出参,错误码。
-
编写接口用例及评审。
思路:
- 正例:输入正常入参,接口能够成功返回数据。
- 反例:
- 鉴权反例:鉴权码为空,鉴权码错误,过期,失效…
- 参数反例:参数为空,类型异常。
- 错误码覆盖:根据业务而定。
- 其他错误场景:接口黑名单,接口调用次数限制,分页场景。
-
使用接口测试工具Postman执行接口测试
-
Postman+Newman+Jenkins实现持续集成,并且输出测试报告并且发送邮件。
三、微信公众平台接口
获取权限:
AppId(ID):
secret(密匙):
四、Postman介绍
- postman界面介绍
- Collections 集合,项目集合
- APIs api文档
- Environments 环境变量,全局变量
- Mock Server 虚拟服务器
- Monitors 监听器
五、执行接口测试
请求页签:
- Params :get请求传参
- Authorization:鉴权
- Headers:请求头
- Body:post请求传参
- none :没有参数
- form-data:即可以传键值对参数也可以传文件
- x-www-from-urlencoded :只能过传键值对参数
- row: 可以传json、text、html、javascript
- binary:把文件以二进制的方式传参
- pre-request Script:请求之前的脚本
- test:请求之后的断言
- cookies:用户管理cookie信息
响应页签:
- Body:接口返回数据
- Pretty:以json、html、xml…不同格式查看返回的数据
- row:以文本的方式查看返回的数据
- preView:以网页的方式查看返回的数据
- cookies:下班个图的cookie信息
- Headers:响应头
- testResult:断言的结果
- 200 状态码 ,681MS 响应的时间 ;343B 响应的字节数
get和post请求的区别
- get一般是获取数据,post请求一般是提交数据
- post比get安全
- 本子区别是传参方式不一样
- get请求在地址栏后面以?的方式传参,多个参数之间用&分隔。
- post请求是在body以表单的方式传参。
问题
- 多种环境:开发环境,测试环境,生成环境。
- 接口关联:需要手动连接
- 参数需要手动修改
六、环境变量以及全局变量
- 环境变量:环境变量就是全局变量
- 全局变量:全局变量是能够在任何接口里面访问的变量
- 在environment里设置环境变量
获取全局变量和环境变量的值是通过:{{变量名}}
七、接口关联
1.使用json提取器实现接口关联
console.log(responseBody);
//1.使用json提取器提取token值
//2.把返回的字符串格式的数据转换成对象的形式
var result=JSON.parse(responseBody);
console.log(result.access_token);
//3.把access_token设置为全局变量
//pm.globals.set("access_token", "result.access_token"); 错误写法
pm.globals.set("access_token", result.access_token);
//改第二个接口:{{access_token}}
2.使用正则表达式实现接口关联
//使用正则表达式提取器实现接口关联,match匹配。
//var result=responseBody.match(new RegExp('{"access_token":"(.*?)","expires_in":7200}')); 错误写法
var result=responseBody.match(new RegExp('"access_token":"(.*?)","expires_in":7200'));
console.log(result);
//获取下标为1的值: result[1]
//设置为全局变量
//pm.globals.set("access_token", "result[1]""); 错误写法
pm.globals.set("access_token", result[1]);
八、内置动态参数以及自定义的动态参数
内置动态参数:
- {{$timestamp}} 生成当前时间的时间戳
- {{$randomInt}} 生成0-1000之间的随机数
- {{$guid}} 生成速记GUID字符串
自定义动态参数
//在pre-request Script页面输入代码
//手动获得时间戳
var times=Date.now();
//设置为全局变量
pm.globals.set("times", "times");
使用时:{{times}}
获取标签id:在2.创建标签接口的–Tests(请求之后的断言)里编写
//用正则表达式获得创建的标签ID
var tag_id=responseBody.match(new RegExp('"id":(.*?),'));
console.log(tag_id[1]);
//把标签id设置为全局变量
pm.globals.set("tag_id",tag_id[1]);
//引用 {{tag_id}}
注意:
**编写脚本时要特别注意他们的双引号,有时候有双引号就成功了,有时候没有双引号才能成功。**不明白原因是什么。
九、接口闭环
增改查删
序号 | 获取方式 | 操作 | URL | 其余操作 |
---|---|---|---|---|
1 | Get | 获取token | 在Tests里,用JSON或正则获取动态token | |
2 | POST | 创建 | https://{{ip}}/cgi-bin**/tags/create**?access_token={{access_token}} | 在body里输入要上传的参数,在Tests里获取id;在pre-request Script里设置变量 |
3 | POST | 编辑 | 在body里输入要修改的id,以及内容 | |
4 | GET | 查看 | 没有其余操作,只用输入url即可 | |
5 | POST | 删除 | 在body里输入要删除的id | |
6 | POST | 文件上传 | body里选择form-data可以用文件形式上传图片 |
十、断言
常用六种断言
Status code is 200 :检查返回的状态码是否为200
Response body :Contains string :检查响应中包含指定字符
Response body :Json value check :检查响应中的json值
Response body :is equal to a string : 检查响应等于一个字符串 用于返回结果很少的时候
Response headers :Content-Type :检查是否包含响应头Content-Type
Response time is less than 200ms :检查请求耗时小于200ms
断言有状态断言和业务断言,状态断言一般只有一个,业务断言有多个。在Tests里进行编写。
状态断言:判断状态码是否为200.
业务断言:那获取token来说,就是判断响应中是否包含access_token。
获取自定义动态参数的方式
不能使用自带的动态参数。
//获取全局变量
pm.globals.get("variable_key");
pm.expect(pm.response.text()).to.include("花蝴蝶" + pm.globals.get("times"));
//globals["times"]
pm.expect(pm.response.text()).to.include("花蝴蝶" + globals["times"]);
//globals.times
pm.expect(pm.response.text()).to.include("花蝴蝶" + globals.times);
全局断言
点击项目右边的…—》选择Edit,进入页面—》在tests里编写
例如状态码判断断言,就可以写在里面
//状态断言
pm.test("检查返回码状态为200", function () {
pm.response.to.have.status(200);
});
十一、批量运行测试用例
在接口文档第10页
十二、数据驱动之CSV文件和JSON文件的处理(进行反例测试)
对1.获取鉴权码token接口进行反例测试
在接口文档第11页
十三、必须带请求头的接口
例如,测百度,就必须要有请求头才能进行查看页面,不然只有链接
常见的请求头:
Host:请求的主机地址
Connection 链接方式
Accept 客户端接收到的数据格式
X-Requested-With 异步请求
User-Agent 客户端的用户类型
Referer 来源
Cookie cookie信息
Content-Type 请求内容的格式
十四、Mock Server 服务器
mock 模拟;后端的借口还没开发完成,前端的业务需要调用后端的接口。就需要用到
在接口文档,12~14页
十五、postman的cookie鉴权,token鉴权
什么是cookie?
cookie是一小段文本,格式:key=value
cookie的鉴权原理:
1.当客户端第一次访问服务器的时候,那么服务器就会成成Cookie信息,并且在响应头的set-cookie里面吧生成的cookie信心发送给客户端。
2.当客户端低2-N次访问服务器的时候,那么客户端就会在请求头的cookie带上cookie信息,从而实现鉴权。
cookie的分类:
会话cookie:保存在内存,当浏览器关闭之后就会自动化清除cookie。
持久cookie:保存在硬盘,浏览器关闭后不会清除,只有当失效时间到了才会自动清除。
十六、Postman实现接口的加密和解密(视频漏了这节课)
1.两种加密方式
对称式加密:DES,AES,Base64加密算法
非对称加密:双钥(公钥、私钥)加密,RSA加密算法
不考虑解密:MD5、SHA1、SHA3
2.Postman如何实现加密和解密
MD5最广泛
使用心得:对着视频教学时,觉得很简单,但是自己操作时却无从下手。纸上得来终觉浅,绝知此事要躬行。也有一部分原因是我看的教学视频不完整,太笼统了。
接口测试
一、接口测试的特点
- 测试可以提前介入,提早发现bug,符合质量控制前移的理论。
- 可以发现一些页面操作发现不了的问题;接口测试可以实现自动化测试。
- 不同于传统的单元测试,接口测试是从站在亭湖角度产开吃的
接口概念:测试系统或组件之间交互的数据的正确性,以及逻辑依赖关系的正确性!
原理:
模拟客户端向服务器发送请求,服务器接受请求后进行相应的业务处理,并向客户端返回响应数据是否符合预期。
二、接口类型
类型:
- 按协议分:tcp、ftp、udp
- 按语言分:java、python、c++
- 按范围分:
- 系统之间:内部系统之间、内部系统和外部系统之间
- 系统内部:函数与函数、方法与方法、类与类、模块与模块
二、HTTP协议
1.http协议的概念:
-
超文本传输协议,基于请求和想要模式的,应用层协议。
-
支持客户端/服务器2.简单快读,灵活,无连接,无桩体
特点:1.支持客户端/服务器2.简单快速3.灵活4.无连接,无状态。
2.URL格式:
协议:http:80端口;https:443端口
域名: 😕/ 分隔符 本质:ip地址 端口号
3.http请求协议
三、接口测试流程
- 需求分析
- 主要依据需求文档
- 接口文档解析
- 一般由开发人员编写接口文档
- 设计测试用例
- 执行测试
- 使用接口测试工具实现
- 通过编写大妈实现
- 接口缺陷管理与跟踪
- 生成测试报告
- 接自动化持续集成