• 首页
  • 国产小呦泬泬99精品
  • 最近2019中文字幕在线高清
  • 免费看少妇作爱视频
  • 曰批全过程免费视频在线观看网站
  • 国色天香在线观看全集免费播放
  • 婆岳同床双飞呻吟
  • 免费看少妇作爱视频你的位置:三级小说 > 免费看少妇作爱视频 > FastAPI 之自动化测试数据库接口

    FastAPI 之自动化测试数据库接口

    发布日期:2022-06-18 17:11    点击次数:90

    FastAPI 之自动化测试数据库接口

    今天的著作分享如下在 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 进行自动化单位测试,凭据数据库的记载数来断言,小12萝8禁在线喷水观看然则,每测试一次,数据库中的记载就保存了下来,你下次测试时若是不手动计帐,那测试仍然可能失败。

    那怎么责罚呢?

    那即是讹诈数据库的回滚功能,会改造数据库记载的接口测试完成后让事务回滚,这么每次测试完成后,数据库的记载数是不变的,每次运转 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.fixture def 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 TestClient from . import crud from .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) == 3   def 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,用户名、密码、数据库名请自行修改后推论。

     



    Powered by 三级小说 @2013-2022 RSS地图 HTML地图