为什么做接口测试

很多系统关联都是基于接口来实现,接口测试可以将复杂的系统关联进行简化。

接口功能比较单一,能够比较好地进行测试覆盖,也相对容易实现自动化持续集成

接口相对于界面功能,会更底层一些,测试覆盖会更容易。

软件开发生命周期

系统立项——> 可行性分析 ——> 系统概要设计 ——> 详细设计 ——> 编码工作 ——> 单元测试

  • 接口测试在单元测试之后,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文档给出。

1
2
3
4
5
{
    "msg":uri_not_found,
    "code":1001,
    "request":"GET V v2 V photo V 132"
}

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测试步骤

  1. 了解接口格式
  2. 编写测试用例
  3. 测试用例评审
  4. 开始测试
  5. 完成测试报告

第一轮测试,第二轮测试,直到达到测试结束条件,完成测试报告提交,测试流程结束。

写一个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:指定筛选条件

  • 没有登录验证;

  • 通用错误码设计过于简单,只有一个数字;

  • 返回结果的设计不够友好,比较简单;