软件测试 - 接口测试(上篇)

第一章 接口测试理论

一、接口和接口测试

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 唯一,定位资源。结合请求方法对应不同操作。返回状态码较灵活。

三、接口测试流程【重点】

  1. 需求分析(产品经理的需求文档)

  2. 接口文档解析(开发编写的接口API文档)

  3. 设计测试用例(编写 Excel 表格形式的用例)

  4. 准备接口测试脚本

  • postman 工具生成脚本
  • python 代码编写脚本
  1. 执行测试用例,跟踪缺陷

  2. 生成接口测试报告

  3. 接口自动化持续集成(可选)

四、接口文档解析

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 依赖。

  1. 发送接口B请求,获取响应数据
  2. 将响应数据,放入公共容器(全局变量、环境变量)中
  3. 接口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

获取返回结果中的城市名称

调用百度搜索接口:http://baidu.com/S?wd=北京,把获取到的城市名称,如:北京,作为请求参数

思路:

  1. 发送获取天气请求,获取响应结果
  2. 从响应结果中拿到城市名,存入全局变量
  3. 百度搜索接口从全局变量中取城市名,发送搜索请求

Tests 代码:

javascript 复制代码
// 1. 获取响应结果
var jsonData = pm.response.json();

// 2. 从响应结果中提取城市名
var city = jsonData.weatherinfo.city

// 3. 将城市名保存到全局变量
pm.globals.set("glb_city", city)

6. 案例二

使用 postman 关联技术, 实现添加员工接口。

登录成功,返回的令牌被添加员工接口依赖。

思路:

  1. 发送登录请求(必须登录成功),获取响应结果
  2. 从 json 响应结果中,提取 data 值,拼接上 "Bearer " 前缀(注意:Bearer单词不能拼错,首字母必须大写,只有一个空格)
  3. 将拼接无误的令牌存入环境变量
  4. 添加员工接口,从环境变量中提取令牌。设置到请求头中,作为 Authorization 的值
  5. 填写添加员工接口其他信息(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. 总析

共有两种依赖:

  1. 登录成功的令牌,被添加、修改、删除、查询接口依赖
  2. 添加员工成功得到的员工 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. 添加员工

注意:

  1. 登录的令牌,在请求头中使用
  2. 请求体中的手机号,要保证唯一

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. 其他员工操作

四、批量运行测试用例

五、生成测试报告

登录接口生成测试报告

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

业务场景接口生成测试报告

  1. 导出用例集文件
  2. 必须要导出环境文件
  3. 使用命令生成测试报告
bash 复制代码
newman run ihrm项目.postman_collection.json -e 测试环境.postman_environment.json -r htmlextra --reporter-htmlextra-export ihrm项目完整测试报告.html
相关推荐
SXTomi11 天前
【无人机】无人机用户体验测试策略详细介绍
集成测试·无人机·用户体验
刀客12314 天前
测试之道:从新手到专家实战(四)
python·功能测试·程序人生·测试用例·集成测试·学习方法·安全性测试
塔中妖15 天前
【华为OD】微服务的集成测试
华为od·微服务·集成测试
lingliang1 个月前
Spring 微服务架构下的单元测试优化实践:从本地连接到真实开发数据库的集成测试
spring·微服务·架构·集成测试
w0000061 个月前
集成算法(聚类)
集成测试
软件测试-阿涛1 个月前
【功能测试】软件集成测试思路策略与经验总结
功能测试·集成测试·可用性测试
Maer092 个月前
【Rust】多级目录模块化集成测试——以Cucumber为例
服务器·rust·集成测试
成成成成成成果2 个月前
电商支付异常测试全攻略
功能测试·测试工具·集成测试·模块测试·测试覆盖率·安全性测试·testlink