接口测试
接口概论
应用程序编程接口(application programming interface , api),预先定义的函数或软件系统不同组成部分(子系统OR模块)衔接的约定
- 测试金字塔
Unit(单元,白盒)-> Service(接口集成,黑盒)-> UI(系统)
接口分类
- 程序接口(代码接口)
- 协议接口(http协议)
- http接口
- WebService
http(s) -> json
工具:SoapUI ,jmeter,loadrunner….
SOAP -> xml
工具:postman,RESTClient,jmeter,loadrunner….
接口测试
主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点,重点在于检查数据的交换和传递和控制管理的过程
http超文本传输协议
- 应用层协议
- 请求 / 响应(request / response) 机制
client <——-> server
- 抓包
- wireshark
- fildder
- request
- 请求行 request line : method,URI,协议/版本
- header:描述请求细节,键值对
- body:请求传输的数据信息
- response
- 状态行 response line:协议/版本,状态码,描述
- header:
- body
- URL/URI
协议://{主机名:端口号}/路径/资源文件名?参数名=参数值
接口测试的核心工作
request 构建接口请求 -> response 获取接口响应 -> validation 校验响应结果
api文档
- 属于概要设计阶段
- 内容:接口说明,调用URL,请求方法,请求参数、参数类型、说明、请求header,返回参数 说明、请求响应代码、响应内容
接口测试流程
- 熟悉业务流程
- 分析接口文档
- 编写接口测试用例
- 提出测试并开始
- 提交测试报告
通用接口用例设计
- 通过性验证
首先肯定要保证这个接口功能是正确的,也就是正常的通过性测试,按照接口文档上的参数,正常传入,是否可以返回正确的结果
- 参数组合
现在有一个操作商品的接口,有个字段type,type传1的时候代表修改商品,商品id、商品名称、价格有一个是必传的,这样就要测参数组合了,type传1的时候,只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功。
- 接口安全
- 绕过验证
- 绕过身份授权
- 参数是否加密
- 密码安全规则
如购买了一个商品,它的价格是300元,那我在提交订单时候,我把这个商品的价格改成3元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加
如修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,传一个其他的卖家能不能修改成功
如登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息 加密规则是否容易破解
对密码的复杂程度校验
- 异常验证
就是不按照接口文档上的要求输入参数,来验证接口对异常情况的校验
Jmeter
- 环境配置
- java8以上
- 用bin/jmeter.bet打开
- 接口测试
- 添加线程组
- 取样器 -> HTTP请求
- keep-alive:http->Connecion(close短连接,keep-alive长连接),在tcp握手后可发送请求在收到响应后挥手,http1.1新特性为可在建立连接后待所有的请求和响应结束后再挥手,用keep-alice去保持该状态
- http接口更新时可用自动重定向
- 在post响应太大可用multtpast去把它部分化
- post提交json格式的数据或文档 -> 消息体数据 / 文件上传
- post提交追加head和cookie -> Http Cookie 管理器 / head管理器(注意路径)
- 监听器 -> 结果树
- 响应断言(assert)
- 变量定义
- 多用户批量测试
- 函数
- 数据驱动测试(data drvier test)
- 流程
- 数据源参数化
- 关联
- 逻辑控制器
- 简单控制器
配置元件 -> 用户定义的变量 / 用户参数 -> ${ | 变量名 | } (引用)
全局变量 -> 测试计划内设置
n个线程数 <———> n 用户参数
工具 -> 函数助手
需要准备大量不同的数据,用CSV数据配置设置(使用csv表格的数据),去实现它
-> csv表格格式
|变量名1|,|变量名2|
|1.valua|,|2.valua|
………
(可用文档建立,或者用脚本去大量建立数据,用utf-8编码)
-> 变量名称设置为|变量名1|,|变量名2| (英文逗号)
-> 引用变量至http
-> 设置线程组的线程数或循环次数(对接口的压力不一样)
-> running
前置处理器 -> repuest -> 响应-> 后置-> 结果
接口依赖:A,B接口同时跑,B的一些数据用A接口的结果去请求
解决:后置处理器 -> 正则表达式提取器等 -> “uuid”:“(.+?)” -> $1 or $1$2….
-> json -> $.xxx.xxx
多个接口一起跑时,用它分类(类似文件夹),易于去控制同类型的多个接口的开关
postman
- 流程
pre-request->request->response->test
- 参数化
- 接口依赖(关联)
Moco
- 面向开发作用
- 以http产生的一个模拟服务测试工具
- 在目前前后端分离的开发环境,在它们的交互没有准备好时,可用它去模拟接口
- 面向接口测试的作用
- 在接口还未开发完时,可用它去模拟该接口,提前测试省去实际测试的时间
- http server
jave -jar moco-runner-<version>-standalone.jar https -p 12306 -c foo.json
# jar包位于demo目录下
# http 表示使用协议
# -p 端口号设置
# -c 所使用配置文件
[ "description":"这是一个注释", "request": { "method":"get",//设置请求方法 "uri":"/demo",//请求路径,可无,无时为“/” //"text":"这是请求body", "queries"://请求参数设置 post的设置为forms { "user":"wang", "pass":"123456" }, "cookies"://设置cookie { "login":"true" } }, "response": { "text":"这是响应文本", "headers": { "Content-Type":"text/html;charset=gbk" //可中文的响应配置 } }]