为什么做接口测试
很多系统关联都是基于接口来实现,接口测试可以将复杂的系统关联进行简化。
接口功能比较单一,能够比较好地进行测试覆盖,也相对容易实现自动化持续集成。
接口相对于界面功能,会更底层一些,测试覆盖会更容易。
软件开发生命周期
系统立项——> 可行性分析 ——> 系统概要设计 ——> 详细设计 ——> 编码工作 ——> 单元测试
- 接口测试在单元测试之后,UI测试之前;
- 接口测试可以获得较高的投资回报;
什么是接口测试
接口测试又称为API测试,Application Programming Interface.
接口测试时测试系统组件间接口的一种测试。重点关注数据传递。
接口测试一般会用于多系统间交互开发,或者拥有多个子系统的应用系统开发的测试。
Web Service
一种跨编程语言和跨操作系统平台的远程调用技术。
最重要的两种实现方式:SOAP & REST
Web2.0时代,REST方法得到了广泛的普及。
SOAP —Simple Object Access Protocol
交换数据的一种协议规范,是一种轻量的、简单的、基于XML的协议。
REST — Representational State Tranfer
一种软件架构风格,可以降低开发的复杂性,提高系统的可伸缩性。
SOAP和REST的区别
安全性: SOAP会好于REST
效率和易用性:REST更胜一筹
成熟度:总的来说,SOAP的成熟性更高,只能用XML,REST适用于各种json,xml等格式输出。
REST or RESTFUL
RESTful是REST的形容词形式,RESTful API指的是REST风格的接口
一般来说REST等于RESTful,区别一个是名词一个是形容词。
REST API
出现:REST最早是Roy Fielding博士发表的论文中提到的
定义:简单来说,REST是一种系统架构设计风格(而非标准),一种分布式系统的应用层解决方案(同SOAP不一样,不是协议)
目的:Client和Server端进一步解耦
应用:最为经典的莫过于GitHub API
核心思想是资源,(创建)增、(删除)删、(更新)改、(获取)查。
REST特点总结
-
面向资源的接口设计
-
抽象操作为基础的CRUD
(Create,Retrieve,Update,Delete)
-
Http是应用协议而非传输协议
REST 支持的方法
VeRD | 描述 |
---|---|
HEAD(SELECT) | 只获取某个资源的头部信息 |
GET(SELECT) | 获取资源 |
POST(CREATE) | 创建资源 |
PATCH(UPDATE) | 更新资源的部分属性(很少用,一般用POST代替) |
PUT(UPDATE) | 更新资源,客户端需要提供新建资源的所有属性 |
DELETE(DELETE) | 删除资源 |
补充一些概念:
幂等性(Idempotent):是一种数学上的概念,在这里表示发送一次或多次请求引起的边界效应是一致的。
比如说get方法取一个对象,不管是第一次还是取第100次,返回的结果应是一样的,而POST方法不是,所以说GET是幂等方法 ,POST是不幂等方法。
安全性:GET、HEAD和OPTIONS均被认为是安全的方法,因为他们旨在实现对数据的获取,并不具有“边界效应”(Side Effect)。
REST API接口规范
设计规范
协议:使用HTTPS协议,确保交互数据的安全;
域名:应该尽量将API部署在专用域名之下,如https://api.example.com;
版本控制:将版本号放在URL或者Header中。
路径:只能包含名词,不能包含动词;
过滤信息:?limit=10 ?offset=10 ?page=1 ?sortby=name;
Hypermedia API:在返回结果中提供相关资源的链接,连向其他API方法;
验证(Authentication):确定用户是其声明的身份,比如账户的密码;
授权(Authorization) : 保证用户有对请求资源特定操作的权限、比如用户的私人信息只能自己能访问,其他人无法看到;有些特殊的操作只能管理员可以操作,其他用户只有只读的权限等;
常见HTTP状态码
返回结果设计:
通用错误码,具体产品有具体产品api文档给出。
|
|
REST API接口实例
请求形式 | 功能 |
---|---|
GET /product | 列出所有商品 |
POST /product | 新建一个商品 |
GET /product/ID | 获取某个指定商品的信息 |
PUT /product/ID | 更新某个指定商品的信息 |
DELETE /product/ID | 删除某个商品 |
GET /product/ID/purchase | 列出某个指定商品的所有投资者 |
GET /product/ID/purchase/ID | 获取某个指定商品的指定投资者信息 |
接口测试流程
手动测试
测试方法
- 借助工具完成
- 拼接参数执行请求
自动化测试
编写自动化脚本实现(常见Python或Java)
一劳永逸,加入回归测试集合
需要一定编码经验
测试工具
-
Postman
-
JMeter
JMeter通常用于性能测试,压力测试,也可以用作接口测试。
-
RestClient等等
功能测试
测试覆盖
- 业务流程;
- 边界值,特殊字符;
- 参数类型,必选项,可选项等;
性能测试
测试覆盖
并发数(逐步加压的方式)
吞吐量,tps
出错率等
安全测试
测试覆盖
敏感数据加密
恶意攻击
REST API测试步骤
- 了解接口格式
- 编写测试用例
- 测试用例评审
- 开始测试
- 完成测试报告
第一轮测试,第二轮测试,直到达到测试结束条件,完成测试报告提交,测试流程结束。
写一个RestAPI测试计划
需求描述
(1)
GET : http://localhost:8080/MyWebSite/user/
Header: Content-Type = application/json
Body: 空
Response: 返回所有USer对象
Status Code: 200
(2)
GET : http://localhost:8080/MyWebSite/user/{id}
Header: Content-Type = application/json
Body: 空
Response: 返回指定id的USer对象
Status Code: 200
(3)
POST : http://localhost:8080/MyWebSite/user/
Header: Content-Type = application/json
Body: name(String类型,不可空不可重复),age(int类型,在0-100之间),salary(double类型)
Response:新加User对象
Status Code: 201(新资源被创建)
(4)
PUT : http://localhost:8080/MyWebSite/user/{id}
Header: Content-Type = application/json
Body: name(String类型,不可空不可重复),age(int类型,在0-100之间),salary(double类型)
Response:修改id对应的User对象
Status Code: 200
(5)
DELETE : http://localhost:8080/MyWebSite/user/{id}
Header: Content-Type = application/json
Body: 空
Response:删除id对应的User对象
Status Code: 204
(6)
DELETE : http://localhost:8080/MyWebSite/user/
Header: Content-Type = application/json
Body: 空
Response:删除所有的User对象
Status Code: 204
错误返回设计:
Code:4 Message:找不到指定id对象
Code:5 Message:对象已经存在
Code:6 Message:参数不匹配
测试计划
-
业务流程 - GET:
正向用例:返回所有对象和返回某一个对象
负向用例:一个不存在的id,URL输入不正确
-
业务流程 - POST:
正向用例:输入正确参数新加一个对象(特殊字符,中文等)
负向用例:
1.参数name为空/重复
2.参数age为0/-1/100/101/字符串/null/空
3.参数salary为整数/带小数/负数/null/空
-
业务路程 - PUT:
正向用例:输入正确参数修改一个对象(特殊字符,中文等)
负向用例:
1.参数id为空/无效值
2.参数name为空/重复
3.参数age为0/-1/100/101/字符串/null/空
4.参数salary为整数/带小数/负数/null/空
-
业务路程 - DELETE:
正向用例:删除所有对象和删除某一个对象
负向用例:
1.一个不存在的id
2.URL输入不正确
发现的问题
-
PUT请求没有做name不为空和重复的限制,类似其他域字段也未做控制和验证;
-
DELETE请求没有具体的返回结果,终端用户无法判断操作是否成功;
-
URL设计规范,没有https不够安全;
-
域名没有api的体现,没有版本的控制;
-
没有一些过滤信息,如laravel,sortby,不支持排序
?limit=10:指定返回记录的数量 ?offset=10:指定返回记录的开始位置。 ?page=2&per_page=100:指定第几页,以及每页的记录数。 ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。 ?animal_type_id=1:指定筛选条件
-
没有登录验证;
-
通用错误码设计过于简单,只有一个数字;
-
返回结果的设计不够友好,比较简单;