软件测试基础三十 (Python + Flask实现Mock平台搭建)

Python + Flask实现Mock平台搭建

一、Flask简介

Flask是一个轻量级的Web框架,它使用Python语言编写。Flask提供了简单而灵活的方式来构建Web应用程序,非常适合用于快速开发小型到中型规模的Web服务,包括搭建Mock平台。

二、项目准备

  1. 环境搭建
    • 确保你的系统已经安装了Python。建议使用Python 3.x版本。
    • 创建一个虚拟环境(可选但推荐),可以使用venv工具。在命令行中,进入项目目录后,执行python - m venv venv来创建一个名为venv的虚拟环境,然后通过source venv/bin/activate(在Linux/macOS上)或venv\Scripts\activate(在Windows上)来激活虚拟环境。
  1. 安装Flask
    • 在激活的虚拟环境中,使用pip安装Flask。执行pip install flask命令,这将安装Flask及其依赖项。

三、创建基本的Flask应用

  1. 创建主应用文件
from flask import Flask
app = Flask(__name__)
    • 在项目目录下创建一个名为app.py(名称可以自定义)的Python文件。在这个文件中,引入Flask并创建一个应用实例。
    • 这里Flask(__name__)创建了一个Flask应用实例,__name__是一个Python内置变量,Flask会根据这个变量来确定应用的根目录等信息。
  1. 定义路由和视图函数
@app.route('/')
def hello_world():return 'Welcome to the Mock Platform!'
    • 路由是URL路径和视图函数之间的映射。视图函数是处理特定URL请求的函数。例如,创建一个简单的路由来返回一个欢迎消息。
    • 上面的代码中,@app.route('/')是一个装饰器,它将hello_world函数绑定到网站的根目录(/)。当用户访问网站的根目录时,hello_world函数会被调用,返回Welcome to the Mock Platform!这个字符串作为响应。
  1. 运行应用
if __name__ == '__main__':app.run(debug=True)
    • app.py文件的末尾,添加以下代码来运行应用:
    • app.py作为主程序运行时(if __name__ == '__main__':条件判断),app.run(debug=True)会启动Flask开发服务器。debug=True表示开启调试模式,在调试模式下,Flask会在代码发生变化时自动重新加载应用,并且在出现错误时提供详细的调试信息。

四、实现Mock功能

(一)定义Mock接口

  1. 简单的JSON数据返回接口

@app.route('/user_info')
def user_info():mock_user_info = {"name": "John Doe","age": 30,"email": "johndoe@example.com"}return mock_user_info
  • 假设我们要模拟一个返回用户信息的接口。在app.py中添加以下代码:
  • 这里定义了一个/user_info的路由,对应的视图函数user_info创建了一个包含用户姓名、年龄和电子邮件的字典,并将其作为JSON数据返回。Flask会自动将字典转换为JSON格式。
  • 动态返回Mock数据接口
@app.route('/user_info/<int:user_id>')
def user_info_by_id(user_id):if user_id == 1:mock_user_info = {"name": "Alice","age": 25,"email": "alice@example.com"}elif user_id == 2:mock_user_info = {"name": "Bob","age": 35,"email": "bob@example.com"}else:mock_user_info = {"name": "Unknown User","age": 0,"email": "unknown@example.com"}return mock_user_info
  • 有时候我们可能需要根据请求参数来返回不同的Mock数据。例如,根据用户ID返回不同的用户信息。
  • 在这个例子中,/user_info/<int:user_id>是一个带有动态参数的路由。<int:user_id>表示这个参数是一个整数类型的用户ID。视图函数user_info_by_id根据不同的用户ID返回不同的用户信息。
  • 此时,你可以在浏览器中输入相应的 URL 来访问应用的不同接口。例如,要访问根据 user_id 返回模拟用户信息的接口:
    • user_id1 时,在浏览器地址栏输入 http://127.0.0.1:5000/user_info/1,就会返回模拟的用户 Alice 的信息 {"name": "Alice", "age": 25, "email": "alice@example.com"}
    • 同理,当 user_id2 时,输入 http://127.0.0.1:5000/user_info/2 会返回 Bob 的信息;输入其他 user_id 值则会返回默认的 Unknown User 的信息。
    • 另外,访问应用的根目录 http://127.0.0.1:5000/ 会显示 Welcome to the Mock Platform!
  • 代码示例:
from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Welcome to the Mock Platform!'@app.route('/user_info/<int:user_id>')
def user_info_by_id(user_id):if user_id == 1:mock_user_info = {"name": "Alice","age": 25,"email": "alice@example.com"}elif user_id == 2:mock_user_info = {"name": "Bob","age": 35,"email": "bob@example.com"}else:mock_user_info = {"name": "Unknown User","age": 0,"email": "unknown@example.com"}return mock_user_infoif __name__ == '__main__':app.run(debug=True)

(二)处理不同的请求方法

  1. 支持POST请求
from flask import request
@app.route('/login', methods=['POST'])
def login():data = request.get_json()username = data.get('username')password = data.get('password')if username == 'admin' and password == 'password':return {'result': 'success'}else:return {'result': 'failure'}
    • 除了GET请求,很多接口也会使用POST请求来接收数据。例如,模拟一个接收用户登录信息并返回登录结果的接口。
    • 这里@app.route('/login', methods=['POST'])表示这个路由只接受POST请求。在视图函数login中,使用request.get_json()获取POST请求中的JSON数据,然后提取用户名和密码进行验证,并返回相应的登录结果。
  1. 运行
    • 发送POST请求进行测试
      由于该接口只接受POST请求,你不能直接在浏览器中访问来测试它(浏览器一般通过GET请求访问网页)。你可以使用一些工具来发送POST请求进行测试,以下介绍两种常见的方式:

方式一:使用curl命令(在Linux、macOS或安装了curl的Windows系统上可用)

打开一个新的命令行终端(确保与运行Flask应用的终端不同,以免干扰应用的运行),在终端中输入以下命令:

curl -X POST -H "Content-Type: application/json" -d '{"username":"admin","password":"password"}' http://127.0.0.1:5000/login

这条命令的含义如下:

    • -X POST:指定发送的请求类型为POST。
    • -H "Content-Type: application/json":设置请求头,表明发送的数据是JSON格式。
    • -d '{"username":"admin","password":"password"}':指定要发送的JSON数据内容,这里模拟了发送用户名 admin 和密码 password 的情况。
    • http://127.0.0.1:5000/login:指定要请求的Flask应用的登录接口地址。

执行上述命令后,如果登录验证成功,你会在终端看到返回的结果 {"result": "success"};如果将用户名或密码修改为其他值再执行命令,比如:

curl -X POST -H "Content-Type: application/json" -d '{"username":"wrong_user","password":"wrong_password"}' http://127.0.0.1:5000/login

则会看到返回结果 {"result": "failure"}

方式二:使用Postman工具(可在Windows、Linux、macOS上安装使用)

    • 下载并安装Postman工具(可从官方网站 Download Postman | Get Started for Free 下载对应操作系统的版本)。
    • 打开Postman,在界面中:
      • 选择请求类型为 POST
      • 在地址栏输入 http://127.0.0.1:5000/login
      • Headers 选项卡中,添加一个键值对,键为 Content-Type,值为 application/json
      • Body 选项卡中,选择 raw 格式,并在文本框中输入JSON数据,比如 {"username":"admin","password":"password"}(模拟正确登录信息)或其他你想测试的值(如 {"username":"wrong_user","password":"wrong_password"})。
    • 点击 Send 按钮发送请求,在下方的 Response 区域就可以看到返回的结果,与使用curl命令测试时的结果类似,根据输入的用户名和密码是否正确会返回 {"result": "success"}{"result": "failure"}

通过以上步骤,你就可以成功运行包含登录接口的Flask应用,并对其进行POST请求的测试。

  • 支持其他请求方法(PUT、DELETE等)
@app.route('/update_user_info/<int:user_id>', methods=['PUT'])
def update_user_info(user_id):data = request.get_json()# 这里可以添加更新用户信息的逻辑,假设只是简单打印接收到的数据print(f"Updating user {user_id} with data: {data}")return {'message': 'User information updated successfully'}
    • 以模拟一个更新用户信息的PUT请求接口为例。
    • 这个接口接受PUT请求,用于更新指定用户ID的用户信息。通过request.get_json()获取更新的数据,在这里只是简单地打印了接收到的数据,并返回一个成功消息。

五、扩展和优化

(一)数据存储和管理

  1. 使用文件存储Mock数据
{"1": {"name": "Alice","age": 25,"email": "alice@example.com"},"2": {"name": "Bob","age": 35,"email": "bob@example.com"}
}
import json
@app.route('/user_info/<int:user_id>')
def user_info_by_id(user_id):with open('data/user_info.json', 'r') as file:user_data = json.load(file)user_info = user_data.get(str(user_id), {"name": "Unknown User","age": 0,"email": "unknown@example.com"})return user_info
    • 对于简单的Mock平台,可以将Mock数据存储在文件中。例如,将用户信息存储在一个JSON文件中。
    • 创建一个data文件夹,在里面放置一个user_info.json文件,内容如下:
    • 然后修改user_info_by_id函数来从文件中读取数据。
    • 这样,user_info_by_id函数会从user_info.json文件中读取用户信息,根据用户ID获取相应的用户信息,如果用户ID不存在,则返回默认的用户信息。
  1. 使用数据库存储Mock数据(以SQLite为例)
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///mock_data.db'
db = SQLAlchemy(app)
class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50))age = db.Column(db.Integer)email = db.Column(db.String(100))
with app.app_context():db.create_all()user1 = User(name='Alice', age=25, email='alice@example.com', id=1)user2 = User(name='Bob', age=35, email='bob@example.com', id=2)db.session.add(user1)db.session.add(user2)db.session.commit()
@app.route('/user_info/<int:user_id>')
def user_info_by_id(user_id):user = User.query.get(user_id)if user:user_info = {"name": user.name,"age": user.age,"email": user.email}else:user_info = {"name": "Unknown User","age": 0,"email": "unknown@example.com"}return user_info
    • 如果Mock数据比较复杂或者需要更好的管理,可以使用数据库。以SQLite为例,首先需要安装flask - sqlalchemy库,执行pip install flask - sqlalchemy
    • app.py中配置数据库连接并定义模型。
    • 创建数据库表并添加一些示例数据。
    • 修改user_info_by_id函数来从数据库中查询用户信息。
    • 这样,user_info_by_id函数会从SQLite数据库中查询用户信息,根据用户ID获取相应的用户信息,如果用户ID不存在,则返回默认的用户信息。

(二)接口文档和测试

  1. 自动生成接口文档(以Flask - RESTful和Swagger为例)
from flask_restful import Api, Resource
api = Api(app)
class UserInfo(Resource):def get(self, user_id=None):if user_id:# 这里可以调用之前的从文件或数据库获取用户信息的逻辑user_info = {...}return user_infoelse:# 返回所有用户信息的逻辑(假设)return []
api.add_resource(UserInfo, '/user_info', '/user_info/<int:user_id>')
from flasgger import Swagger
app.config['SWAGGER'] = {'title': 'Mock Platform API','uiversion': 3
}
Swagger(app)
    • 安装flask - restfulflasgger库,执行pip install flask - restful flasgger
    • 重构app.py来使用Flask - RESTful构建API。
    • 配置Flasgger来生成接口文档。
    • 启动应用后,可以通过访问/apidocs(默认路径)来查看自动生成的接口文档,包括接口的URL、请求方法、参数和返回值等信息。
  1. 测试Mock接口
import pytest
from app import app
@pytest.fixture
def client():with app.test_client() as client:yield client
def test_user_info(client):response = client.get('/user_info')assert response.status_code == 200assert 'name' in response.get_json()
    • 可以使用pytest等测试框架来测试Mock接口。例如,测试user_info接口。
    • 在这个测试用例中,pytest.fixture定义了一个client对象,用于模拟客户端向应用发送请求。test_user_info函数使用client对象发送一个GET请求到/user_info接口,然后验证响应的状态码是否为200,并且返回的JSON数据中是否包含name字段。

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

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

相关文章

基于Java Springboot外卖平台系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数…

vue2动态导出多级表头表格

需求&#xff1a;导出多级表格&#xff0c;如下&#xff0c;每个人名对应的是不同的城市金钱和年龄&#xff0c;日期占俩行&#xff0c;需要根据数据进行动态展示 1.效果 2.关键代码讲解 2.1数据源 2.2所需插件 npm install xlsx 2.3关键代码 创建name组和date组&#xff0c…

散户持股增厚工具:智能T0算法交易

最近市场很多都说牛市&#xff0c;但是大多数朋友怎么来的又怎么吐出去了。这会儿我们用T0的智能算法交易又可以增厚我们的持仓收益。简单来说&#xff0c;就是基于用户原有的股票持仓&#xff0c;针对同一标的&#xff0c;配合智能T0算法&#xff0c;每天全自动操作&#xff0…

独立开发:一人公司模式下副业产品的全流程

在数字经济的浪潮下&#xff0c;越来越多的开发者选择成为自由职业者或创立一人公司&#xff0c;通过副业产品开发实现个人价值与经济收益的双重提升。本文将围绕一人公司模式下副业产品的设计、开发、运营及变现落地全流程&#xff0c;提供一套实战指南&#xff0c;帮助有志于…

SD模型微调之Textual Inversion和Embedding fine-tuning

​ &#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&a…

【Vue笔记】基于vue3 + element-plus + el-dialog封装一个自定义的dialog弹出窗口组件

这篇文章,介绍一下如何使用vue3+element-plus中的el-dialog组件,自己封装一个通用的弹出窗口组件。运行效果如下所示: 目录 1.1、父子组件通信 1.2、自定义VDialog组件(【v-model】模式) 1.2.1、编写VDialog组件代码 1.2.2、使用VDialog组件 1.2.3、运行效果 1.3、自…

Spring Cloud Alibaba [Gateway]网关。

1 简介 网关作为流量的入口&#xff0c;常用功能包括路由转发、权限校验、限流控制等。而springcloudgateway 作为SpringCloud 官方推出的第二代网关框架&#xff0c;取代了Zuul网关。 1.1 SpringCloudGateway特点: &#xff08;1&#xff09;基于Spring5&#xff0c;支持响应…

不完全微分PID控制算法

不完全微分PID控制算法是一种改进的PID控制方法&#xff0c;主要针对PID控制中的微分环节对高频噪声敏感的问题。通过对微分项进行优化和改造&#xff0c;减少其对噪声的放大作用&#xff0c;同时保留对系统动态变化的响应能力。 不完全微分PID控制原理 不完全微分的核心思想是…

DataOps for LLM 的数据工程技术架构实践

导读 在 LLM 蓬勃发展的今天&#xff0c;数据工程已成为支持大规模 AI 模型训练的基石。DataOps 作为数据工程的重要方法论&#xff0c;通过优化数据集成、转换和自动化运维&#xff0c;加速数据到模型的闭环流程。本文聚焦新一代数据 & AI 集成工具- Apache SeaTunnel 在…

go-zero(七) RPC服务和ETCD

go-zero 实现 RPC 服务 在实际的开发中&#xff0c;我们是通过RPC来传递数据的&#xff0c;下面我将通过一个简单的示例&#xff0c;说明如何使用go-zero框架和 Protocol Buffers 定义 RPC 服务。 一、生成 RPC项目 在这个教程中&#xff0c;我们根据user.api文件&#xff0…

【c++丨STL】list模拟实现(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、节点、迭代器以及函数声明 二、list功能实现 1. 节点 2. 迭代器 迭代器的默认构造 operator* operator-> 前置和-- 后置和--…

SpringBoot:不支持发行版本17超详细解决办法

一开始linux中就已经下好了JDK21&#xff0c;但是后来创建项目的时候选用了JDK23&#xff0c;导致环境错乱&#xff0c;估计大部分都是因为这个原因&#xff0c;接下来我会一步步带大家解决。 检查系统环境&#xff08;以Ubuntu为例&#xff09; 没有下载JDK的可以在官网下载…

计算机网络中的数据包传输机制详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 引言 数据包的基本概念…

Springboot3.3.5 启动流程之 tomcat启动流程介绍

在文章 Springboot3.3.5 启动流程&#xff08;源码分析&#xff09; 中讲到 应用上下文&#xff08;applicationContext&#xff09;刷新(refresh)时使用模板方法 onRefresh 创建了 Web Server. 本文将详细介绍 ServletWebServer — Embedded tomcat 的启动流程。 首先&…

HarmonyOs鸿蒙开发实战(9)=>解析json数据,自动生成实体Bean插件-jsonFormat使用教程(铁粉福利)

1.条件:基于HarmonyOs5.0.0版本. 2.老规矩先看效果> 3.第一步 >下载jsonFormat.jar文件,使用版本1.0.5-deveco https://plugins.jetbrains.com/plugin/24930-jsonformat/versions/stable 4.第二步 > 在DevEco Stuio中安装插件 5.第三步 > 新建bean文件&#xff…

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(2)第一个工程 LED心跳灯

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;2&#xff09;第一个工程 LED心跳灯 前言1.新建工程2.编写控制LED代码3.LED控制独立成.c和.h文件 前言 实际开发中很多时候我们需要有一个类似心跳灯或运行指示灯的灯以不同的状态闪烁以表示程序的运行状态&#xff0c;所以第…

系统掌握大语言模型提示词 - 从理论到实践

以下是我目前的一些主要个人标签&#xff1a; 6 年多头部大厂软件开发经验&#xff1b;1 年多 AI 业务应用经验&#xff0c;拥有丰富的业务提示词调优经验和模型微调经验。信仰 AGI&#xff0c;已经将 AI 通过自定义 Chatbot /搭建 Agent 融合到我的工作流中。头部大厂技术大学…

FromData格式提交接口时入参被转成JSON格式问题

本地上传文件后通过事件提交文件&#xff0c;一般先通过前端组件生成文本流&#xff0c;在通过接口提交文本流&#xff0c;提交文本流一般使用FormData的入参形式传入&#xff0c;接口请求头也默认"Content-Type": “multipart/form-data”&#xff0c;但是某些场景统…

【插件】重复执行 pytest-repeat

安装 pip3 install pytest-repeat 用法 1.命令行 pytest --count num pytest --count 32.装饰器 pytest.mark.repeat(num) #num运行次数 pytest.mark.repeat(5)#执行结果如下&#xff1a;

【Spring】循环引用 解决流程,只用一二级缓存?

文章目录 循环引用循环引用循环引用解决流程为什么不只用一二级缓存&#xff1f;:red_circle: 循环引用 循环引用 循环依赖&#xff1a;循环依赖其实就是循环引用&#xff0c;也就是bean互相持有对方&#xff0c;最终形成闭环。比如A依赖于B&#xff0c;B依赖于A 循环依赖在…