
接口
接口是系统或组件(组成某个系统的部件之一)之间的交互点,通过这些交互点可以进行数据的交互。
接口的类型
按划分形式,大致分为3类
按协议分,协议不同,接口类型不同。HTTP、TCP、UDP、FTP、USB
按语言分类。Java、Python、C++、PHP
按范围划分。系统之间和程序内部
系统之间,内部系统之间、内部系统和外部系统之间
程序内部,方法(函数)和方法(函数)之间、类和类之间、模块和模块之间
接口测试
对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互依赖关系。
数据是否正确?逻辑依赖关系是否正确?
原理
模拟客户端向服务器发送请求,服务器接受请求后进行相应的业务处理,并向客户端返回响应数据,检查响应数据是否符合预期。
- 数据(预期结果)
- 从用户需求来
- 怎样校验
- 借助工具、代码模拟客户端,组织数据(没有前端也可以完成)
特点
- 测试可以提前介入,提早发现Bug,符合质量控制前移的理念
- 可以发现一些页面操作发现不了的问题
- 接口测试低成本高收益(底层的一个Bug可以引发上层8个左右Bug,接口测试可以实现自动化)
- 从用户的角度对系统全方面进行全面的检测
实现方式
- 使用接口测试工具实现:JMeter、Fiddler、Postman
- 通过编写代码来实现:Python+Requests+Unittest
- 依赖断言去判断
HTTP协议
HTTP(Hyper Text Transfer Protocol):超文本传输协议,是一个基于请求与响应模式的、应用层的协议,也是互联网上最为广泛的一种协议
特点
- 支持客户端/服务器模式
- 简单快速
- 灵活
- 无连接
- 无状态
URL
URL(Uniform Resource Locator)统一资源定位符,是互联网上标准资源的地址。HTTP使用URL来建立连接和传输数据。
URL格式
http://www.itcast.cn:8080/news/index.html?uid=123&page=1
http
:协议
www.itcast.cn
:域名(ip),定位网络环境中的一台主机
8080
:端口号,在网络主机上定位一个应用。没有指定端口号,默认跟随协议。
news/index.html
:资源路径,对应网页的源代码或网络中的一个数据资源。
uid=123&page=1
:查询参数,可以有多个,用&分割
- 端口:
- http协议默认端口:80
- https协议默认端口:443
- mysql默认端口:3306
- redis缓存数据库默认端口:6379
- Oracle默认端口:1521
- 资源路径:
- 资源路径可以为空(没有),相当于”/“
- 如果没有查询参数,资源路径从域名(端口)之和
- 如果有查询参数,资源路径为?之前,域名(端口)之和的所有内容
- 查询参数:传参给网页源代码
HTTP请求
- 由客户端发送给服务器
- 规定了数据的语法格式
由四部分组成:请求行、请求头、空行、请求体
请求行
- 作用:指定请求方法、请求资源
- 语法格式:请求方法(空格)URL(空格)协议版本(\n\r)
- 请求方法:
- GET:查询,没有请求体
- POST:新增,有请求体,登录注册主要使用
- PUT:修改,有请求体
- DELETE:删除,无请求体
- URL:数据资源的定位符。协议://域名:端口/资源路径?查询参数&…
- 协议版本:
- http1.1/http1.2/http2.0
- 主要使用http1.1
请求头
作用:向服务器描述客户端(浏览器)的基本信息
语法:k: v
User-Agent:向服务器描述浏览器的类型
Content-Type:向服务器描述请求体的数据类型
请求体
- GET、DELETE请求方法没有请求体
- POST、PUT请求方法有请求体
- 请求体的数据类型,收请求头中的Content-Type的值影响
HTTP相应
- 作用:由服务器回发给客户端
- 规定了服务器回发给客户端的数据语法格式
组成:响应行(状态行)、响应头、空行、响应体。整体称为响应包/响应报文
响应行
- 语法格式:响应版本(空格)状态码(空格)状态码描述\r\n
- 协议版本:http1.0/http1.1/http2.0
- 状态码:针对http请求响应的状态
- 第一个数字定义了响应的类别
- 1xx:指示信息,表示请求已接受,继续处理,请求需要进一步访问
- 100 Continue
- 101 Switching Protocols
- 2xx:成功,表示请求已被成功接受、理解、接受
- 200 OK
- 201 Created
- 202 Accepted
- 203 Non-Authoritative Information
- 204 No Content
- 205 Reset Content
- 206 Partial Content
- 3xx:重定向,要完成请求必须进行更进一步的操作
- 300 Multiple Choices
- 301 Moved Permanently
- 302 Found
- 303 See Other
- 304 Not Modified
- 305 Use Proxy
- 307 Temporary Redirect
- 4xx:客户端错误,请求有语法错误或请求无法实现
- 400 Bad Request
- 401 Unauthorized
- 402 Payment Required
- 403 Forbidden(请求的文件/资源存在,但是没有访问权限)
- 404 Not Found(请求的资源/文件不存在)
- 405 Method Not Allowed
- 406 Not Acceptable
- 407 Proxy Authentication Required
- 408 Request Timeout
- 409 Conflict
- 410 Gone
- 411 Length Required
- 412 Precondition Failed
- 413 Request Entity Too Large
- 414 Request-URI Too Long
- 415 Unsupported Media Type
- 416 Requested Range Not Satisfiable
- 417 Expectation Failed
- 5xx:服务器端错误,服务器未能实现合法请求
- 500 Internal Server Error
- 501 Not Implemented
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
- 505 HTTP Version Not Supported
- 1xx:指示信息,表示请求已接受,继续处理,请求需要进一步访问
- 第一个数字定义了响应的类别
- 状态描述:对状态码的说明
响应头
作用:向客户端(浏览器)描述服务器的基本信息
语法:k: v
Content-Type:向客户端(浏览器)描述响应体的数据类型
响应体
- http的响应报文大多数有响应体,重定向没有响应体
- 响应体的数据类型,受响应头中Content-Type的值的影响
- 常见的类型:
- json类型
- 表单类型
- 图片类型
传统风格接口
对用户进行操作的相关接口,包括增删改查
- 使用GET、POST实现所有数据的增删改查操作
- 针对用户的某一个操作,URL不唯一,同一个用户操作对应不同的URL
- 状态码统一使用200
优点:
对开发的技术要求低。只需要GET、POST方法
代码实现灵活
缺点:相同功能的实现代码不唯一
RESTful风格接口
一种软件架构风格、设计风格,不是标准。提供了一组设计原则和约束条件
REST(Representational State Transfer)的缩写,表现层状态转化。如果一个架构符合REST原则,称它为RESTful架构
- 使用GET/POST/PUT/DELETE分别表示增、查、改、删
- 使用一个url对应一个唯一的资源
- 状态码根据实际操作请求加以区分。(实际操作中都返回200,在响应体中描述成功/失败)
界定RESTful风格接口
- 请求方法:使用get、post、delete、put对应查、增、删、改
- 数据资源的定位符(url)是否唯一
- 在url中不使用动词,替换使用名词。结合请求方法,界定具体操作
RESTful架构特点
- 每一个URL代表一种资源
- 客户端和服务器之间传递这种资源的某种表现层
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现“表现层状态转化:
- 接口之间传递的数据最常用的格式为json
接口测试
流程
- 需求分析,依据需求文档
- 接口文档解析,一般由开发人员编写接口文档
- 设计测试用例
- 执行测试用例:工具/代码
- 接口缺陷管理与跟踪
- 生产测试报告
- 接口自动化持续集成(可选),一般是项目发布上线前大批量回归测试使用,或者新版本迭代使用
接口文档
又称API文档,一般由开发编写,用来描述系统所提供接口信息的文档。大家都根据这个接口文档进行开发,并需要一直维护和遵守。
作用:
- 方便前端和后端在开发的时候进行对接
- 在人员更迭时,方便新人快速接手项目
- 方便测试人员编写接口测试用例
展现形式
- 在线文档(html)
- 离线文档
- word
- xmind
- excel
结构
- 基本信息:
- 接口描述
- URL:(协议+域名)+资源路径
- 请求方法
- 请求参数
- 请求头
- 请求体(GET、DELETE没有)
- 返回结果
- 状态码、状态描述
- 响应体
接口文档解析
http请求
请求行
请求方法
URL
协议版本:默认http/1.1
请求头
- Content-Type
请求体
http应答:
- 响应行
- 状态码、状态描述
- 响应头
- 响应体
接口设计用例
- 为什么写?
- 防止漏测
- 管理当前工作进度,评估工作量
接口测试点
功能测试
- 单接口功能:手工测试中的单个业务模块,一般对应一个接口。借助工具、代码绕开前端界面,组织接口所需要的数据展开接口测试
- 登录业务–>登录接口
- 加入购物车业务–>加入购物车接口
- 登录业务–>登录接口
- 订单业务–>订单接口
- 支付业务–>支付接口
- 业务场景功能:安装用户实际使用场景,梳理接口业务场景。组织业务场景时一般只做正向测试即可(与手工一致)。一般建议用最少的用例覆盖最多的业务场景。
- 登录——搜索商品——加购物车——下单——支付
性能测试
- 响应时长
- 吞吐量:TPS,单位时间内当前接口能处理的事务数
- 并发数
- 服务器资源使用率
安全测试
- 攻击安全:由专业安全测试工程师完成
- 业务安全
- 敏感数据是否加密
- SQL注入
设计方法与思路
与手工设计相同之处
接口用例设计的测试点与手工页面业务功能的测试点几乎完全一样
手工功能测试用例设计要点
测试页面布局、控件的位置是否精准
针对用户名的编辑框中的数据值展开测试
正确手机号、手机号由特殊字符、手机不足11位…
针对密码的编辑框中的数据值展开测试
正确密码、错误密码…
针对验证码的编辑框的数据值展开测试
正确验证码、错误验证码…
接口用例设计要点
- 手工页面中的用户名编辑框,对应接口中key为username的value值。针对username的值展开测试
- 手工页面中的密码编辑框,对应接口中key为password的value值。针对password的值展开测试
- 手工页面中的用户名编辑框,对应接口中key为verify_code的value值。针对verify_code的值展开测试
与手工设计不同之处
- 手工测试写入到输入框数据是否正确,接口测试测参数对应的参数值是否正确
- 不单单只能对参数值进行测试,还针对参数进行测试
- 正向参数
- 必选参数:所有的必须(必填)都包含
- 组合参数:所有的必选+任意一个/多个可选参数
- 全部参数:所有的必选+所有的可选参数
- 反向参数
- 多惨:多出一个/多个必选参数(可以任意指定)
- 少参:缺少一个/多个必选参数
- 无参:没有必选参数
- 错误参数:参数名输入错误
- 正向参数
单接口测试用例
手工测试中每个业务功能,在接口测试中就对应唯一的一个接口。针对 该接口展开测试
接口测试用例文档要素:
编号、标题、用例名称、模块、优先级、预置条件、请求方法、URL、请求头、请求体(请求数据)
登录测试点:
- 数值正向
- 登录成功
- 数据反向
- 手机号为空
- 手机号有特殊字符
- 手机号不足11位
- 手机号超出11位
- 手机号未注册
- 密码错误
- 密码为空
- 密码有特殊字符
- 密码1位
- 密码100位
- 参数正向
- 必选参数(全部参数)
- 参数反向
- 多参
- 少参
- 无参
- 错误参数
业务场景功能
对应手工测试的业务流程,即接口调用的先后顺序,按照调用顺序展开接口测试。
业务场景尽量遵循用户实际使用的场景,按顺序调用接口进行测试
尽量设计最少的测试用例去覆盖最多的业务场景
- 登录成功——添加员工——查询员工——修改员工——再查询——删除员工——查询员工列表
一般情况下,只需要测试正向的业务场景即可。
依赖关系:
- 登录成功返回的token,被添加、查询、修改、删除所依赖
- 添加员工成功,返回员工id,被查询、修改、删除依赖
Postman用法
管理用例集
Postman断言
Postman的断言使用js编写,写在Tests标签页里。Tests中的脚本在发送请求后执行,会把断言的结果最终显示在TestResults中
断言响应状态码
Status code: Code is 200
1 | pm.test("Status code is 200", function () { |
断言响应体是否包含某个字符
Response body: Contains string
1 | pm.test("Body matches string", function () { |
断言响应体是否等于某个字符串(对象)
Response body: is equal to a string
1 | pm.test("Body is correct", function () { |
断言json数据
Response body: JSON value check
1 | pm.test("Your test name", function () { |
断言响应头
Response headers: Content-Type header check
1 | pm.test("Content-Type is present", function () { |
增加value
1 | pm.test("Content-Type is present", function () { |
Postman全局变量&环境变量
- 全局变量:全局唯一的,不可重复定义的变量
- 环境变量:
- 一个变量只能属于某个环境,在某一个环境中变量不可重复定义
- 在环境与环境之间可以定义重复的变量
- 一个环境可以包含多个环境变量
- 常见的环境分类:开发环境、测试环境、生产环境
设置变量
全局变量
- 手动设置
- 代码设置
pm.globals.set("var_name",value);
环境变量
- 手动设置
- 代码设置
pm.environment.set("var_name",value);
获取变量值
全局变量
- 请求参数(查询参数、请求头、请求体)中获取:
- 代码中获取:
var value = pm.globals.get("var_name")
环境变量
- 请求参数中获取:
- 代码中获取:
var value = pm.environment.get("var_name")
Postman请求前置脚本
假设一种场景:调某接口时,要输入时间戳(从1970.1.1 00:00:00~写在所经历的秒数),如果输入的时间戳的绝对值超过标准时间10分钟,不允许调用。
请求前置脚本在http请求发送之前会先执行。书写在“Pre-request Script”。在请求发送之前自动运行其中的代码。
携带时间戳向百度服务器发送请求。
内部过程
Postman关联
用来解决接口和接口之间调用的依赖关系,需要借助全局变量、环境变量来实现关联问题
A接口返回的数据供B接口使用:
- 组织A接口http请求数据,发送A接口请求
- 获取A接口返回的响应数据,写入全局、环境变量中
- 组织B接口http请求,从变量中获取A返回的数据
从天气接口获取城市
测试报告
执行测试
使用newman命令,运行导出的测试集脚本,打开cmd输入:
newman run 测试脚本文件 -e 环境变量文件 -d 测试数据文件 -r html --reporter-html-export report.html