python API自动化(基于Flask搭建MockServer)

      接口Mock的理念与实战场景:

                        什么是Mock:

                在接口中,"mock"通常是指创建一个模拟对象来代替实际的依赖项,以便进行单元测试。当一个类或方法依赖于其他类或组件时,为了测试这个类或方法的功能,我们可以使用模拟对象来替代这些实际的依赖项。模拟对象可以模拟实际对象的行为,以便在测试过程中进行控制和验证


                使用模拟对象有几个优点:

                1. 降低测试的复杂性:使用模拟对象可以消除对实际依赖项的依赖,从而简化测试设                       置和执行。

                2. 隔离测试环境:模拟对象可以隔离测试环境,确保测试过程中的行为可控。

                3. 提供测试数据:模拟对象可以提供特定的测试数据,以验证被测试对象在不同情况下                  的行为。

               4. 加速测试执行:与实际依赖项相比,使用模拟对象可以提高测试的执行速度

                        比如开发人员有些对应的接口还没有完成开发,就可以使用mock数据进行模拟,检查页面的逻辑

                Mock Server:              

                        Mock Server(模拟服务器)是一个用于模拟网络服务行为的工具或软件。它充当一个虚拟的服务器,能够响应客户端的请求并返回预定义的响应数据

                如下图所示:

                

        

框架对比及Flask基本应用

        Django: 是一个开源Web应用程序框架,包含了Web开发中常用的功能和特点的框架。如:强大的ORM(对象关系映射)、MVC(模型-视图-控制器)设计模式、自动化管理后台、URL路由和视图函数等。

Tornado:是一个高性能Web应用程序的Python Web框架。与传统的基于多线程模型的Web框架不同,它采用了异步非阻塞的事件驱动架构,可以处理高并发的请求。常见的特点和功能,如:异步非阻塞、高性能、支持WebSocket、内置协程支持等。

Flask:是一个轻量级Web应用程序框架。封装功能不及Django完善,性能不及Tornado,但是Flask可扩展性强,因为Flask的第三方开源组件丰富

这三者的结论

不论优劣,不同的工具而已;

小型web应用设计的功能点不多使用Flask;

大型web应用设计的功能点比较多使用的组件也会比较多,使用Django(自带功能多不用去找插件);

如果追求性能可以考虑Tornado;

例子:

        静态路由的写法:

        

@app.route('/upload')

        方法的选择:

@app.route('/login', methods=['GET', 'POST'])

        flask代码演示:
        

# -*- coding: utf-8 -*-

from  flask import  Flask,request
# 给当前服务取个名字,__name__是内置的属性
app=Flask(__name__)

all_urer = {"qsdd": "123456", "admin": "456789", "qsdd2": "123456"}
@app.route("/")
@app.route("/index.php")
# 2.一个接口就是一个方法
def index():
    return "欢迎来到主页"

@app.route("/api/login",methods=["POST"])
def login():
    # 1. 以json格式进行拿取【推荐】
    data = request.get_json()
    # data = request.json()
    username=data["username"]
    password=data["password"]
    # 2. 以二进制数据进行数据获取
    # data = request.get_data()
    # data = request.data
    print("用户提交的数据是:", data)

    """
    分支判断
    1.参数不能为空
    2.登录成功
    3.密码错误的情况或者用户名不正确的情况下
    4.参数不正确
    
    """
    if username in all_urer:
        if username==""or password=="":
            return "账号密码不能为空"
        elif all_urer[username]==password:
            return  "登录成功"
        elif all_urer[username]!=password:
            return "密码错误"
        else:
            return "账号不存在"


    return "欢迎来到登录界面"


# 3.启动服务
if __name__ == '__main__':
    app.run()

# -*- coding: utf-8 -*-
import  requests

data={"username":"qsdd","password":"123456"}

res=requests.post(url="http://127.0.0.1:5000/api/login",json=data)
print(res.text)

 

 flask的深度学习:https://flask.net.cn/testing.html()

                

Mock Server接口设计实战

        

模拟登录接口

        

# -*- coding: utf-8 -*-

from  flask import  Flask,request,jsonify
# 给当前服务取个名字,__name__是内置的属性
app=Flask(__name__)
# 数据用户表
all_urer = {"qsdd": "123456", "admin": "456789", "qsdd2": "123456"}

# MSG_模板:--响应数据应该是什么样子的格式--开发会提前定义
# {
#     "code": 202,
#     "msg":"对应的提示信息",
#     "data":[多个字典]
# }

# 登录成功
MSG_LOGIN_SUCCESS = {
    "msg": "登录成功",
    "code": "0",
    "data": {
        "id": "75",
        "username": "hami",
        "nickname": "哈米老师",
        "mobile": "",
        "email": "",
        "avatar": "http://shop-xo.hctestedu.com/static/upload/images/user_avatar/compr/2023/07/01/202307011819170015381852.jpg",
        "alipay_openid": "",
        "weixin_openid": "",
        "weixin_unionid": "",
        "weixin_web_openid": "",
        "baidu_openid": "",
        "toutiao_openid": "",
        "qq_openid": "",
        "qq_unionid": "",
        "integral": "420",
        "locking_integral": "0",
        "referrer": "0",
        "add_time": "1624022081",
        "add_time_text": "2021-06-18 21:14:41",
        "mobile_security": "",
        "email_security": "",
        "user_name_view": "hami",
        "is_mandatory_bind_mobile": 0,
        "token": "bd80726708856645618cfb2a5a6926d2"
    }
}
# 数据错误
MSG_DATA_NULL = {
    "msg": "用户名和密码不能为空",
    "code": -1,
    "data": ""
}
# 数据异常
MSG_DATA_ERROR = {
    "msg": "登录数据有误",
    "code": -1,
    "data": ""
}
# 用户名错误
MSG_ERROR_USERNAME = {
    "msg": "登录帐号不存在",
    "code": -3,
    "data": ""
}
# 密码错误
MSG_ERROR_PASSWORD = {
    "msg": "密码错误",
    "code": -4,
    "data": ""
}
# 登录失效
MSG_LOGIN_ERROR = {
    "msg": "登录失效,请检查当前登录用户。",
    "code": -5,
    "data": ""
}

@app.route("/")
@app.route("/index.php")
# 2.一个接口就是一个方法
def index():
    return "欢迎来到主页"

@app.route("/api/login",methods=["POST"])
def login():
    # 1. 以json格式进行拿取【推荐】
    data = request.get_json()
    # data = request.json()
    # 获得用户名和密码
    res_json={"username","password"}
    if set(data.keys())==res_json:
        username=data["username"]
        password=data["password"]
    else:
        return "填写的参数不正确"
    # 2. 以二进制数据进行数据获取
    # data = request.get_data()
    # data = request.data
    print("用户提交的数据是:", data)

    """
    分支判断
    1.参数不能为空
    2.登录成功
    3.密码错误的情况或者用户名不正确的情况下
    4.参数不正确
    
    """
    if username in all_urer:
        if username==""or password=="":
            return jsonify(MSG_DATA_NULL)
        elif all_urer[username]==password:
            return  jsonify(MSG_LOGIN_SUCCESS)
        elif all_urer[username]!=password:
            return jsonify(MSG_ERROR_PASSWORD)
        else:
            return jsonify(MSG_ERROR_USERNAME )
    else:
        return jsonify(MSG_ERROR_USERNAME )


    return "欢迎来到登录界面"

# 获取用户信息
@app.route("/api/info",methods=["GET"])
def getinfo():
    try:
        token=request.headers.get("Authorization")
        if token==MSG_LOGIN_SUCCESS["data"]["token"]:
            return  jsonify(MSG_LOGIN_SUCCESS)
        else:
            return  jsonify(MSG_LOGIN_ERROR)
    except Exception:
        return jsonify(MSG_LOGIN_ERROR)
    # 3.启动服务
if __name__ == '__main__':
    app.run()

模拟调用接口

        

# -*- coding: utf-8 -*-
import requests

# 登录接口
data = {"username": "qsdd", "password": "123456"}
res = requests.post(url="http://127.0.0.1:5000/api/login", json=data)
# print(res.text)
print(res.json())
# 400 :响应数据是开发写,所以不对,有可能你接口请求数据不对,也有可能是开发本身就不小心写错
print(res.status_code)
# 200 :只能说明服务器是能够正确响应,但是不代表对应响应数据正确

# 查看用户信息
headers = {"Authorization": "bd80726708856645618cfb2a5a6926d2"}
# headers = {"token": "5345435435435435435"}
res = requests.get(url="http://127.0.0.1:5000/api/info", headers=headers)
# res = requests.get(url="http://127.0.0.1:5000/api/info")
print(res.json())
# 400 :响应数据是开发写,所以不对,有可能你接口请求数据不对,也有可能是开发本身就不小心写错
print(res.status_code)
# 200 :只能说明服务器是能够正确响应,但是不代表对应响应数据正确

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/750512.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k-NN 剪辑近邻法

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记&#…

【分享】30秒在线自助制作电子证件照

近期由于自己需要制作电子证件照,所以在网上找在线制作电子证件照的网站,找了很多网站都是收费的,也下载了很多app制作,都是要收费的。最后,所以索性自己开发一个网站制作电子证件照。这里分享给需要的朋友。&#xff…

Jenkins教程-9-发送企业微信测试报告通知

上一小节我们学习了Jenkins上下游关联自动化测试任务的构建的方法,本小节我们讲解一下发送企业微信测试报告通知的方法。 1、自动化用例执行完后,使用pytest_terminal_summary钩子函数收集测试结果,存入本地status.txt文件中,供J…

点云可视化 .ply文件 | 方案汇总

前言 本文分析可视化点云.ply文件的几种方法,包括MeshLab软件、在线可视化点云.ply文件、通过PyntCloud库编程实现。 PLY是一种用于存储三维数据的文件格式,常用于点云数据和多边形网格。 被广泛应用于计算机图形学、3D扫描和3D打印等领域。PLY文件可…

React的Props、生命周期

Props 的只读性 “Props” 是 React 中用于传递数据给组件的一种机制,通常作为组件的参数进行传递。在 React 中,props 是只读的,意味着一旦将数据传递给组件的 props,组件就不能直接修改这些 props 的值。所以组件无论是使用函数…

【GD32】08 - IIC(以SHT20为例)

GD32中的IIC 今天来了解一下GD32中的硬件IIC,其实我个人是觉得软件IIC比较方便的,不过之前文章里用的都是软件IIC,今天就算是走出自己的舒适圈,我们来了解了解GD32中的硬件IIC。 我这里用的型号是GD32F407,不同型号的…

ComfyUI中运行Stable Audio Open,实现背景音乐、音效自由

🧨背景 stability在一个月之前默默的发布了Stable Audio Open 1.0的音频音效生成模型,不过好像影响力一般,也没有太多文章分享测试,而今天看comfyui作者的一篇介绍文档,他已经让comfyui默认支持了这个模型。 原开源地…

Linux 基于sqlite3数据库的学生管理系统

一、数据库 sqlite官网:www.sqlite.org 1.1 数据库的安装 离线安装: sudo dpkg -i sqlite3_3.22.0-1ubuntu0.4_amd64.deb //数据库软件 sudo dpkg -i libsqlite3-dev_3.22.0-1ubuntu0.4_amd64.deb //数据库的库函数 在线安装: sudo apt-get …

【Linux】Linux下使用套接字进行网络编程

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 用于网络应用开…

知识图谱——Neo4j数据库实战

数据与代码链接见文末 1.Neo4j数据库安装 JDK 安装:https://www.oracle.com/java/technologies/javase-downloads.html Neo4j 安装:https://neo4j.com/download-center/ 配置好 JDK 和 Neo4j 的环境变量

嵌入式Linux系统编程 — 4.1 字符串输入输出

目录 1 字符串输出 1.1 字符串输出函数简介 1.2 示例程序 2 字符串输入 2.1 字符串输入简介 2.2 示例程序 程序运行时,需打印信息至标准输出 stdout 设备 或标准错误 stderr设备(譬如屏幕),如调试信息、报错信息、中间产生的…

数据库课程知识点总结

数据库概述 数据库基本特点:数据结构化,数据独立性,数据冗余小,易扩充,统一管理和控制,永久存储,有组织,可共享 三级模式 模式:一个数据库只有一个模式,是对…

将idea项目代码部署到Linux系统中

目录 1. 将idea与虚拟机建立连接 2. 设置上传到虚拟机的目录 3.上传项目代码 1. 将idea与虚拟机建立连接 打开idea要上传的项目,找到Tools -> Development -> Configuration 设置一个连接的名称,我这里设置为centos 将Type设置为SFTP,点击SSH configuration 开始配…

数据库物理结构设计-定义数据库模式结构(概念模式、用户外模式、内模式)、定义数据库、物理结构设计策略

一、引言 如何基于具体的DBMS产品,为数据库逻辑结构设计的结果,即关系数据库模式,制定适合应用要求的物理结构 1、在设计数据库物理结构前,数据库设计人员首先 要充分了解所用的DBMS产品的功能、性能和特点,包括提供…

抖音集成:通过MessageBox引领数字化营销新潮流

抖音集成:通过MessageBox引领数字化营销新潮流 在数字化营销的大潮中,企业需要不断探索新的方式来优化其营销策略,以抓住更多的市场机会。抖音作为一款全球知名的短视频社交平台,凭借其庞大的用户群体和高度互动的特性&#xff0…

亿发进销存管理系统+:多终端无缝协同,实现经营销售场景全覆盖

亿发软件凭借产品、市场、业务的深入理解,在进销存基础上进行了延伸,推出多终端、一体化的“进销存管理系统”多元产品矩阵。对企业经营中进货、出货、销售、付款等进行全程跟踪管理。有效辅助企业解决业务管理、销售管理、库存管理、财务管理等一系列问…

【论文阅读】-- TSR-TVD:时变数据分析和可视化的时间超分辨率

TSR-TVD: Temporal Super-Resolution for Time-Varying Data Analysis and Visualization 摘要1 引言2 相关工作3 我们的循环生成方法3.1 损失函数3.2 网络架构 4 结果与讨论4.1 数据集和网络训练4.2 结果4.3 讨论 5 结论和未来工作致谢参考文献附录1 训练算法及优化2 网络分析…

02.Ambari自定义服务开发-metainfo.xml介绍

文章目录 metainfo.xml 介绍配置说明Hbase metainfo.xml配置说明配置参数详细介绍配置文件样例DORIS metainfo.xml 介绍 ​ 在Ambari自定义开发中,metainfo.xml 配置文件起着至关重要的作用。它用于定义服务的元数据信息,包括服务的版本、组件、执行脚本…

RabbitMQ基本概念

RabbitMQ是AMQP协议的一个开源实现,所以其基本概念也就是的 AMQP 协 议中的基本概念。如图3-1所示是 RabbitMQ 的整体架构图。 Message(消息):消息是不具名的,它由消息头和消息体组成。消息体是不透明的, 而消息头则由一系列可选属性组成&…

六西格玛绿带可以跳过,直接学六西格玛黑带吗?真实情况告诉你

在现代企业管理中,六西格玛(Six Sigma)已经成为提升质量和效率的重要工具。对于很多企业而言,培养内部的六西格玛专家,特别是黑带(Black Belt),是推动持续改进的关键。然而&#xff…