今天的文章分享如下在 FastAPI 框架下,使用 pytest 来自动化测试数据库相关的接口,文章的最后给出全部代码。

最近越来越喜欢使用 FastAPI 来写后端服务了,因为它是 Python 领域性能最好的 Web 框架,它专注于提供高性能的 Web API,其他方面并不限制你的手脚,可以随意使用你喜欢的三方库,这点类似于 Flask,可以量身定制你的后端架构,以满足自己的需求。

需要说明的是,后端服务基本是离不开关系型数据库的,我之前是使用 Django,Django 的 ORM 太优秀了,以至于我从 Django 转 FastAPI 有点很不适应。在 ORM 领域,可以说除了 Django 的 ORM,就是 SQLAlchemy 了。所以不用 Django,就必须会用 SQLAlchemy,要快速了解,看看廖雪峰的官方网站的使用 SQLAlchemy[1] 来快速入门。

FastAPI 涉及数据库的接口写起来并不难,跟着官方文档sql_databases[2],5 分钟,我们就可以生成关于数据库的增删改查的 Restful 风格的 API,难的是如何自动化的测试,

通常情况下,我们会使用 pytest 进行自动化单元测试,根据数据库的记录数来断言,但是,每测试一次,数据库中的记录就保存了下来,你下次测试时如果不手动清理,那测试仍然可能失败。

那怎么解决呢?

那就是利用数据库的回滚功能,会改变数据库记录的接口测试完成后让事务回滚,这样每次测试完成后,数据库的记录数是不变的,每次运行 pytest,数据库的记录数是不变的,这样就可以进行自动化测试。

要想实现这一点,我们需要借助于 pytest 的 fixture 功能。

pytest.fixture 是一个装饰器,用于声明函数是一个 fixture。如果测试函数的参数列表中包含 fixture 名,那么 pytest 会检测到,并在测试函数运行之前执行 fixture。

比如:

import pytest
@pytest.fixture()def some_data():    return 42
def test_some_data(some_data):    assert some_data==42

fixture 包含一个 scope 的可选参数,用于控制 fixture 执行配置和销毁逻辑的频率:

  • scope='function' 函数级别的 fixture 每个测试函数只运行一次。配置代码在测试用例运行之前运行,销毁代码在测试用例运行之后执行。function 是 fixture 参数的默认值。

  • scope='class' 类级别的 fixture 每个测试类只运行一次,不管测试类中有多少个类方法都可以共享这个 fixture

  • scope='module' 模块级别的 fixture 每个模块只运行一次,不管模块里有多少个测试函数,类方法或其他 fixture 都可以共享这个fixture

  • scope='session' 会话级别的 fixture 每次会话只运行一次。一次 pytest 会话中的所有测试函数、方法都可以共享这个 fixture

比如说让数据库回滚的,我们就可以写一个这样的 fixture:​​​​​​​

@pytest.fixture(scope="function")def db(db_engine):    connection = db_engine.connect()    # begin a non-ORM transaction    connection.begin()    # bind an individual Session to the connection    db = Session(bind=connection)    # db = Session(db_engine)    app.dependency_overrides[get_db] = lambda: db    yield db    db.rollback()    connection.close()

当然还有很多 fixture,比如说创建数据库引擎:

​​​​​​​

@pytest.fixture(scope="session")def db_engine():    engine = create_engine(SQLALCHEMY_DATABASE_URL)    if not database_exists:        create_database(engine.url)
    Base.metadata.create_all(bind=engine)    yield engine

再比如,在测试前,数据库中先插入 2 条数据:​​​​​​​

@pytest.fixturedef items(db):    create_item(db, schemas.ItemCreate(title="item 1"))    create_item(db, schemas.ItemCreate(title="item 2"))

把这些 fixture 函数放在文件名conftest.py 中,pytest 会自动读取并执行。至于为什么放在 conftest.py中,请查阅 pytest 文档,这里不展开,

接下来,利用这些 fixture,编写单元测试用例,一个示例如下:​​​​​​​

from fastapi.testclient import TestClientfrom . import crudfrom .main import app
def test_post_items(db):    client = TestClient(app)    client.post("/items/", json={"title": "Item 1"})    client.post("/items/", json={"title": "Item 2"})    client.post("/items/", json={"title": "Item 3"})
    items = crud.get_items(db)    assert len(items) == 3def test_list_items(items, client):    response = client.get("/items")    assert len(response.json()) == 2

其中 test_post_items,测试的是提交了 3 个数据,然后断言数据库中的记录数为 3。test_list_items 有个参数是 items,会调用之前的 fixture,提前往数据库插入了 2 条记录,因此断言记录数为 2。

每个测试函数执行时互不影响,执行完成后,数据库都会回滚,测试前 items 是空的,测试之后 表仍然是空的,这样就可以自动进行数据库的测试了。

完整代码

不能选择 sqlite 数据库进行测试,因为它不支持并发访问。

代码的数据库配置为 mysql,用户名、密码、数据库名请自行修改后执行。

有任何问题都可以找我的哦

FastAPI 之自动化测试数据库接口相关推荐

  1. FastAPI + Vue 前后端分离 接口自动化测试工具 apiAutoTestWeb

    apiAutoTestWeb使用说明 apiAutoTestWeb 是为apiAutoTest的可视化版本,其采用前后端分离( FastAPI + Vue2 )方式实现 具体使用: Python3 + ...

  2. 今天谈一谈python自动化测试中使用异步

    很早已经在项目中使用异步了,比如使用的web框架fastapi就是支持异步写法的,然而,我只学会了 async/await 的写法,可是这种写法真的可以让你的程序变快吗? 异步的概念 同步 异步 同步 ...

  3. 干货:使用Fastapi开发自己的Mock server(附源码)

    最近几天抽空看了下Fastapi的文档,顺便使用它开发了个HTTP(s)协议的Mock server.以后有需要用到挡板的地方,就可以直接使用啦. 项目一级目录: logs用来存放日志文件,日切 ma ...

  4. 浅谈:python自动化测试中使用异步

    很早已经在项目中使用异步了,比如使用的web框架fastapi就是支持异步写法的,然而,我只学会了 async/await 的写法,可是这种写法真的可以让你的程序变快吗? 异步的概念 同步 异步 同步 ...

  5. Django + Pytest搭建在线自动化测试平台

    一.测试平台:     解决分散用例执行方式,提供统一测试用例执行过程.用例管理.测试报告     主要是基于:     fastapi+vue.js     django+vue.js     dj ...

  6. 自动化测试系统的软件架构(转)

    自动化测试系统的软件架构 一.为什么要自动化测试系统 随着产品可测性设计和仪表程控制技术的不断完善和提高,自动化测试系统越来越广泛的被应用于从产品设计研发到生产制造验证的各个环节.自动化测试系统之所以 ...

  7. 接口自动化测试(一)---接口及接口自动化测试概述

    一.接口测试 前后端及接口测试定义 前端:简单来说,我们在应用程序或者网站页面上看到的所有内容都属于前端 后端:用户看不到的东西,通常是与前端进行数据交互,以及网站数据的保存和读取,主要考虑底层业务逻 ...

  8. fastapi 入门系列

    大纲 1. 概述 1.1 什么是FastAPI 1.1 什么是FastAPI FastAPI是一个现代.快速(高性能)的Web框架,用于构建API.它基于Python 3.7+的类型提示(type h ...

  9. 提交表单自动刷新_Web自动化测试:元素的基础操作和浏览器基础操作

    上一节,我们了解了如何定位元素,其实也有涉及对于元素的操作,这一节我们就详细的介绍一下对于元素的操作和对于浏览器的一些操作 一.对于元素的基础操作: clear():清除输入框内的文本 send_ke ...

最新文章

  1. R语言构建logistic回归模型:构建模型公式、拟合logistic回归模型、模型评估,通过混淆矩阵计算precision、enrichment、recall指标
  2. JSP 九大内置对象
  3. 从零开始单排学设计模式「简单工厂设计模式」黑铁 III
  4. C++ 虚函数和纯虚函数的区别
  5. 还觉得linux命令难吗,看这篇2w多字的linux命令详解,通俗易懂
  6. tensorflow中学习率、过拟合、滑动平均的学习
  7. Apache Tomcat Configuration Reference
  8. Objective-C学习笔记--NSLog用法及例子
  9. greenplum配置高可用_Greenplum 的高可用是怎么做到的?
  10. Linux 应用程序的源码包如何安装?
  11. [转]Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理
  12. java如何脱离ide运行_如何脱离IDE使用自己的jar包?
  13. PyTorch 1.8版本!正式支持AMD GPU
  14. python找不到模块pyodbc_“import pyodbc”导致“没有名为pyodbc的模块”
  15. Maven安装及与Eclipse集成
  16. pip 加速_如何将Numpy加速700倍?用 CuPy 呀
  17. StringUtil.format使用介绍
  18. 获取苹果设备的UDID
  19. navicat 解析sql_使用 Navicat 查询分析器优化查询性能(第 1 部分)
  20. html5 游戏制作教程,【整理】一步一步学做HTML5游戏教程

热门文章

  1. ggplot2笔记2:图层的使用——基础、怎样加标签、注释
  2. html接收model数据,QAbstractTableModel数据返回要显示的html代码
  3. linux中查看日志技巧,日志查看技巧之筛选[linux命令集][排查篇]
  4. php7 swoole 扩展,PHP7.2加入swoole扩展
  5. custom的短语_custom的短语_custom的用法总结大全
  6. R语言使用ggplot2包使用geom_violin函数绘制分组小提琴图(配置显示均值、中位数)实战
  7. pandas获取dataframe数据列的数据类型、获取dataframe每类数据类型数据列的个数、使用select_dtypes函数、include参数以及exclude参数按照数据类型筛选数据
  8. keras构建前馈神经网络(feedforward neural network)进行多分类模型训练学习
  9. 过程中存根的作用有_模温机的作用 模压过程中模温机的作用有哪些?
  10. android 拼图课程设计,Flash拼图游戏制作课程设计报告