REST API 接口测试

课程地址:https://www.imooc.com/learn/1048

背景介绍

为什么要做接口测试?

很多系统关联都是基于接口来实现,接口测试可以将复杂的系统关联进行简化。
接口功能比较单一,能够比较好的进行测试覆盖,也相对容易实现自动化持续集成
接口相对界面功能,会更底层一些,测试覆盖会更容易

软件开发生命周期

接口测试在单元测试之后,UI测试之后
接口测试可以获得较高的投资回报

接口测试

什么接口测试?

接口测试又称API测试
接口测试是测试系统组件间接口的一种测试,重点关注数据传递
接口测试一般会用于多系统间交互开发,或者拥有多个子系统的应用系统开发的测试

SOAP & REST

web service

一种跨编程语言和跨操作系统平台的远程调用平台
最重要的两种实现方式:SOAP&REST

SOAP&REST区别:

安全性:SOAP会好于REST
效率和易用性:REST更胜一筹
成熟度:总的来说SOAP在成熟度上优于REST

REST API

定义:REST是一种系统架构设计风格(而非标准),一种分布式系统的应用层解决方案
目的:Client和Server端进一步解耦
应用:github API
REST API 接口测试

REST特点

面向资源的接口设计
抽象操作为基础的CRUD
Http是应用协议而非传输
REST API 接口测试
幂等性:是一个数学概念,在这里表示发送一次和多次请求引起的边界效应是一致性。POST不是幂等方法
安全性:GET、HEAD和OPTIONS均认为是最安全的方法,因为它们旨再实现对数据的获取,并不具有“边界效应”

REST API 接口规范

设计规范
协议:使用https协议,确保交互数据的传输安全
域名:应尽量将API部署在专用域名下
https://api.example.com
版本控制:将版本号放在url或者header中
路径:智能包含名词,不能包括动词
过滤信息:?limit=10 ?offset=10 ?page=1 ?sortby=name
Hypermedia API:在返回结果中提供相关资源的链接,连向其他API方法
验证:确定用户是其申明的身份,比如提供账户的密码
授权:保证用户有对请求资源特定操作的权限
REST API 接口测试
返回结果设计:
通用错误码,具体产品由具体api文档给出
{
“msg”:“uri_not_found”,
“code”:1001,
“request”:“GET/v2/photo/132”
}
REST API 接口测试
手动测试:

借助工具完成
拼接参数执行请求

自动化测试

编写自动化脚本实现
一劳永逸、加入回归测试集合
需要一定编码经验

常见测试用具
Postman、JMeter、RestClient

功能测试:
测试覆盖:
业务流程
边界值、特殊字符
参数类型、必选项,可选项
并发数
吞吐量、tps
出错率
敏感数据加密
恶意攻击
REST API 接口测试

Postman介绍

主要功能

模拟各种HTTP requests
Collection功能(测试集合)
人性化的Response整理
内置测试脚本语言
设定变量与环境

HTTP Header

Accept:指定客户端能够接收的内容类型
Accept-Charset:浏览器可以接受的字符编码集
Authorization:HTTP授权的授权证书
Content-Type:请求的与实体对应的MIME信息
Referer:先前网页的地址,当前请求网页紧随其后,即来路

content-type:
application/x-www-form-urlencoded:请求默认方式
application/json:数据是复杂的嵌套关系、有多层数据
multipart/form-data:既可以发送文本数据也支持二进制数据上载

写REST API 的测试计划

GET:http://localhost:8080/MyWebsite/user/
Header:Content-Type = application/json
Body:空
Respone:返回所有的User对象
Status code:200

GET:http://localhost:8080/MyWebsite/user/{id}
Header:Content-Type = application/json
Body:空
Respone:返回指定id的User对象
Status code:200

POST:http://localhost:8080/MyWebsite/user/
Header:Content-Type = application/json
Body:name(String类型 ,不为空不可重复),age(int类型,在0-100之间),salary(double类型)
Respone:新加User对象
Status code:201

PUT:http://localhost:8080/MyWebsite/user/{id}
Header:Content-Type = application/json
Body:name(String类型 ,不为空不可重复),age(int类型,在0-100之间),salary(double类型)
Respone:修改User对象
Status code:200

DELETE:http://localhost:8080/MyWebsite/user/{id}
Header:Content-Type = application/json
Body:空
Respone:删除id的User对象
Status code:204

DELETE:http://localhost:8080/MyWebsite/user/
Header:Content-Type = application/json
Body:空
Respone:删除所有User对象
Status code:204

错误返回
Code:4 Message:找不到指定id的对象
Code:5 Message:对象已经存在
Code:6 Message:参数不匹配