最近几天抽空看了下Fastapi的文档,顺便使用它开发了个HTTP(s)协议的Mock server。以后有需要用到挡板的地方,就可以直接使用啦。

项目一级目录:

logs用来存放日志文件,日切

main:启动入口程序,直接运行

requirements.txt:依赖包

common中存放日志模块,核心模块等公用部分。

apis用来存放各个项目的挡板服务,各目录以项目为单位分开;每个项目目录下固定有三个文件夹:

api_operation:存放接收post、get等请求并返回Mock响应的代码。

config:存放Mock的匹配规则

responce_file:存放Mock响应的文件,json、txt.

注意:config下的配置文件名与responce_file要一一对应。

api_operation的开发

import timefrom fastapi import APIRouter, Path, Queryfrom starlette.responses import FileResponsefrom starlette.requests import Requestfrom common.mock_responce import MockResponcefrom common.log_config import getlogerrouter = APIRouter()logger = getloger(name)@router.post("/v1/{url_path}")async def json_res(request: Request, url_path=Path(…, title=“The ID of the item to get”)): print(request.url) # query_args = request.query_params # logger.info(‘query_args:’, query_args) # logger.info(query_args.get(‘entInfo’)) # form_args = await request.form() # print(‘form_args:’, form_args) # print(form_args.get(‘entInfo’)) # byte_body = await request.body() # try: # import json # b_body = json.loads(byte_body.decode(‘UTF-8’)) # print(‘byte_body:’, b_body) # print(type(b_body)) # except: # b_body = byte_body.decode(‘UTF-8’) # print(‘byte_body:’, b_body) # print(type(b_body)) json_body = await request.json() return FileResponse(MockResponce(‘test_api’, ‘A001’, json_body).responce_filter())@router.post("/v1/txt")async def txt_res(request: Request): form_args = await request.form() return FileResponse(MockResponce(‘test_api’, ‘A002’, form_args).responce_filter())
通过request参数可以获取请求传进来的所有header、参数等;

参数通常有三种方法传进来:

1.url传参,query_args = request.query_params来获取

2.form-da传参,form_args = await request.form()来获取

3.body传参,如果穿的是json或json格式的字符串,用json_body = await request.json()来获取;如果穿的是二进制或类json字符串,可以使用byte_body = await request.body()来获取。

然后将取得的值传给核心模块即可:

MockResponce(‘test_api’, ‘A001’, json_body).responce_filter()

test_api:挡板项目名,即apis下一级目录的名称。

A001:规则文件名

json_body:从request所取得的参数

技术细节:

1,2两种方式接收到的参数虽然不是字典,但是都可以使用跟字典一样的方式取得参数,例如,url传参如下:

http://127.0.0.1:8000/vba1/vvv/23123?entInfo=平安银行股份有限公司&appid=weq12311

可以使用query_args[‘entInfo’]或者query_args.get(‘entInfo’)来获取entInfo的值。

这样核心模块就可以将取得的entInfo与规则文件进行匹配,并根据匹配的结果获得相应文件返回。

3这种方式接收的参数,大部分为json格式,可以直接转化为字典,但是在复杂嵌套的json中想要取得entInfo的值,就更复杂,Mock server核心部分已经做了封装,会自动处理。少部分body传进来的可能是二进制,需根据实际情况再处理。

服务路由
以上开发完成后,需要将服务添加路由至fastap的app,类似于Flask的Blueprint,具体位置如下图

在这里还可以设置请求路径共同的部分prefix等。

from fastapi import FastAPIfrom apis.test_api.api_operation import
study1,study2from apis.CIF_api.api_operation import
bindcard,evalPhonefrom apis.vba_api.api_operation import vba1,vba2def
create_app(): app = FastAPI(title=‘FastApi Mock Server’,
description=‘这是使用fastapi开发的挡板服务程序,旨在使用简单的操作实现快速可用的挡板服务’,
version=0.1) app.include_router( study1.router,
prefix="/items", tags=[“items”], dependencies=[],
responses={404: {“description”: “Not found”}}, )
app.include_router( study2.router, prefix="/test",
tags=[“test”], dependencies=[], responses={404:
{“description”: “Not found”}}, ) app.include_router(
bindcard.router, prefix="/bindcard", tags=[“bindcard”],
dependencies=[], responses={404: {“description”: “Not found”}},
) app.include_router( evalPhone.router,
prefix="/evalPhone", tags=[“evalPhone”],
dependencies=[], responses={404: {“description”: “Not found”}},
) app.include_router( vba1.router, prefix="/vba1",
tags=[“vba1”], dependencies=[], responses={404:
{“description”: “Not found”}}, ) app.include_router(
vba2.router, prefix="/vba2", tags=[“vba2”],
dependencies=[], responses={404: {“description”: “Not found”}},
) return app

config下规则文件的定义
#入参为空,value:None#vba1即该文件的名字,必须保持一致,纯数字要加引号,不然会被yaml当做intvba1: - res_file: 平安银行股份有限公司.json enable: Y index: 1 delay: 0 condition: - {field: entInfo,rule: is,value: 平安银行股份有限公司} - {field: appid,rule: is,value: weq12313331} - res_file: 查询无记录.json enable: Y index: 2 delay: 0 condition: - {field: entInfo,rule: is,value: 查询无记录} - res_file: 入参为空.json enable: Y index: 3 delay: 0 condition: - {field: entInfo,rule: is,value: None} - res_file: 文本响应.txt enable: Y status: 1 index: 7 delay: 0 condition: - {field: entInfo,rule: regex,value: ‘.+’}
res_file:responce_file对应目录下存放Mock响应的文件名,必须带后缀。

enable:是否启用该规则,Y,y启用,N,n不启用

index:规则序号

delay:响应延时,为空默认为0,例如delay: 5,如果匹配到这条规则,则延时5秒再返回响应。

condition:匹配该规则的条件,如果多个条件为且的关系,所有规则并列放在一起,必须满足全部;如果多条规则为或的关系,则所有规则分开写,命中任意一条即返回。

field:需要用来匹配的关键字,如上则表示需要从请求的参数中拿到entInfo的值

rule:匹配规则,is-完全一样;regex-正则匹配

value:规则的期望值,field中取得的值与value中的值匹配。value: None表示传入的参数为空或未传入该参数。

规则匹配顺序,按照规则文件中写的顺序,从上到下,命中即返回。

技巧:

在规则文件末尾一般放一个全匹配的正则规则兜底,保证任何请求都有响应:

  - res_file: 文本响应.txt    enable: Y    status: 1    index: 7    delay: 0    condition:      - {field: entInfo,rule: regex,value: '.+'}

服务启动

以上都开发好后,使用时,在main.py同级目录的命令行运行:

uvicorn main:app --host 0.0.0.0 --port 8000 --reload

启用HTTPS:

uvicorn main:app --host 0.0.0.0 --port 8000 --reload --ssl-keyfile server.key --ssl-certfile server.crt

如果要启用http,则加入server.crt与server.key启动服务,并将ca.crt追加到客户端linux服务器的授信列表:

cat ca.crt>> /etc/pki/tls/certs/ca-bundle.crt

或者直接运行main.py启动服务

import uvicornfrom fastapi import Depends, FastAPI, Header, HTTPExceptionfrom apis import create_appfrom common.log_config import getlogerapp = create_app()logger = getloger(__name__)@app.on_event("shutdown")def shutdown_event():    print('shut down')@app.on_event("startup")async def startup_event2():    print('startup')if __name__ == "__main__":    uvicorn.run('main:app', host="0.0.0.0", port=8000, reload=True)    # uvicorn.run('main:app', host="0.0.0.0", port=8000, reload=True, ssl_keyfile='server.key', ssl_certfile='server.crt')

Mock server使用

使用时,只需要修改规则yaml文件和responce_file响应文件即可。

例如,对于上面的规则,body给不同的传参效果:

此外,由于fastapi的特点,还可以使用自带的swagger服务查看所有挡板服务:

代码已上传中github:http://github.com/superxuu/fastapi_mock

今天分享就到这里,喜欢的点个关注~~


最后: 给大家推荐一个 q 群:902061117 里面有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果对你有一点点帮助,各位的「点赞」就是小编创作的最大动力,我们下篇文章见!

好文推荐

2021软件测试工程师面试题汇总(内含答案)-看完BATJ面试官对你竖起大拇指!

什么样的人适合从事软件测试工作?

软件测试和软件开发哪个发展更好

那个准点下班的人,比我先升职了…

干货:使用Fastapi开发自己的Mock server(附源码)相关推荐

  1. 用ionic快速开发hybird App(已附源码,在下面+总结见解)

    用ionic快速开发hybird App(已附源码,在下面+总结见解) 1.ionic简介 ionic 是用于敏捷开发APP的解决方案.核心思路是:利用成熟的前端开发技术,来写UI和业务逻辑.也就是说 ...

  2. arcgis开发 多版本之间如何兼容_arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)...

    你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...

  3. python 开发视频播放网站_python开发微电影视频网站教程附源码

    做为一个合格的Pythoner,只掌握一个框架是不够,如果你有过其它Python框架(例如django)的使用经验,对比不同框架的特性来学习,你将收获更多 当前信息若含有黄赌毒等违法违规不良内容,请点 ...

  4. 基于C++开发的仓库管理系统(附源码)

    基于C++开发的仓库管理系统(附源码) 一.简介 1.开始菜单 2.登录后的菜单 二.C++代码 main.cpp   一.简介   仓库管理系统的功能有登录.注册.查询功能.入库功能.出库功能.添加 ...

  5. Flask+VUE 实现页面增删改查显示开发+测试(图文教程附源码)

    目录 一.新建项目并初始化 二.安装依赖 axios.elementUI 三.Vue代码 四.进行接口联调 五.后端接口优化 六.web页面功能测试 七.总结 八.展望 九.附录(截止发文时的代码) ...

  6. 干货|Pytorch弹性训练极简实现( 附源码)

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨颜挺帅@知乎(已授权) 来源丨https://zhuanlan ...

  7. 【毕设|Java项目开发合集】(附源码)

    [毕设|Java项目开发合集] 14个Java项目(附源码)助你轻松搞定毕业设计! 1.新冠疫情统计系统 2.家教系统 3.进销存管理系统 4.饮食分享平台 5.宠物领养平台 6.销售评价系统 7.酒 ...

  8. 【Java游戏开发】坦克大战(附源码+课件+资料)

    本课程讲解了一个坦克大战游戏的详细编写流程,即使你是刚入门java的新手,只要你简单掌握了该游戏所需要的javase基础知识,便可以跟随教程视频完成属于你自己的坦克大战游戏!同时还可以加深和巩固你对面 ...

  9. 厉害了!Spring Boot + Vue 开发移动端商城(附源码、文档、视频)!

      Java大联盟 致力于最高效的Java学习 关注 B 站搜索:楠哥教你学Java 获取更多优质视频教程 前言 最近有不少小伙伴留言希望楠哥出一套 Spring Boot + Vue 项目实战教程, ...

最新文章

  1. R语言可视化分面图、多变量分组嵌套多水平t检验、可视化多变量分组嵌套多水平分面条形图(faceting bar plot)并添加显著性水平、添加误差条
  2. fieldset在ie8下的margin\padding bug规避
  3. 《解剖PetShop》系列之二
  4. FL的萌新之路,开始了!
  5. linux ubuntu deepin apache2 rewrite
  6. PTA 数据结构与算法题目集(中文)
  7. VMware下Ubuntu无法全屏显示问题
  8. button设置disabled属性不生效_jQuery属性节点
  9. 比Redis快5倍的中间件,究竟为什么这么快?
  10. bzoj 3750: [POI2015]Pieczęć(模拟)
  11. android不同sdk版本控制,闲谈Android SDK开发
  12. 登录mysql服务器的典型命令_Mysql 远程登录及常用命令
  13. 中国音频放大器市场现状研究分析与发展前景分析报告
  14. 在知识经济时代,如何实现企业内部的知识共享
  15. CTF逆向(Reverse)知识点总结
  16. Python 爬虫心得
  17. 载谭 Binomial Sum:多项式复合、插值与泰勒展开
  18. 西安交大成立环保大数据研究中心
  19. 文件md5加密基本操作
  20. ZooKeeper : Curator框架之分布式锁InterProcessReadWriteLock

热门文章

  1. python快速比较两个json_Python 比较两个json的方法
  2. 谈谈社群收割用户的六板斧
  3. SQL Server 2016 新功能之综述
  4. 盒马把ID玩没了?更名“盒盒马马”后原昵称改不回来,网友笑翻了:官微急了...
  5. 苹果大幅削减iPad产量 将芯片等部件调配给iPhone 13
  6. 消息称字节跳动将推迟IPO 官方回应:尚无上市计划
  7. B站成立快乐奖学金 首期投入419万4172元
  8. 手机蓝绿厂终于转正了,已有“名分”!
  9. 美团将建新上海总部 斥资65亿元拿下上海杨浦商办地块
  10. 暖心!湖北伢雷军为家乡再捐1270万 大批紧缺医护物资连夜运抵武汉