第一章 接口测试理论
一、接口和接口测试
1. 概念
接口:系统之间(外部系统与内部系统,内部系统与内部系统)数据交互的通道。
接口测试:校验接口回发的响应数据与预期结果是否一致。

接口测试可以绕过前端界面,直接对服务器进行测试
2. 价值
可以发现页面测试发现不了的问题
符合质量控制前移的理念
低成本,高收益
二、接口测试的实现方式
工具:
- postman:使用简单,上手难度低,功能较少
- jmeter:使用难度较大,上手难度大,功能齐全
代码:
- Python + request + Unittest
- java + HttpClient
第二章 HTTP 协议
协议:就是规则。要求使用协议的双方必须严格遵守。
一、HTTP 协议简介
简介:超文本传输协议,基于请求与响应的应用层协议。
特点:
- 客户端、服务器模式
- 简单快速
- 灵活
- 无连接
- 无状态
二、URL 格式【重点】

完整语法格式:协议 :// IP地址:端口号 / 资源路径 ? 查询参数
- 协议:
- http、https
- 作用:指定数据传输规则
- IP地址:
- 也就是域名
- 作用:在网络环境,唯一定位一台主机
- 端口号:
- 作用:在主机上,唯一定位一个应用程序
- 可以省略。如果省略,跟随协议。http:80、https:443
- 资源路径:
- 作用:应用对于的数据资源
- 可以省略。如果省略,资源路径为 "/"
- 查询参数:
- 作用:给资源传递参数
- 可以省略。如果省略,没有 ? 分割符
- 可以有多组。每组按 k=v 格式。每组之间用 "&" 分隔
三、HTTP 请求【重点】
产生端:
- 一定产生于客户端,当客户端给服务器发送请求时,使用该协议。(请求报文、请求包)
整体格式:
- 请求行:请求方法、URL、协议版本
- 请求头:k:v
- 空行:代表请求头结束
- 请求体:发送给服务器请求时,携带的数据

【示例】:
POST http://demo.zentao.net/user-login.html HTTP/1.1
Host: demo.zentao.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://demo.zentao.net/user-login.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 54
Connection: keep-alive
Upgrade-Insecure-Requests: 1
account=demo&password=efc4a3b32e48054865e5a8321cfda3e4
请求行
- 一定位于 http 请求协议的第一行。格式:请求方法 URL 协议版本
- 请求方法:
- GET:查询 ------ 没有请求体
- POST:添加(注册、登录)
- DELETE:删除 ------ 没有请求体
- PUT:修改
- URL:见上【URL 格式】
- 协议版本:常见 HTTP/1.1
请求头
- 位于请求行之下,空行之上的部分。数据组织格式一定是 k:v 对。
- Content-Type:作用,指定请求体的数据类型
- application/json:请求体数据类型为 json
- application/x-www-form-urlencoded:请求体的数据类型为表单类型
请求体
- 位于空行之下
- 有的请求协议是没有请求体的。如:get、delete
- 请求体的数据类型,受请求头中 Content-Type 的值影响
四、HTTP 响应【重点】
产生端:
- 一定产生于服务器。当服务器接收到 http 请求协议后,才会产生 http 响应协议(响应报文、响应包)。
整体格式:
- 响应行:协议版本、状态码、状态码描述
- 响应头:k:v 格式数据
- 空行:代表响应头结束
- 响应体:服务回发给客户端的数据。几乎所有的响应包,都有响应体。

【示例】:
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>...</body>
</html>
状态行
- 一定位于 http 响应协议的第一行。格式:协议版本 状态码 状态码描述
- 状态码:(5类)
- 1xx:指示信息
- 2xx:成功
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务端错误

响应头
- 位于相应行之下,空行之上的部分。数据组织格式一定是 k:v 对。
响应体
- 位于空行之下。
- 几乎所有响应协议都有响应体。
- 响应体中包含的数据,是接口测试过程中,所要使用的实际结果。
第三章 接口测试基础知识
一、ihrm 项目介绍
人力资源管理系统
URL:https://ihrm-java.itheima.net/
模块:
- 员工管理
- 组织架构(部门管理)
- 招聘管理
- 考勤管理
- 绩效管理
- ...

二、接口规范
1. 传统风格接口
接口统一采用 get/post 实现所有操作。
URL 和资源不是一一对应的。在 URL 中可以查看出是何种操作
状态码统一返回 200

2. RESTful 风格接口
接口使用的方法,与 http 协议的请求方法一一对应。
get - 查、post - 增、put - 改、delete - 删
URL 与资源一一对应。不能从 URL 中看出是何种操作。需要通过结合请求方法来识别是何种操作
响应状态码使用较为全面

3. 小结
- 传统风格接口:只用get、post方法。URL 不唯一。状态码统一返回200。
- RESTful:URL 唯一,定位资源。结合请求方法对应不同操作。返回状态码较灵活。

三、接口测试流程【重点】
-
需求分析(产品经理的需求文档)
-
接口文档解析(开发编写的接口API文档)
-
设计测试用例(编写 Excel 表格形式的用例)
-
准备接口测试脚本
- postman 工具生成脚本
- python 代码编写脚本
-
执行测试用例,跟踪缺陷
-
生成接口测试报告
-
接口自动化持续集成(可选)
四、接口文档解析
1. 接口文档是什么
也叫 API 文档,一般由后端开发工程师编写。用来描述接口信息的文档。
2. 接口文档的作用
协同:团队人员工作协同配合
约束:项目更新修改同步维护
3. 解析接口文档【重点】
为什么要解析
- 通过分析接口文档,熟悉接口信息。
- 通过接口文档获取接口测试所使用的请求数据、预期结果。
解析的核心目标
- 请求报文关键数据
- 请求方法、URL、请求数据(请求头、请求体)
- 响应报文关键数据
- 响应状态码、响应数据(响应体)
4. 练习
解析人力资源管理系统接口文档,将解析结果写入接口文档解析模板

第四章 Postman 基础使用
一、简介和安装
简介:
- postman 一款支持调试和测试的工具,开发、测试工程师都可以使用。
安装:
二、案例一
【传递查询参数】:访问 TPshop 搜索商品的接口,搜索关键字 iPhone,并查看响应数据




三、案例二
【提交表单数据】:使用 Postman 向 tpshop 商城登录接口发送登录请求


四、案例三
【提交 JSON 数据】:发送 IHRM 项目的登录接口请求并查看响应结果

第五章 接口测试用例设计
一、接口测试的测试点
也叫接口测试维度。

1. 功能测试
单接口功能测试:
- 一个单独的业务,就对一个独立的接口。如:登录业务、对应登录接口
业务场景功能测试:
- 多个接口被连续调用(模拟用户的实际使用场景)
2. 性能测试
响应时长:从 发送请求 到 接收到服务器回发响应包 所经历的时间。
错误率:服务器运行出错的概率。
吞吐量:服务器单位时间内,处理请求的数量。
服务器资源利用率:cpu、内存、网络、磁盘等硬件资源的占用率。
3. 安全测试
攻击安全:木马、病毒......
- 由具备专业安全技术,会使用专业安全测试工具的安全测试工程师负责
业务安全:
- 必须登录才能访问用户数据
- 敏感数据加密存储
- SQL 注入
二、接口用例设计方法【重点】
1. 单接口测试
一个单独的业务,就对一个独立的接口。如:登录业务,对应登录接口;注册业务,对应注册接口;支付业务,对应支付接口。
- 正向:
- 必选参数。所有必选项,给正确数据。
- 组合参数。所有必选 + 任意可选,给正确数据。
- 全部参数。所有必选 + 所有可选,给正确数据。
- 反向:
- 功能异常:数据格式正确,不能履行接口功能。
- 数据异常:数据格式不正确(空值、特殊字符、汉字、字母、长度、范围 ------ 等价类、边界值)
- 参数异常:
- 多参:多出必选参数
- 少参:缺少必选参数
- 无参:没有指定参数
- 错误参数:参数名错误

2. 业务场景测试
一定在单接口测试之后。
- 尽量模拟用户实际使用场景。
- 尽量用最少的用例,覆盖最多的接口请求。
- 一般情况下,覆盖正向测试即可。
三、单接口测试用例【重点】

分析测试点
1. 登录
正向:
- 登录成功
反向:
- 功能异常:
- 手机号未注册
- 密码错误
- 数据异常:
- 手机号为空
- 手机号含有字母、特殊字符
- 手机号12位
- 手机号10位
- 密码为空
- 密码1位
- 密码100位
- 参数异常:
- 多参:多出一个 abc
- 少参:缺少 mobile
- 无参
- 错误参数:修改 mobile 为 abc

2. 添加员工
需求:
- 必填项:用户名(数字+字母),手机号(11位、数字、唯一),工号(数字1-20位)
- 非必填项:默认部门:人事部,聘用形式:正式1/非正式2
正向
- 必选参数
- 姓名+手机号+工号
- 组合参数
- 姓名+手机号+工号+聘用形式
- 全部参数
- 全部必选+全部可选
反向
- 功能异常
- 手机号已经存在
- 工号已存在
- 入职时间晚于转正时间
- 数据异常
- 用户名为空
- 用户名为纯数字
- 用户名为纯字母
- 用户名含有特殊字符、汉字
- 手机号为空
- 手机号含有字母、特殊字符
- 手机号10位
- 手机号12位
- 手机号非1开头
- 工号为空
- 工号含有字母、特殊字符
- 工号为21位
- 工号为1位
- 工号为10位
- 入职时间格式不正确
- 聘用形式取值3
- 聘用形式取值含有特殊字符、字母
- 部门 id 不存在
- 部门 id 含有特殊字符、字母
- 参数异常
- 多参:多 abc
- 少参:少 username
- 无参:缺少所有的必选项
- 错误参数:workNumber 参数名错,为 abc
3. 查询员工
使用资源路径:/api/sys/user/:target 包含 :target 为路径参数,用来指代待查询的员工id
设计测试点:
- 员工id存在
- 员工id不存在
- 没有指定员工查询
四、业务场景测试用例
指导思想:模拟用户实际使用, 用较少的测试用例覆盖更多的接口,测试正向即可。
【登录 - 添加员工 - 查询员工 - 修改员工 - 删除员工 - 查询员工列表】

第六章 Postman 高级使用
一、Postman 断言
1. Postman 断言简介
让 Postman 工具代替人工自动判断预期结果和实际结果是否一致
断言代码书写在 Tests 标签页中,查看断言结果 Test Results 标签页
2. Postman 常用断言【重点】
1、断言响应状态码
Status code: code is 200
javascript
// 断言响应状态码为200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
- pm:postman的实例
- test():postman实例的测试方法,这个方法有两个参数。
- 参数1 "Status code is 200":这个参数可以任意修改,不影响断言。作用是在断言结束后,显示给用户断言结果的提示文字
- 参数2:是一个匿名函数调用
- pm.response.to.have.status(200); 的意思是:postman的响应结果中应该有响应状态码200。------这里的200是预期结果

2、断言包含某字符串
Response body: Contains string
javascript
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
- pm.expect(pm.response.text()).to.include("string_you_want_to_search"); 的意思是:postman期望在响应的文本中应该包含"你想搜索的字符串"(预期结果)

3、断言 JSON 数据
Response body: JSON value Check
javascript
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
- var jsonData = pm.response.json(); 的意思是:将整个json响应体赋值到变量jsonData上
- pm.expect(jsonData.value).to.eql(100); 的意思是:postman期望json结果中指定key的值为xxx,value能取值(success、code、message)

3. Postman 断言工作原理

二、Postman 关联
1. 简介
当接口和接口之间有依赖关系时,需要借助 postman 关联技术来实现。
如:登录接口返回的令牌数据,被添加员工接口依赖;添加员工接口返回员工 id,被查询员工接口依赖。
2. 实现步骤
假定:接口 B 产生的数据,被接口 A 依赖。
- 发送接口B请求,获取响应数据
- 将响应数据,放入公共容器(全局变量、环境变量)中
- 接口A从公共容器中,提取数据,发送请求

3. 核心代码
javascript
// 1. 获取响应数据,转为json格式,保存到变量jsonData中
var jsonData = pm.response.json()
// 2. 将数据存储到公共容器中
// 使用全局变量做容器
pm.globals.set("全局变量名", 全局变量值)
// 使用环境变量做容器
pm.environment.set("环境变量名", 环境变量值)
// 3. 在postman界面中(URL、请求头headers、请求体body)提取全局、环境变量数据
{{全局变量名}}/{{环境变量名}}
4. 创建环境
全局变量:在整个 postman 中都可以使用的变量,不需要淡出创建环境。
环境变量:在特定的环境下才能使用的变量,需要给此变量创建单独的环境。



5. 案例一
使用 postman 关联,实现下面案例:
从获取天气接口:http://www.weather.com.cn/data/sk/101010100.html
获取返回结果中的城市名称
思路:
- 发送获取天气请求,获取响应结果
- 从响应结果中拿到城市名,存入全局变量
- 百度搜索接口从全局变量中取城市名,发送搜索请求
Tests 代码:
javascript
// 1. 获取响应结果
var jsonData = pm.response.json();
// 2. 从响应结果中提取城市名
var city = jsonData.weatherinfo.city
// 3. 将城市名保存到全局变量
pm.globals.set("glb_city", city)


6. 案例二
使用 postman 关联技术, 实现添加员工接口。
登录成功,返回的令牌被添加员工接口依赖。
思路:
- 发送登录请求(必须登录成功),获取响应结果
- 从 json 响应结果中,提取 data 值,拼接上 "Bearer " 前缀(注意:Bearer单词不能拼错,首字母必须大写,只有一个空格)
- 将拼接无误的令牌存入环境变量
- 添加员工接口,从环境变量中提取令牌。设置到请求头中,作为 Authorization 的值
- 填写添加员工接口其他信息(post、URL、请求体),发送请求



三、Postman 参数化
1. 简介
什么是参数化
- 将测试数据组织到数据文件中,通过脚本的反复迭代,使用不同的数据达到测试不同用例的效果。
应用场景:
- 一般在测试同一个接口的不同测试点时,只有测试数据不同,考虑参数化。
2. 数据文件简介
CSV:
- 优点:测试组织格式简单
- 缺点:
- 不能测试 bool 类型。因为 postman 读取 csv 后,将所有非数值类型数据,自动添加 "" 变为字符串
- 不能存储复杂数据类型(元组、列表、字典)
- 不能实现参数测试
- 应用场景:数据量较大,数据组织格式简单

JSON:
- 优点:
- 可以测试 bool 类型
- 能使用复杂数据类型
- 可以实现参数测试
- 缺点:相同数据量,json 文件要远大于 csv 文件
- 应用场景:数据量较少,数据组织格式复杂,需要进行参数测试时

3. 编写数据文件
CSV 文件

JSON 文件

4. 导入数据文件到 postman
csv文件

点击 Preview 后

json文件

5. 读取数据文件数据
理论
根据使用位置不同,有两种方法
- 第一种:请求参数(请求行、请求头、请求体)中,使用数据文件中的数据
- csv 文件:{{字段名}}
- json 文件:{{键名}}
- 第二种:代码(Tests)中,使用数据文件中的数据
- 使用 pm.iterationData.get ,索引字段名或键名
- csv 文件:pm.iterationData.get("字段名")
- json 文件:pm.iterationData.get("键名")
案例
需求:批量查询手机号所属运营商,校验运营商数据正确性
接口:http://cx.shouji.360.cn/phonearea.php?number=13012345678
测试数据:
- 手机号:13012345678 运营商:联通
- 手机号:13800001111 运营商:移动
- 手机号:18966778899 运营商:电信



四、Postman 测试报告
1. 安装 node.js
bash
# 安装
双击 .msi 文件,一路下一步安装即可。无需特殊设定。
# 测试安装成功
npm -v
2. 安装 newman
bash
# 安装newman 管理员身份安装sudo
npm install -g newman
# 测试安装成功
newman -v
# 安装newman插件 - 扩展版 管理员身份安装sudo
npm install -g newman-reporter-htmlextra
3. 导出用例集
导出


扩展:导入


4. 导出环境文件
如果测试用例脚本中包含环境使用,必须要导出环境文件


5. newman 生成测试报告【重点】
完整命令
bash
newman run 用例集文件.json -e 环境文件.json -d 数据文件.json/.csv -r htmlextra --reporter-htmlextra-export 测试报告名.html
- run xxx.json:执行测试集文件
- -e source:环境变量文件
- -d source:测试数据文件
- -r htmlextra:生成测试报告类型
- --reporter-htmlextra-export source:存放报告的路径
示例1:指定用例集文件和数据文件

bash
newman run ihrm登录参数化.postman_collection.json -d login.json -r htmlextra --reporter-htmlextra-export 作业的测试报告.html
示例2:指定用例集文件和环境文件

bash
newman run postman关联练习2.postman_collection.json -e 测试环境.postman_environment.json -r htmlextra --reporter-htmlextra-export 关联练习测试报告.html

第七章 ihrm 项目实战
一、初始化项目环境
1. 新建用例集

2. 创建环境

二、登录模块
1. 登录成功接口
请求接口

添加断言

2. 其他接口共性分析
由于是同一个接口,因此:请求方法、URL、请求头完全一致。
测试点(测试用例名称)和请求数据(请求体)各不相同
响应结果(用作断言)共3种情况:
- 操作成功
- 用户名或密码错误
- 抱歉,系统繁忙
3. 实现其他接口

三、员工管理业务场景
1. 总析
共有两种依赖:
- 登录成功的令牌,被添加、修改、删除、查询接口依赖
- 添加员工成功得到的员工 id,被修改、删除、查询接口依赖
2. 提取令牌
代码写在"登录成功"接口请求的 Scripts 标签页中
javascript
// 获取 json 响应结果
var jsonData = pm.response.json();
// 提取 data 的值,拼接 Bearer空格 前缀
var token = "Bearer " + jsonData.data
// 设置到环境变量中
pm.environment.set("env_token", token);
// --------以上3步简化为一布
pm.environment.set("env_token", "Bearer " + pm.response.json().data);

3. 添加员工
注意:
- 登录的令牌,在请求头中使用
- 请求体中的手机号,要保证唯一

4. 提取添加员工的id
代码写在"添加员工成功"接口请求的 Scripts 标签页中
javascript
// 获取添加员工成功的响应结果 json
var jsonData = pm.response.json();
// 提取员工 id
var emp_id = jsonData.data.id;
// 设置到环境变量
pm.environment.set("env_emp_id", emp_id);
5. 查询员工

网站原因无法获取到员工id,只能预演无法操作成功,以下修改删除等其他操作同理。
6. 其他员工操作



四、批量运行测试用例


五、生成测试报告
登录接口生成测试报告
- 导出用例集文件(没有使用环境,不需要导出环境文件)
- 使用命令生成测试报告
bash
newman run ihrm项目.postman_collection.json -r htmlextra --reporter-htmlextra-export ihrm登录接口测试报告.html

业务场景接口生成测试报告
- 导出用例集文件
- 必须要导出环境文件
- 使用命令生成测试报告
bash
newman run ihrm项目.postman_collection.json -e 测试环境.postman_environment.json -r htmlextra --reporter-htmlextra-export ihrm项目完整测试报告.html