软件测试基础三十 (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.xdnf.cn/news/19970.html

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

相关文章

vscode集成的终端里backspace键无法退格

解决办法&#xff1a; 搜索“backspace”&#xff0c;然后修改backspce对应的项的快捷键为其它按键组合&#xff0c;如下&#xff1a;

网络抓包工具tcpdump 在海思平台上的编译使用

目录 2&#xff1a;下载源码 1&#xff1a;下载 2&#xff1a;编译 2.1&#xff1a;下载 2.2&#xff1a;编译libpcap 2.3&#xff1a;编译tcpdump 3&#xff1a;使用验证 音视频开发中经常用到抓包工具分析数据&#xff0c;这里是海思平台下的tcpdump工具编译使用流程&a…

详细描述一下Elasticsearch索引文档的过程?

大家好&#xff0c;我是锋哥。今天分享关于【详细描述一下Elasticsearch索引文档的过程&#xff1f;】面试题。希望对大家有帮助&#xff1b; 详细描述一下Elasticsearch索引文档的过程&#xff1f; Elasticsearch的索引文档过程是其核心功能之一&#xff0c;涉及将数据存储到…

Android:任意层级树形控件(有效果图和Demo示例)

先上效果图&#xff1a; 1.创建treeview文件夹 2.treeview -> adapter -> SimpleTreeAdapter.java import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ListView; i…

Jmeter中的断言(四)

13--XPath断言 功能特点 数据验证&#xff1a;验证 XML 响应数据是否包含或不包含特定的字段或值。支持 XPath 表达式&#xff1a;使用 XPath 表达式定位和验证 XML 数据中的字段。灵活配置&#xff1a;可以设置多个断言条件&#xff0c;满足复杂的测试需求。 配置步骤 添加…

3243.新增道路查询的最短距离

给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#xff08; 0 < i < n - 1&#xff09;。 queries[i] [ui, vi] 表示新建一条从城市 ui 到城市 vi 的单向道路…

MySQL - 表的约束

文章目录 1、空约束2.默认值3.列描述4.zerofill5.主键6.自增长7.唯一键8.外键 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。比如有一个字段是…

VirtualBox安装虚拟机Windows server 2019系统只显示cmd命令窗口

原因&#xff1a; 没注意选用了核心安装选项&#xff0c;此选项不安装图形界面 解决&#xff1a; 方式一&#xff1a;重装虚拟机&#xff0c;选用有图形界面的版本 方式二&#xff1a;在cmd窗口中安装图形界面 Dism /online /enable-feature /all /featurename:Server-Gui-Mgm…

基于卷积神经网络的皮肤病识别系统(pytorch框架,python源码,GUI界面,前端界面)

更多图像分类、图像识别、目标检测等项目可从主页查看 功能演示&#xff1a; 皮肤病识别系统 vgg16 resnet50 卷积神经网络 GUI界面 前端界面&#xff08;pytorch框架 python源码&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷积神经网络的皮肤病识…

MixVpr重定位实战----onnx以及Tensorrt适配

0. 简介 对于深度学习而言&#xff0c;通过模型加速来嵌入进C是非常有意义的&#xff0c;因为本身训练出来的pt文件其实效率比较低下&#xff0c;在讲完BEVDET和FastBEV后&#xff0c;这里我们将展开实战&#xff0c;从pt到onnx再到tensorrt&#xff0c;以MixVpr作为例子&…

Java基于微信小程序的校园跑腿平台(V2.0)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Spring Boot图书馆管理系统:疫情中的管理利器

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足&#xff0c;创建了一个计算机管理疫情下图书馆管理系统的方案。文章介绍了疫情下图…

【CUDA】Branch Divergence and Unrolling Loop

目录 一、避免分支发散 1.1 并行规约问题 1.2 并行规约中的发散 二、UNrolling Loops 一、避免分支发散 控制流有时依赖于 thread 索引。同一个warp中&#xff0c;一个条件分支可能导致性能很差。通过重新组织数据获取模式可以减少或避免 warp divergence。具体问题查看下…

WIN系统解决小喇叭红色叉号的办法

WIN系统解决小喇叭红色叉号的办法 WIN系统提示无音频设备&#xff0c;无法播放声音&#xff0c;重装驱动无法解决 写在前面 前段时间搞了套6750GRE&#xff0c;用了两三个月&#xff0c;老是掉驱动&#xff0c;后面折腾了一下子&#xff0c;终于是不掉了。突然&#xff0c;某…

免费S3客户端工具大赏

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;S3免费客户端工具大赏 1. S3 GUI GitHub地址&#xff1a;https://github.com/aminalaee/s3gui 简介&#xff1a;S3 GUI 是一款基于 Flutter 构建的免费开源 S3 桌面客户端&#xff0c;支持桌面、移动和网络平台。 特…

uniapp 购物弹窗组件 (微信小程序)

效果图&#xff0c;暂时只适应单规格&#xff0c;居中弹出和下方弹出&#xff0c;如需求不满足&#xff0c;请自行修改代码 &#xff08;更新于24/11/15) 居中显示效果 下方弹出效果 html <template><view class"" v-if"show":class"mod…

力扣-Mysql-1811 - 寻找面试候选人(中等)

一、题目来源 1811. 寻找面试候选人 - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表: Contests -------------------- | Column Name | Type | -------------------- | contest_id | int | | gold_medal | int | | silver_medal | int | | bronze_medal | …

【C语言】volatile 防止编译的时候被优化

volatile 易变的 volatile是 C 和 C 中的一个类型修饰符&#xff0c;用于指示编译器该变量可能在程序之外被更改&#xff0c;因此不应对其进行优化。这在涉及硬件寄存器、信号处理或多线程编程时非常有用。 如果你做过单片机开发&#xff0c;你肯定写过这样的代码&#xff1a;…

makefile速通

makefile速通 文章目录 makefile速通1.基础显式规则隐含规则%*通配符 赋值 伪目标CFLAGS 2.函数wildcardpatsubst 3.项目实例 1.基础 显式规则 目标文件&#xff1a;依赖文件 [TAB] 指令隐含规则 % 任意* 所有通配符 符号含义$^所有依赖文件$所有目标文件$<所有依赖文…

面向服务的软件工程——巨详细讲解商务流程建模符号 (BPMN),一篇章带你入门BPMN!!!(week1)

文章目录 一、前言二、重点概念三、BPMN元素讲解流对象1.活动任务(Task)子流程(sub-process)多实例活动连接对象序列流消息流关联泳道Artifacts数据对象组(Group)事件(Events)启动事件中间事件结束事件边界事件边界事件1边界事件2小疑问?网关参考文献:一、前言 在我们…