目录
[1 接口测试概念](#1 接口测试概念)
[2 接口测试内容](#2 接口测试内容)
[3 HTTP原理](#3 HTTP原理)
知识点
1 接口测试概念
##### 1.1为什么要做接口测试
* 不同段的进度不同,需要对最开始出来的接口进行接口测试
##### 1.2接口测试的优点
* 节约时间
* 提高工作效率
* 提高系统健壮性
##### 1.3接口测试概念
* 类型
* API
* 硬件驱动程序
* 数据库系统的访问接口
* webservice接口
* http rest接口
* 测试系统间接口的一种测试,测试的对象主要是接口,主要是测试外部系统与所测系统之间以及内部系统之间的交互点。
##### 1.4接口测试原理和目的
* 接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端,客户端接收应答报文这一个过程。
* 测试接口的正确性和稳定性(**持续集成是接口测试的核心**)。
2 接口测试内容
##### 2.1测什么
*
###### 2.1.1单一接口
* 输入输出值测试
* 单一接口测试主要测试的是输入输出值,一些具有业务意义的值需要特别测试(例如,1和2分别代表两个测试场景,那么就不能够把他们看成是等价类,需要分开测试
*
###### 2.1.2组合接口
* 业务场景测试
* 组合接口测试主要是通过组合多个单一接口,来测试一个业务场景 Example:测试购物网站的一个下单的功能,那么因为在下单之前还有一些流程,所以要测试一个场景。 测试:搜索商品 --\> 选中商品 --\> 添加进购物车 --\> 提交订单 --\>支付 (提交订单时还涉及到地址的选取等) \[注:涉及到如果使用从cookie或者session在本例中的区别:如果使用cookie加入购物车,那么换一台电脑购物车里的商品就不存在了,但如果使用的是session,购物车里面的东西就一直存在,即:cookie是本机作用的,session不止于本机作用
*
###### 2.1.3结构检查
* 返回值结构
* (1)检查返回值的结构是否正确,如是json类型还是xml类型的数据
* (2)字段名称是否正确等
*
###### 2.1.4调用方式
* HTTP调用
* 注意:提交数据,一定使用POST方式,不能使用GET方式。
* 其他方式
*
###### 2.1.5参数格式校验
* 必选项检查
* 非必选项默认值
* 类型
* 取值范围
* 全/半角、大/小写转换。
* 长度
*
###### 2.1.6返回结果
* 与需求一致
* 每种错误要有单独且明确的错误码。
##### 2.2四大块
*
###### 2.2.1功能逻辑
* 通过查数据库或缓存等验证数据是否处理正确。
* 通过其他辅助途径进行验证
*
###### 2.2.2异常测试
* 接口测试中主要测试接口正常逻辑,但仅逻辑测试不能保证数据的安全及程序接口在异常情况下的逻辑处理的正确性。
*
###### 2.2.3路径测试
* 当被测接口的实现方法中,判断逻辑复杂分支多,且判断中又调用了其他的接口,此时必须要进行路径覆盖测试。
*
###### 2.2.4其他异常场景
* 研发的项目,有些项目是底层使用的系统,根据项目特点,可能会存在特殊的异常场景。
* 例如: 堵命令,支付的异步操作,支付消息重试等。
##### 2.3接口测试的依据
*
###### 2.3.1需求规范
*
###### 2.3.2接口文档
* 涵盖内容
* 1、接口概述:
* 1)接口名称
* 2)接口功能
* 3)接口类别
* 4)提交者、提交时间、需求来源及时间要求
* 2、HTTP请求方式
* 3、认证说明
* 4、请求限制说明
* 5、请求参数说明
* 参数名、是否必选、类型、取值范围、描述(非必选项的默认值)
* 6、相关约束
* 7、注意事项
* 8、调用示例
* 9、返回说明
* 1)返回数据格式
* 2)返回结果示例
* 3)错误代码及返回说明
* 示例
* ![](https://i-blog.csdnimg.cn/direct/d4608f72631649f8b0dfb16188d4be60.png)
##### 2.4测试方法
* 可以通过开发脚本代码进行测试。
* 可以通过开源免费的接口调用调试工具测试或者自动化工具,如:Postman,jmeter等。
* 可以通过App手动测试,结合抓包工具分析,如:Fillder/Charles等。
##### 2.5接口分类
* 1)API:应用程序编程接口 application
* 示例
*
模块接口测试是单元测试的基础。它主要测试模块的调用与返回
例如:
package com.java.base;
public class InterfaceTest {
//求两个整数相加的和
public static int add(int a, int b){
return a + b;
}
public static void main(String[] args) {
//测试整数相加
int resule = add(1,2);
if(resule == 3){
System.out.println("success!");
}else{
System.out.println("fail!");
} } }
* 2)GUI:图形用户界面(接口)
##### 2.6测试流程
* 图示
* ![](https://i-blog.csdnimg.cn/direct/8429907b7e2243d199426b0a52551851.png)
3 HTTP原理
##### 3.1请求/应答模型
* HTTP遵循请求(Request)/应答(Response)模型。Web浏览器向Web服务器发送请求,Web服务器处理请求并返回适当的应答
* 图示
* ![](https://i-blog.csdnimg.cn/direct/b67f0d9c7cfb4215b39f81a1664c2a61.png)
##### 3.2请求报文
*
###### 3.2.1原理
* 客户端向服务器发送请求时,会给服务器发送一个请求报文。请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。URL只是标识资源的位置,而HTTP报文用来提交和获取资源。客户端发送的HTTP请求消息,包括请求行、请求头部、空行和请求体4个部分。
* 图示
* ![](https://i-blog.csdnimg.cn/direct/9f5e65e5e0824e12b3f7811983b56220.png)
* ![](https://i-blog.csdnimg.cn/direct/02591e438c8c4b479b914248c8d1e96a.png)
*
###### 3.2.2涵盖内容
* 请求行
* 请求头部
* 空行
* 请求体
##### 3.3请求方法
* GET
* HEAD
* POST
* PUT
* DELETE
* CONNECT
* OPTIONS
* TRACE
* 图示
* ![](https://i-blog.csdnimg.cn/direct/dedcf944dc1146629b8b77cdbe3230f1.png)
##### 3.4响应报文
* 原理
* 图示
* ![](https://i-blog.csdnimg.cn/direct/21a48036bd7f4a4091d484316c594c38.png)
* ![](https://i-blog.csdnimg.cn/direct/5bf28f1954374230ab38ca507c8aded1.png)
* 涵盖内容
* 状态行
* 响应头部
* 空行
* 响应体
##### 3.5状态码
* 概念
* 状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值
* 可能取值
* 1xx
* 指示信息
* --表示请求已接收,继续处理
* 2xx
* 成功
* --表示请求已被成功接收、理解、接受
* 3xx
* 重定向
* --要完成请求必须进行更进一步的操作
* 4xx
* 客户端错误
* --请求有语法错误或请求无法实现
* 5xx
* 服务器端错误
* --服务器未能实现合法的请求
* 具体例子
* 200 OK客户端请求成功
* 404 Not Found请求资源不存在,eg:输入了错误的URL
* 401 Unauthorized请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
* 500 Internal Server Error服务器发生不可预期的错误
* 503 Server Unavailable服务器当前不能处理客户端的请求,一段时间后可能恢复正常
* 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
* 403 Forbidden //服务器收到请求,但是拒绝提供服务
实验
一 实验目的:
1、了解什么是接口测试。
2、理解HTTP工作原理。
3、掌握接口测试用例设计。
4、掌握接口测试工具Postman的使用。
二 实验环境
1、Windows操作系统环境;
2、Java Web项目运行环境;
3、Postman工具。
三 实验准备
1、了解Web项目前后端工作原理;
2、掌握Java Web项目的构建与部署。
四 实验内容
(1)从ftp或者https://www.postman.com/downloads/,下载适合自己操作系统的Postman安装文件,并完成Postman的安装,把安装成功界面截图。
(2)使用Postman创建一个workspace,workspace名称为自己中文名拼音。
(3)在workspace中创建一个collection,命名为cookieshop,针对商品查询接口进行测试,请设计商品查询接口设计文档。
表1 商品查询接口设计说明
|------|-----|----|----|----|
| 接口名称 | ||||
| 调用方式 | ||||
| 接口地址 | ||||
| 接口方法 | ||||
| 输入参数定义 |||||
| 列名 | 字段名 | 类型 | 必填 | 备注 |
| | | | | |
| 返回数据说明 |||||
| |||||
|----------|-------------|---------|----|---------------------------|
| 接口名称 | 商品查询接口 ||||
| 调用方式 | HTTP请求 ||||
| 接口地址 | postman-echo.com/get ||||
| 接口方法 | GET ||||
| 输入参数定义 |||||
| 列名 | 字段名 | 类型 | 必填 | 备注 |
| keyword | searchKey | String | 否 | 查询关键字 |
| category | productType | String | 否 | 商品类别 |
| priceMin | minPrice | Decimal | 否 | 最低价格 |
| priceMax | maxPrice | Decimal | 否 | 最高价格 |
| sort | sortType | String | 否 | 排序方式(如:price, popularity) |
| page | pageNumber | Integer | 否 | 页码 |
| size | pageSize | Integer | 否 | 每页显示的商品数量 |
| 返回数据说明 |||||
| ##### 成功响应: * 状态码:200 OK * 返回数据格式:JSON * 返回结果示例:
json 解释 { "success": true, "data": { "total": 120, // 总商品数 "products": [ // 商品列表 { "id": "p001", // 商品ID "name": "Chocolate Chip Cookies", // 商品名称 "description": "Delicious cookies with chocolate chips.", // 商品描述 "price": 29.99, // 商品价格 "category": "Cookies", // 商品类别 "image": "https://example.com/images/p001.jpg" // 商品图片URL }, { "id": "p002", "name": "Oatmeal Raisin Cookies", "description": "Soft and chewy oatmeal cookies with raisins.", "price": 24.99, "category": "Cookies", "image": "https://example.com/images/p002.jpg" } // 更多商品... ] }, "message": "查询成功" // 操作结果信息 }
* 字段说明: * success
:布尔值,表示请求是否成功。 * data
:包含实际数据的对象。 * total
:查询结果的总商品数。 * products
:商品列表数组,每个元素是一个商品对象。 * id
:商品的唯一标识符。 * name
:商品名称。 * description
:商品描述。 * price
:商品价格。 * category
:商品所属类别。 * image
:商品图片的URL。 ##### 错误响应: * 状态码:可能为400(错误请求)、401(未授权)、404(未找到)、500(服务器内部错误)等。 * 返回数据格式:JSON * 错误响应示例:
json 解释 { "success": false, "error": { "code": "INVALID_REQUEST", // 错误代码 "message": "请求参数不合法" // 错误描述 }, "message": "查询失败" // 操作结果信息 }
* 字段说明: * success
:布尔值,表示请求是否成功。 * error
:错误信息对象,仅在发生错误时出现。 * code
:错误代码,用于标识具体错误类型。 * message
:对错误的文本描述。 * message
:对操作结果的一般描述。 |||||
(4)针对以上商品接口设计说明,请运用黑盒测试方法对商品查询接口进行测试用例设计。
表2 商品查询接口测试用例
|------|--------|
| 输入数据 | 预期输出结果 |
| | |
用例编号 | 输入数据 | 预期输出结果 | 测试类型 | 备注 |
---|---|---|---|---|
TC01 | 无参数 | 返回所有商品的列表,按默认排序 | 正向测试 | 测试默认行为 |
TC02 | searchKey=chocolate | 返回包含"chocolate"关键字的商品列表 | 正向测试 | 测试关键字搜索 |
TC03 | productType=Cookies | 返回"Cookies"类别的商品列表 | 正向测试 | 测试类别过滤 |
TC04 | minPrice=10&maxPrice=50 | 返回价格在10到50之间的商品列表 | 正向测试 | 测试价格范围过滤 |
TC05 | sortType=price | 按价格升序返回商品列表 | 正向测试 | 测试排序功能 |
TC06 | sortType=-price | 按价格降序返回商品列表 | 正向测试 | 测试排序功能 |
TC07 | pageNumber=2&pageSize=10 | 返回第二页,每页10个商品的列表 | 正向测试 | 测试分页功能 |
TC08 | searchKey=xyz&category=unknown&minPrice=0&maxPrice=1000&sortType=popularity&pageNumber=1&pageSize=5 | 返回符合所有给定参数的商品列表 | 正向测试 | 综合测试 |
TC09 | searchKey=chocolate&category=Biscuits | 返回错误信息,因为"Biscuits"不是有效的类别 | 边界测试 | 测试无效类别 |
TC10 | minPrice=1000&maxPrice=10000 | 返回价格在1000到10000之间的商品列表,如果不存在则返回空列表 | 边界测试 | 测试边界价格范围 |
TC11 | pageNumber=100&pageSize=10 | 返回错误信息或最后一页的商品列表,因为页码超出范围 | 边界测试 | 测试超出范围的页码 |
TC12 | searchKey=;DROP TABLE products; | 返回错误信息,因为包含SQL注入尝试 | 安全性测试 | 测试SQL注入防护 |
TC13 | searchKey=<script> | 返回错误信息或过滤后的搜索结果,因为包含HTML注入尝试 | 安全性测试 | 测试HTML注入防护 |
TC14 | searchKey=chocolate&sortType=invalid | 返回错误信息,因为"invalid"不是有效的排序方式 | 异常测试 | 测试无效排序方式 |
(5)使用Postman接口测试工具,根据表2的测试用例进行接口测试。并提交测试结果。
五 实验总结
(1)为什么要做接口测试。
接口测试是软件测试的一个重要组成部分,主要用于验证不同系统组件或模块之间的交互是否符合预期。以下是进行接口测试的主要原因:
-
确保数据交换正确性:
- 验证接口在不同系统或模块间传递数据时的准确性。
-
功能验证:
- 确保接口实现的功能符合需求规格。
-
系统稳定性:
- 通过接口测试可以发现可能导致系统不稳定的错误。
-
性能评估:
- 评估接口在高负载下的表现,确保其满足性能要求。
-
安全性检查:
- 检查接口是否容易受到安全攻击,如SQL注入、跨站脚本攻击等。
-
兼容性测试:
- 确保接口在不同环境或不同版本间能够正常工作。
-
早期发现缺陷:
- 在开发早期阶段发现接口问题,减少后期修复的成本。
-
促进团队协作:
- 帮助开发团队理解接口规范,提高协作效率。
-
支持持续集成:
- 在持续集成过程中自动测试接口,确保代码变更不会破坏现有功能。
-
文档验证:
- 验证接口文档的准确性和完整性。
(2)接口测试能发现哪些错误?
接口测试能够发现的错误类型广泛,具体包括但不限于:
-
数据验证错误:
- 输入数据不符合预期格式或类型。
-
返回结果错误:
- 接口返回的数据或状态码与预期不符。
-
性能问题:
- 接口响应时间过长或在高负载下表现不佳。
-
安全性漏洞:
- 接口容易受到SQL注入、跨站脚本攻击等安全威胁。
-
兼容性问题:
- 在不同平台或不同版本的客户端中表现不一致。
-
并发问题:
- 在多用户同时访问时接口表现异常。
-
资源泄露:
- 接口未能正确释放占用的资源,如数据库连接、内存等。
-
异常处理不当:
- 接口在遇到异常情况时未能正确处理。
-
依赖关系错误:
- 接口依赖的其他服务或资源不可用时表现异常。
-
版本兼容性:
- 新旧版本接口之间的兼容性问题。
-
路径错误:
- 接口未能正确处理请求路径或参数。
-
文档与实现不符:
- 实际接口实现与文档描述不一致。