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.dataprint("用户提交的数据是:", 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  requestsdata={"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.dataprint("用户提交的数据是:", 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.mzph.cn/web/35347.shtml

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

相关文章

M4V文件损坏无法播放?一招轻松修复损坏视频文件!

M4V是一个标准视频文件格式,此种格式常在iPod 、 iPhone 和 PlayStation Portable等设备上使用,同时此格式基于MPEG-4编码第二版,是MP4格式的一种特殊类型,有时可能会因为各种原因而损坏,导致无法正常播放。M4V文件出现…

前端vue3 根据某些Id 筛选数据

现在有一些不等的数据 我需要通过前端 吧这个数据筛选一下 比如我使用一些 我需要的ID 下的数据 比如以上的数据 的 cinemaLineId 来筛选 const cinemaLineId ref(["1246429254713147392", "1182608813770321920", "1182608917403185152"])…

爬取必应关键字搜索结果url

上代码 import aiohttp import asyncio from lxml import etree import aiofiles import time import random aiohttp 和 asyncio 用于异步HTTP请求和事件循环。 lxml 用于解析HTML。 aiofiles 用于异步文件操作。 time 和 random 用于控制爬取速度。 headers {User-Agent: M…

frida的安装使用以及解决抓包app时遇到的证书校验

frida的安装和使用 这里使用夜神模拟器来演示frida的使用,因为真机开启frida-server服务时需要root权限,模拟器自带root 下载夜神模拟器并启动 夜神官网 打开power shell, adb连接模拟器,查看模拟器的系统型号 adb connect 127.0.0.1:6200…

阿里云centos7.9 挂载数据盘 并更改宝塔站点根目录

一、让系统显示中文 参考:centos7 怎么让命令行显示中文(英文->中文)_如何在命令行中显示中文-CSDN博客 1、输入命令:locale -a |grep "zh_CN" 可以看到已经存在了中文包 2、输入命令:sudo vi…

SecureCRT使用SSH登录服务器报错:Key exchange failed

SecureCRT使用SSH登录Ubuntu服务器报错:Key exchange failed 原因: ssh客户端与服务器的公钥协商失败,SecureCRT客户端所指定的秘钥交换算法(KexAlgorithms ),不在服务端支持范围内。可能是服务端的sshd版…

学习笔记(linux高级编程)7

2._exit 系统调用 void _exit(int status); 功能: 让进程退出,不刷新缓存区 参数: status:进程退出状态 返回值: 缺省 回调函数 3.atexit int atexit(void (*function)(void)); 功能: 注册进程退出前执行的函数 参数: function:函数指针 指向void返回值void参数的函数指针 返…

C++ | Leetcode C++题解之第188题买卖股票的最佳时机IV

题目&#xff1a; 题解&#xff1a; class Solution { public:int maxProfit(int k, vector<int>& prices) {if (prices.empty()) {return 0;}int n prices.size();k min(k, n / 2);vector<int> buy(k 1);vector<int> sell(k 1);buy[0] -prices[0]…

配电房挂轨巡检机器人

配电房作为电网中的重要组成部分。其运行的的安全和稳定性直接影响到电力供应的质量。然而&#xff0c;传统的人工巡检模式存在诸多弊端&#xff0c;例如巡检效率低下、人员安全难以保障、巡检结果主观性强等问题。为了解决这些问题&#xff0c;旗晟机器人推出B3系列升降云台轨…

CODESYS+EtherCAT+X86/ARM硬件平台:高性能运动控制的标配,支持定制

支持的硬件标准与定制平台&#xff1a; X86:INTEL ARM: RK3568/RK3588/TI/NXP/树莓派/全志T3/A40i等 前段时间分享了施耐德基于CODEYS开发的首款支持EtherCAT总线的运动控制器&#xff0c;CODESYSEtherCATX86硬件平台&#xff1a;高性能运动控制的标配。 CODESYS第一次接触还…

4大wordpress渐变色网站模板

家居摆件wordpress外贸模板 家居装饰、配件、摆件wordpress外贸模板&#xff0c;适合搞家居装饰的公司官网使用。 https://www.jianzhanpress.com/?p3515 玩具wordpress外贸模板 简洁玩具wordpress外贸模板&#xff0c;适合做跨境电商外贸公司使用的wordpres外贸s网站主题。…

PTE-靶场训练-1

PTE-靶场训练实战笔记 靶场搭建 靶场下载链接&#xff1a; https://pan.baidu.com/s/1ce1Kk0hSYlxrUoRTnNsiKA?pwdha1x vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置好后reboot重启一下即可&#xff0c;然后访问81-85端口&#xff0c;共5题。 因为靶场出了问题&a…

C++ Primer 中文版 第5版 读书笔记

读书过程中发现&#xff0c;读得越多&#xff0c;忘得越多。因此记录读书笔记 1.2 初始输入输出 向流写入数据 <<运算符&#xff08;输出运算符&#xff09;接受两个运算对象&#xff1a;左侧的运算对象必须是一个ostream对象&#xff0c;右侧的运算对象是要打印的值。…

Vatee万腾平台:一站式智慧服务,让生活更美好

在数字化浪潮席卷全球的今天&#xff0c;我们生活的方方面面都在经历着前所未有的变革。Vatee万腾平台凭借其一站式智慧服务&#xff0c;正成为推动这场变革的重要力量&#xff0c;让我们的生活变得更加美好。 Vatee万腾平台&#xff0c;作为一家专注于提供智慧服务的领军企业&…

基于weixin小程序校园快递系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;订单管理&#xff0c;快递管理&#xff0c;快递记录管理&#xff0c;公告管理&#xff0c;基础数据管理 小程序功能包括&#xff1a;系统首页&#xff0c;…

企业有必要安装数据文件加密软件吗?哇!这么多好处

需要的 一、查看以下分析&#xff0c;便能得出结论 安全防护提升&#xff1a;禁止拷贝、打印、截屏等&#xff0c;还能够设置文件的浏览次数、有效期&#xff0c;提供多层次的文档保护措施。 核心机密保护&#xff1a;企业的核心机密文件、技术资料、客户资料等重要信息是公…

reactjs18 中使用@reduxjs/toolkit同步异步数据的使用

react18 中使用@reduxjs/toolkit 1.安装依赖包 yarn add @reduxjs/toolkit react-redux2.创建 store 根目录下面创建 store 文件夹,然后创建 index.js 文件。 import {configureStore } from "@reduxjs/toolkit"; import {counterReducer } from "./feature…

Does a vector database maintain pre-vector chunked data for RAG systems?

题意&#xff1a;一个向量数据库是否为RAG系统维护预向量化分块数据&#xff1f; 问题背景&#xff1a; I believe that when using an LLM with a Retrieval-Augmented Generation (RAG) approach, the results retrieved from a vector search must ultimately be presented…

WIFI各版本的带宽

带宽的定义&#xff1a; 带宽在网络领域通常指信道带宽&#xff0c;即信号在频谱中占用的频宽&#xff0c;单位是MHz&#xff08;兆赫&#xff09;。在无线通信中&#xff0c;带宽越宽&#xff0c;能够传输的数据量越大&#xff0c;因此信道带宽直接影响着数据传输速率。WiFi标…

FairGuard游戏加固无缝兼容 Android 15 预览版

2024年6月25日&#xff0c;谷歌发布了 Android 15 Beta 3 &#xff0c;作为Android 15 “平台稳定性”的里程碑版本&#xff0c;谷歌建议所有应用、游戏、SDK、库和游戏引擎开发者都将“平台稳定性”里程碑版本作为规划最终兼容性测试和公开发布的目标。 安卓开发者博客提供的版…