文章目录
一、前言
从事软件测试工作,怎能不知、不会接口测试为何物,不管前端是啥(app\h5\web\小程序)凡是你肉眼所见的都是通过后台服务接口提供的数据所渲染的,那么于服务而言,它又是衔接服务(不管是系统还是模块)更好的完成业务流(通讯)及提供完整的业务数据(数据交换)。总而言之,谁也离不开接口。
二、什么是接口
咱们所知的接口,通常是指前端通过调用后台url,获取响应数据,渲染页面呈现出来的过程。那么这个过程里,调用后台url就可以看做是接口(API),连接前后端的通道;它是系统能力的提供者,API是接口定义的具体实现。
三、API接口实现
解开接口背后的秘密,它实际上是一个个的函数,由函数内部去处理相应的业务逻辑,最终将结果返回给前端渲染,然后就是咱们看到的样子。
作者既然以python语言入手,那么就以其中Flask框架来演示接口的本质:
- Flask框架,写一个登录接口,然后启动服务,查看接口文档
'''
Created on 2021年5月24日
@author: qguan
'''
from flask import Flask, jsonify
from flask_restplus import Api, Resource, fields, reqparse
app = Flask(__name__)
# 接口文档头
api = Api(app, version='1.0', title='Swagger接口文档', description='用户中心',)
# 设置中文编码
app.config['JSON_AS_ASCII'] = False
# app.config['JSONIFY_MIMETYPE'] ="application/json;charset=utf-8"
# 接口
http = api.namespace('login', description='登录接口') # 模块命名空间
# 响应参数
todo = api.model('描述', { # 返回值模型
'result': fields.Integer(readonly=True, description='True of False'),
'token': fields.String(required=True, description='Return Token')
})
# 定义接口参数
parser = reqparse.RequestParser() # 参数模型
parser.add_argument('zone', type=str, required=True, help="国别码/区号")
parser.add_argument('mobile', type=str, required=True, help="手机号")
parser.add_argument('code', type=int, required=True, help="验证码")
class TodoDAO(Resource):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.params = parser.parse_args()
@http.expect(parser) # 用于解析对应文档参数,
@http.response(200, "success response", todo) # 对应解析文档返回值
def get(self):
if not all([self.params.get("zone"),self.params.get("mobile"),self.params.get("code")]):
return jsonify({"code":-1, "msg":"参数不能为空"})
if "86" not in self.params.get("zone"):
return jsonify({"code":-2, "msg":"国别码站不支持其他国家地区"})
elif len(self.params.get("mobile")) != 11:
return jsonify({"code":-3, "msg":"目前仅支持11位中国大陆手机号"})
elif len(str(self.params.get("code"))) != 4:
return jsonify({"code":-4, "msg":"验证码不正确"})
return jsonify({"code":0, "msg":"登录成功"})
http.add_resource(TodoDAO, "/ByMobile", endpoint="to_do")
if __name__ == '__main__':
app.run(debug=True)
- 接口文档,包括请求地址、请求方法、请求参数、请求头、响应参数:
- swagger接口文档本身也支持执行接口测试(后面会有工具介绍如何做接口测试)
四、什么是接口测试
类比功能测试,咱在前端(app)点击某个按钮、页面功能,需要有所反馈,总不能是静止没有响应的,让人不知所措,那么它需要测试,回到接口,编码具体实现了接口的功能,但是没有测试,不知道它能提供什么样的数据(功能),同样让人不放心;所以它也需要测试。那它怎么测,它又不像客户端有可以点击的地方,这就需要通过一定的手段(工具)模拟测试。经验总结接口测试的要点:验证接口传输数据的正确性、安全性及性能,对应的就是接口功能测试、接口安全测试、接口性能测试。
4.1、为什么要做接口测试
原因呢,上面也说一点,就是它的正确性,一个没有经过测试的接口,怎么放心交给前端给到用户去使用?
- 接口放在前端那是一个一个的url地址,那么在后端它可能存在千丝万缕的关系,这就是业务关联性,简单点说,有些事情不是一个接口就能完成的,在开发架构上讲的是高内聚低耦合。
- 接口的功能比较单一,容易覆盖测试范围,更容易持续集成,减少人工回归成本和时间资源,缩短测试周期,更能有效的阻击因接口或其他接口的变动而引起的程序问题。
- 相对于前端功能而言,它又偏底层,更接近代码,如熟知的分层测试金字塔,塔尖的是UI功能测试、随之是服务层接口测试、最后是代码单元测试;从而越早测试越能发现问题,越早发现问题,那么修复它的成本就越低。
五、接口测试范围
功能层
- 保证业务功能的正确性,同时需要包括异常场景的考虑
- 业务规则的覆盖,入参的不同,实现业务逻辑有所不同
- 参数验证,入参、出参的业务规则,还有入参的边界值
- 异常场景,主要取决于用户的行为习惯及使用环境导致
服务性能
- 这点对应的就是接口性能测试,着重关注响应时间、吞吐量、并发数及资源要求
安全性
- 接口安全测试也不能忽视,用户越权、SQL注入等问题
六、接口测试重点
- 常规性测试,入参和出参的检验,重点关注数据类型
-
- 比较关注接口的容错性,时常关注入参类型错误,程序是否能够处理
-
- 出参是否与预期结果一致
-
- 入参的边界值是校验服务是否有处理正确
- 性能
- 安全
七、如何做好接口测试
7.1、接口测试的前提
- 友好的接口文档,不管是从管理、维护方面都应该有清晰的流程
-
- 能够快准狠的找到对应的接口、接口变更记录、可以有默认设置
- 标准的接口规范,这有点像约束,就是要主次分明、清晰明了、有统一标识符等等
7.2、熟练的接口测试工具
不管是postman还是jmeter又或者soapui,都不重要,它只是工具,辅助咱完成接口测试的工具而已,但是一定要熟练。当然为了后期规划,它的选择就显得尤为重要:接口功能–接口性能–接口安全,那么soapui是最好的选择,但是安全在实际中少有涉及,那么jmeter成为不二之选(因为开源可拓展),postman则可以和开发有更多的交流(现实中大多开发都使用postman调试接口)
7.3、设计接口测试用例
接口测试用例的设计与功能测试用例有所不同,功能测试用例多以场景设计实现,既有前置条件、操作步骤、步骤间对应预期结果;那接口测试用例呢,它有隐藏的前置条件(基础数据是存在的)、没有操作步骤、但有预期结果,那么接口测试用例主要从以下几方面来设计:
- 入参类型,即要覆盖入参的参数类型
- 入参边界值,有些参数是有范围的
- 入参组合,主要是分必填和非必填
- 出参的结果断言,不同的入参数据,会有不同的结果响应
- 还有就是场景法,将它隐藏的前置条件设定出来,即接口关联(依赖)
7.4、接口测试持续集成
前面也说过了,既要节省回归测试成本又要缩短测试周期,那么接口测试走持续集成已成必然趋势。所以选择的工具(手段)要支持CLI模式能结合Jenkins等自动化平台实现自动化回归测试,这里要说一点:自动化测试主要是用于回归测试和冒烟测试。
- 拒绝硬编码接口测试,要灵活设置,降低脚本的维护成本;
- 不做复杂的接口断言,尤其是涉及数据库断言,尽量避免操作生产数据库环境
- 也不做复杂的业务场景接口测试,即覆盖异常情况,建议做正确的业务流接口测试
- 同时应分析每次接口测试脚本,即对结果进行分析,关注其性能相关问题
八、总结:接口测试应该要掌握的知识点
- 系统业务,即被测试对象,要知道自己测试的是什么,有什么特性
- 对于接口协议也要有所了解,毕竟socket和http还是有区别的
- 接口测试工具,掌握一两款即可,其他可多做了解
- 数据库基础操作命令,就是select、insert、update、delete这些
8.1、如何去学
- 业务方面,只有自己多玩请教开发吧
- 技能方面:多看书、逛论坛、看教程
- 最主要的是系统的学习和大佬的提携