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

news2024/9/21 16:48:13

      接口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 :只能说明服务器是能够正确响应,但是不代表对应响应数据正确

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java基于ssm+jsp 大学生校园兼职系统

1前台首页功能模块 大学生校园兼职系统,在大学生校园兼职系统可以查看首页、企业信息、招聘信息、论坛信息、留言反馈、我的、跳转到后台等内容,如图1所示。 图1系统首页界面图 学生登录,通过学生登录填写账号、密码等信息进行登录操作&…

鸿蒙期末项目(完结)

两天仅睡3个小时的努力奋斗之下,终于写完了这个无比拉跨的项目,最后一篇博客总体展示一下本项目运行效果兼测试,随后就是答辩被同学乱沙(悲 刚打开软件,会看到如下欢迎界面,介绍本app的功能和优点 随后我们…

服务器部署—虚拟机安装nginx并部署web网页

该篇博客用于讲解Linux的Centos7发行版中如何通过Linux安装Nginx,然后将静态页面部署到Nginx中,通过浏览器访问。 非常适用于新手小白学习项目部署相关的知识。建议收藏!!! 需要大家提前准备好虚拟机和CentOS7操作系统…

智慧公厕系统在办公楼卫生管理中的作用,高效、便捷、智能

在现代化的办公楼中,卫生管理是营造舒适、高效工作环境的重要环节。而智慧公厕系统的引入,正以其高效、便捷、智能的特点,为办公楼的卫生管理带来了革命性的变革。 一、智慧公厕系统首先展现出了令人瞩目的高效性。 传统的公厕管理往往依赖人…

2024年6月17日~2024年6月26日周报

一、前言 在上周主要完成了可变形卷积的学习的部署。 本周,结合前段时间的工作与闵老师的讨论,思考了接下来的一些尝试方向。本周重新在之前的网络上尝试添加可变形卷积v4,或者将可变形卷积v2修改为可变形卷积v4。另外,继续学习了…

LCR 068. 搜索插入位置

给定一个排序的整数数组 nums 和一个整数目标值 target ,请在数组中找到 target ,并返回其下标。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 思路: 常规的二分查找&am…

充电桩小程序:引领未来,携手共创绿色充电新纪元

着新能源汽车市场的迅猛增长,充电桩行业正迎来前所未有的发展机遇。然而,在这个充满竞争和机遇并存的时代,如何快速、高效地满足用户需求,成为充电桩行业老板们关注的焦点。为此,我们推出了全新的充电桩小程序&#xf…

记录跨度3年的SqlServer数据同步项目分析

目录 技术选型决策阶段 发布订阅 自定义开发 Datax Datax废除主外键关系和自增ID ER模型分组 废掉库表主外键 维度划分Datax任务 基于ID同步 基于TIME时间同步 基于全表ALL同步 废掉自增ID DataX废除主外键关系手动拷贝 手动拷贝 Datax任务分组触发器 Datax全表…

实践案例:使用Jetpack Navigation创建一个新闻应用

在这个实践案例中,我们将使用Jetpack Navigation创建一个简单的新闻应用。这个应用将包含以下功能: 新闻列表页面:显示一组新闻文章。新闻详情页面:显示选定新闻文章的详细信息。用户资料页面:显示用户的资料信息。 …

前端 Array.sort() 源码学习

源码地址 V8源码Array 710行开始为sort()相关 Array.sort()方法是那种排序呢&#xff1f; 去看源码主要是源于这个问题 // In-place QuickSort algorithm. // For short (length < 22) arrays, insertion sort is used for efficiency.源码中的第一句话就回答了我的问题…

Python第三方库GDAL 安装

安装GDAL的方式多种&#xff0c;包括pip、Anaconda、OSGeo4W等。笔者在安装过程中&#xff0c;唯独使用pip安装遇到问题。最终通过轮子文件&#xff08;.whl&#xff09;成功安装。 本文主要介绍如何下载和安装较新版本的GDAL轮子文件。 一、GDAL轮子文件下载 打开Github网站…

【Java Web】Element-plus组件库

目录 一、Element-plus组件库概述 二、Element-plus组件库基本用法 一、Element-plus组件库概述 Element-plus组件库是由饿了么团队基于Vue3框架编写的前端UI设计组件库。通俗点讲就是将用户页面设计所需的按钮、表格、导航栏等前端代码编写生成的组件元素都封装好了、用户在进…

40.设计HOOK引擎的好处

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;39.右键弹出菜单管理游戏列表 以 39.右键弹出菜单管理游戏列表 它的代码为基础进行修改 效果图&#xff1a; 实现步骤&#xff1a; 首…

elk对于集群实例的日志的整合-基于logstash采集日志

说明&#xff1a;基于logstash采集日志 环境&#xff1a; 物理机192.168.31.151 一.启动2个测试实例&#xff0c;每5-10s随机生成一条订单日志 实例一 包位置&#xff1a;/home/logtest/one/log-test-0.0.1-SNAPSHOT.jar 日志位置:/docker/elastic/logstash_ingest_data/l…

《2024年新生代妈妈真实孕育状态洞察报告》

专注于行业分析与市场研究的专业机构易观分析,正式发布了其最新研究成果——《2024年新生代妈妈真实孕育状态洞察报告》。该报告深入探讨了新生代妈妈在孕育过程中的实际需求与挑战,通过对母婴行业的市场规模、消费行为、用户触媒习惯、用户关怀以及特定品类场景的细致分析,揭示…

easyui的topjui前端框架使用指南

博主今天也是第一次点开easyui的商业搜权页面&#xff0c;之前虽然一直在使用easyui前端框架&#xff08;easyui是我最喜欢的前端ui框架&#xff09;&#xff0c;但是都是使用的免费版。 然后就发现了easyui的开发公司居然基于easyui开发出了一个新的前端框架&#xff0c;于是我…

PLM系统选购指南:哪款品牌最适合你?

在选购PLM&#xff08;Product Lifecycle Management&#xff09;系统时&#xff0c;选择最适合自己企业的品牌至关重要。以下是一份清晰的PLM系统选购指南&#xff0c;帮助您根据企业的具体需求选择最合适的品牌&#xff1a; 1、明确企业需求&#xff1a; 首先&#xff0c;明…

数学建模--lingo解决线性规划问题~~灵敏度分析的认识

目录 1.线性规划问题举隅 &#xff08;1&#xff09;问题介绍 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;灵敏度分析 &#xff08;4&#xff09;方法缺陷 &#xff08;5&#xff09;可行域&凸集 2.lingo的简单认识 &#xff08;1&#xff09;默认…

VSCode常用的一些插件

Chinese (Simplified) 汉语&#xff08;简体&#xff09;拓展包。 Auto Close Tag 可以自动增加xml/html的闭合标签。 CodeSnap 截图神器。截图效果在下面。 Dracula Official vscode一个很好看的主题。 Git Graph git管理工具。 GitHub Repositories 有了它&#xff0c;不…

C++02 变量和基本类型

基本类型 字、字节、bit、Byte之间的关系 字 word 字节 Byte 位 bit 1字 2字节 <---> 1word 2Byte 1字节 8位 <---> 1Byte 8bit 1Byte 8bits 1KB 1024Bytes 1MB 1024KB 1GB 1024MB #include <iostream> using namespace std; int main() {/*字符…