• 基于Python的接口自动化-构建mock接口服务


    引言

         Mock 即模拟,就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,其最大的优势就是降级前后端耦合度,
    使前端工程师可以不依赖后端返回数据,先开发前端样式以及逻辑处理 简单来说: Mock是用了解决依赖问题的,将复杂的/不稳定的/还未建立的依赖对象用一个简单
    的假对象来代替。
    Mock Server 即Mock接口服务器,可以通过配置快速Mock出新的接口
    Mock Server的使用范围:
    前后端分离项目
    所测接口依赖第三方系统(还未具备)
    所测接口依赖复杂或依赖的接口不稳定,并不作为主要验证对象
    同时在接口还未开发好时,提供Mock接口(假接口)会比只有接口文档更直观,并能有效减少沟通成本和一些文档理解

       在进行接口测试时,往往被测系统需要对接第三方系统,然而没有现成的第三方系统环境,此时我们就需要使用mock来解决这种依赖关系,而python就提供了一个可以方便构建mock api接口服务的模块:flask。Flask 是一个简单且十分强大的Python web 框架。

    它被称为微框架,“微”并不是意味着把整个Web应用放入到一个Python文件,微框架中的“微”是指Flask旨在保持代码简洁且易于扩展,Flask框架的主要特征是核心构成比较简单,但具有很强的扩展性和兼容性,程序员可以使用Python语言快速实现一个网站或 Web服务。

    因此flask能很方便构建一个web服务,给外部也可以叫做客户端提供web服务,针对flask框架这种特点我们可以很容易构建API接口,供客户端访问。

    Flask mock接口开发示例
    首先安装需要的Flask模块,如果你的环境已经安装了pip则键入:pip install flask即可安装完成

    或者直接在pycharm中检索安装:

    1.1 构建GET请求方法的接口

    在Pycharm中新建py文件,编辑如下代码

    1. # -*- coding: utf-8 -*-
    2. import flask,json
    3. import time
    4. server = flask.Flask(__name__) # 创建一个服务,把当前这个python文件当做一个服务
    5. @server.route('/VIID/System/Time', methods=['get']) # @server.route()可以将普通函数转变为服务、接口的路径、请求方式,如果不写methods则默认get方法
    6. def Time():
    7. '''查询字符串:无,消息体:无,返回结果:SystemTime'''
    8. response_data = {
    9. "SystemTimeObject": {
    10. "VIIDServerID": "123",
    11. "TimeMode": "1",
    12. "LocalTime": time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())),
    13. }
    14. }
    15. return json.dumps(response_data, ensure_ascii=False)
    16. if __name__ == '__main__':
    17. server.run(debug=True, port=5000, host='10.82.25.11') # 指定访问端口、host

     然后运行该py文件,则该文件运行在本地就是一个web服务,用浏览器或者postman尝试访问该服务的URL即可

    浏览器访问:

    postman发请求访问: 

    浏览器或者postman请求完成后,在Pycharm的输出栏会输出如下:

    其它的请求如POST、PUT、DELETE等方法,在methods参数中指明即可,不过POST、PUT、DELETE等方法不能由浏览器直接访问,因为浏览器默认访问时是get方法,可以用postman按指定的方法发请求

    1.2 获取带json格式请求体的接口

    有时客户端发送的请求是带json格式的,这时需要获取请求的json,编辑代码如下:

    1. @server.route('/data',methods=['post'])
    2. def post_json():
    3. if flask.request.is_json:
    4. print(flask.request.json)
    5. name = flask.request.json.get('name') # 获取json请求体的第一个参数的值
    6. age = flask.request.json.get('age') # 获取json请求体的第二个参数的值
    7. data = {'name':name,'age':age}
    8. return json.dumps(data,ensure_ascii=False)
    9. else:
    10. return json.dumps({'msg':'请传json格式参数'},ensure_ascii=False)

     使用postman作为客户端发送带json请求体的请求,如下图

    1.3 获取get请求中发送的参数

    flask提供的方法是:

    value = flask.request.args.get('name')           # 获取get请求参数name的值

    1.4 构建动态URL以及响应体的重定向

    很多时候,客户端请求的url是变化的,也就是带有动态参数的,flask也是可以轻松的构建提供动态参数的url资源服务并重定向响应体,代码如下:

    1. # -*- coding: utf-8 -*-
    2. import flask,json
    3. from flask import url_for,redirect
    4. server = flask.Flask(__name__) # 创建一个服务,把当前这个python文件当做一个服务
    5. @server.route('/data')
    6. def data(): # 返回data
    7. data = {
    8. 'VideoSliceInfoObject': {
    9. 'VideoID': 'esse elit',
    10. 'AudioCodeFormat': 'commodo'
    11. }
    12. }
    13. return json.dumps(data, ensure_ascii=False)
    14. @server.route('/data//Info', methods=['post'])
    15. def data_redirect(ID):
    16. return redirect(url_for('data', guest=ID))
    17. if __name__ == '__main__':
    18. server.run(debug=True, port=5000, host='10.82.25.11') # 指定访问端口、host

     后面无论postman或者客户端发送的url中的ID参数是啥,都可以响应

    1.5 重新构建响应头和响应状态码

    有时在与第三方系统对接时,需要返回携带响应头消息和指定的响应状态码,在flask中也是可以构建自定义的响应消息的

    1. # -*- coding: utf-8 -*-
    2. import flask,json
    3. server = flask.Flask(__name__) # 创建一个服务,把当前这个python文件当做一个服务
    4. @server.route('/data',methods=['post'])
    5. def post_json():
    6. if flask.request.is_json:
    7. print(flask.request.json)
    8. name = flask.request.json.get('name') # 获取json请求体的第一个参数的值
    9. age = flask.request.json.get('age') # 获取json请求体的第二个参数的值
    10. data = {'name':name,'age':age}
    11. # 构建响应头域和状态码
    12. resp = flask.make_response(json.dumps(data, ensure_ascii=False))
    13. resp.status = "666"
    14. resp.headers[
    15. "python"] = "python flask"
    16. return resp
    17. else:
    18. return json.dumps({'msg':'请传json格式参数'},ensure_ascii=False)
    19. if __name__ == '__main__':
    20. server.run(debug=True, port=5000, host='10.82.25.11') # 指定访问端口、host

    运行该py文件,在postman中发送请求,查看响应信息,如下图,变成的我们自定义设置的响应头和状态码

    这样我们就完全自定义了响应的头和状态码

    结语

    这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    文档获取方式:

    这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

    以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

  • 相关阅读:
    【论文阅读】(VAE-GAN)Autoencoding beyond pixels using a learned similarity metric
    信息系统项目管理师---第十二章 项目采购管理
    TCP 三次握手和四次挥手机制,TCP为什么要三次握手和四次挥手,TCP 连接建立失败处理机制
    [Lua实战]Lua环境中值传递和引用传递的效率分析(XLua/ToLua性能优化点)
    基础课5——垂直领域对话系统架构
    前端开发重装系统,软件安装清单
    海上生明月,天涯共此时 ------#征文|程序员过中秋的一百种方式#
    电脑系统还原怎么操作?
    Vue(3.3.4)+three.js(0.161.0)实现3D可视化地图
    微信客户管理与营销
  • 原文地址:https://blog.csdn.net/2301_79535733/article/details/133391521