Python接口自动化测试框架(工具篇)–接口测试基础知

「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战」。

前言

从事软件测试工作,怎能不知、不会接口测试为何物,不管前端是啥(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)点击某个按钮、页面功能,需要有所反馈,总不能是静止没有响应的,让人不知所措,那么它需要测试,回到接口,编码具体实现了接口的功能,但是没有测试,不知道它能提供什么样的数据(功能),同样让人不放心;所以它也需要测试。那它怎么测,它又不像客户端有可以点击的地方,这就需要通过一定的手段(工具)模拟测试。经验总结接口测试的要点:验证接口传输数据的正确性、安全性及性能,对应的就是接口功能测试、接口安全测试、接口性能测试。

为什么要做接口测试

原因呢,上面也说一点,就是它的正确性,一个没有经过测试的接口,怎么放心交给前端给到用户去使用?

  • 接口放在前端那是一个一个的url地址,那么在后端它可能存在千丝万缕的关系,这就是业务关联性,简单点说,有些事情不是一个接口就能完成的,在开发架构上讲的是高内聚低耦合。
  • 接口的功能比较单一,容易覆盖测试范围,更容易持续集成,减少人工回归成本和时间资源,缩短测试周期,更能有效的阻击因接口或其他接口的变动而引起的程序问题。
  • 相对于前端功能而言,它又偏底层,更接近代码,如熟知的分层测试金字塔,塔尖的是UI功能测试、随之是服务层接口测试、最后是代码单元测试;从而越早测试越能发现问题,越早发现问题,那么修复它的成本就越低。