1、接口
接口:程序之间约定好的通信方式。一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。
系统对外的接口:比如要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,你引用提供的接口就能使用他写好的方法,从而达到数据共享的目的,比如说app、网址这些它在进行数据处理的时候都是通过接口来进行调用的。
程序内部的接口:方法与方法之间,模块与模块之间的交互,程序内部抛出的接口,比如bbs系统,有登录模块、发帖模块等等,要发帖就必须先登录,那么这两个模块就得有交互,它就会抛出一个接口,供内部系统进行调用。
接口分类:
基于TCP的全双工:PRC, WebSocket,不适用于Postman
基于HTTP的半双工:REST, GraphQL, SOAP,适用于Postman
常见接口:
webservice接口:是走soap协议通过http传输,请求报文和返回报文都是xml格式的,我们在测试的时候都用通过工具才能进行调用,测试;
http api接口:是走http协议,通过路径来区分调用的方法,请求报文都是key-value形式的,返回报文一般都是json串,有get和post等方法,这也是最常用的两种请求方式。
简述下HTTP接口:
HTTP协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次HTTP请求。HTTP会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,HTTP会立即将TCP连接断开,这个过程是很短的。所以HTTP连接是一种短连接,是一种无状态的连接。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
2、接口测试
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换、传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
所谓接口测试就是通过测试不同情况下的入参与之相应的出参信息来判断接口是否符合或满足相应的功能性、安全性要求。
接口测试没有页面,它是通过接口规范文档上的调用地址、请求参数,拼接报文,然后发送请求,检查返回结果。
接口测试分类:
模块之间的接口
系统对外部系统提供的接口
内部子系统的服务之间的接口
接口测试场景:
手机APP
客户端软件
web网站API:微信接口、新浪微博接口等等
公司内部系统API:订单接口需要调用用户资金接口查询余额
大家都知道,接口其实就是前端页面或APP等调用与后端做交互用的,所以好多人都会问,我功能测试都测好了,为什么还要测接口呢?比如测试用户注册功能,规定用户名为6~18个字符,包含字母(区分大小写)、数字、下划线。首先功能测试时肯定会对用户名规则进行测试时,比如输入20个字符、输入特殊字符等,但这些可能只是在前端做了校验,后端可能没做校验,如果有人通过抓包绕过前端校验直接发送到后端怎么办呢?试想一下,如果用户名和密码未在后端做校验,而有人又绕过前端校验的话,那用户名和密码不就可以随便输了吗?如果是登录可能会通过SQL注入等手段来随意登录,甚至可以获取管理员权限,那这样不是很不安全?
所以,接口测试的必要性就体现出来了:
① 可以发现很多在页面上操作发现不了的bug
② 检查系统的异常处理能力
③ 检查系统的安全性、稳定性
④ 前端随便变,接口测好了,后端不用变
3、接口组成
3.1 接口文档四要素:
- 请求地址
- 请求方法(get/post)
- 参数:请求参数、参数类型、请求参数说明,返回参数
- 鉴权Authorizations
由接口文档可知,接口至少应有请求地址、请求方法、请求参数(入参和出参)组成,部分接口有请求头header。
标头 (header):是服务器以HTTP协议传HTML资料到浏览器前所送出的字串,在标头与 HTML 文件之间尚需空一行分隔,一般存放cookie、token等信息
header和入参有什么关系?它们不都是发送到服务器的参数吗?
首先,它们确实都是发送到服务器里的参数,但它们是有区别的,header里存放的参数一般存放的是一些校验信息,比如cookie,它是为了校验这个请求是否有权限请求服务器,如果有,它才能请求服务器,然后把请求地址连同入参一起发送到服务器,然后服务器会根据地址和入参来返回出参。也就是说,服务器是先接受header信息进行判断该请求是否有权限请求,判断有权限后,才会接受请求地址和入参的。
3.2 根据Swagger接口文档获取接口信息
Swagger是一套接口设计工具:
- 接口设计工具
- 接口测试工具
- 接口文档展示工具(Swagger UI,我们平时使用的属于Swagger UI)
根据swagger接口文档展示工具,我们可以知道:
- server
- Authorizations(有时候不会开放权限给用户)
- 请求方法(POST/GET/PUT/DELETE)
- 接口路径 接口地址 = baseURL + 接口路径
- 参数:是否必填(红色required表示必填),参数名,参数格式
- 接口预期返回结果
- 在线调试
4、接口的测试流程
接口测试的流程:
- 阅读接口文档(接口文档形式各个公司不同)
- 设计接口测试用例
- 准备测试环境、测试工具及测试数据
- 执行测试
- 提交缺陷报告,回归测试
- 编写测试报告
4.1 准备
- 理解需求(需求文档)
- 了解接口(接口文档)
- 体验产品、抓包分析
4.2 工具
- Postman,简单方便的接口调试工具,便于分享和协作。具有接口调试,接口集管理,环境配置,参数化,断言,批量执行,录制接口,Mock Server, 接口文档, 接口监控等功能
- Jmeter,开源接口测试及压测工具,支持Linux及无界面运行;
- apifox(中国自己开发的)
- LR,商业版接口性能测试工具,简单易用,功能强大;
- SoapUI,开源,收费,WebService接口常用测试工具,也可以测试Rest接口及接口安全
- paw:,mac上最强
4.3 用例
接口测试实际上是黑盒测试。一个接口通常是有输入输出的,输入就是我们常见的入参,输出有时有,有时没有。调用相关接口,接口会执行相关处理逻辑。接口测试的用例设计,主要从输入和接口处理两方面考虑。针对输入,可按照参数类型进行设计;针对接口处理,可按照逻辑进行用例设计;针对输出,可根据结果进行分析设计,接口正常情况下是有返回的,那么如果接口不返回呢?也就是说接口超时后的处理也是测试需要考虑的部分,如果未进行超时处理,导致整个流程阻塞;超时后又收到接口返回,导致逻辑出现错乱。
测试用例编写3a原则(同单元测试):
- A: arrange 初始化测试数据,就是造数据,这里的数据有我们输入的数据,也有目标接口所涉及的资源,
- A: act 调用接口,传入输入数据;
- A: assert 断言, 对返回的资源信息进行断言,比如获取用户信息的接口返回了用户信息之后,我们要判断返回的用户是不是我们想要的那个用户,我们获取的是李雷的信息,接口如果返回韩梅梅,那么接口的逻辑就是不对的;
接口测试用例包含的要素有:测试功能点(接口用例标题)、测试环境、测试数据(参数)、操作步骤、预期结果。其中测试数据的创建一定要覆盖全面,深入扩展到业务中,也需要结合过往的工作经验来分析,
- 基本的正向用例
- 有可选参数的扩展正向用例
- 有效的反向用例
- 无效的反向用例
- 破坏性用例
接口测试发现的典型问题:
传入参数处理不当,导致程序crash;
类型溢出,导致数据读出和写入不一致;
因对象权限未进行校验,可以访问其他用户敏感信息;
状态处理不当,导致逻辑出现错乱;
逻辑校验不完善,可利用漏洞获取非正当利益
4.4 执行
4.5 持续集成
4.6 报告
5、接口自动化
基于接口测试工具的接口自动化:
Postman + Newman + Git/SVN + Jenkins (基于JavaScript)
Jmeter + Ant + Git/SVN + Jenkins (基于Java和BeanShell)
基于代码的接口自动化:
Python + Request+ Yaml + Pytest + Allure + Logging + 热加载 + Jenkins
Python:Pytest, unittest
java:junit, testng
基于平台的接口自动化:
测试开发