成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

FastAPI 之自動化測試數據庫接口

運維 數據庫運維 自動化
今天的文章分享如下在 FastAPI 框架下,使用 pytest 來自動化測試數據庫相關的接口,文章的最后給出全部代碼。

[[442950]]

今天的文章分享如下在 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。

比如:

  1. import pytest 
  2.  
  3. @pytest.fixture() 
  4. def some_data(): 
  5.     return 42 
  6.  
  7. def test_some_data(some_data): 
  8.     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:

  1. @pytest.fixture(scope="function"
  2. def db(db_engine): 
  3.     connection = db_engine.connect() 
  4.     # begin a non-ORM transaction 
  5.     connection.begin() 
  6.     # bind an individual Session to the connection 
  7.     db = Session(bind=connection
  8.     # db = Session(db_engine) 
  9.     app.dependency_overrides[get_db] = lambda: db 
  10.     yield db 
  11.     db.rollback() 
  12.     connection.close() 

當然還有很多 fixture,比如說創建數據庫引擎:

  1. @pytest.fixture(scope="session"
  2. def db_engine(): 
  3.     engine = create_engine(SQLALCHEMY_DATABASE_URL) 
  4.     if not database_exists: 
  5.         create_database(engine.url) 
  6.  
  7.     Base.metadata.create_all(bind=engine) 
  8.     yield engine 

再比如,在測試前,數據庫中先插入 2 條數據:

  1. @pytest.fixture 
  2. def items(db): 
  3.     create_item(db, schemas.ItemCreate(title="item 1")) 
  4.     create_item(db, schemas.ItemCreate(title="item 2")) 

把這些 fixture 函數放在文件名conftest.py 中,pytest 會自動讀取并執行。至于為什么放在 conftest.py中,請查閱 pytest 文檔,這里不展開,

接下來,利用這些 fixture,編寫單元測試用例,一個示例如下:

  1. from fastapi.testclient import TestClient 
  2. from . import crud 
  3. from .main import app 
  4.  
  5. def test_post_items(db): 
  6.     client = TestClient(app) 
  7.     client.post("/items/", json={"title""Item 1"}) 
  8.     client.post("/items/", json={"title""Item 2"}) 
  9.     client.post("/items/", json={"title""Item 3"}) 
  10.  
  11.     items = crud.get_items(db) 
  12.     assert len(items) == 3 
  13.  
  14.  
  15. def test_list_items(items, client): 
  16.     response = client.get("/items"
  17.     assert len(response.json()) == 2 

其中 test_post_items,測試的是提交了 3 個數據,然后斷言數據庫中的記錄數為 3。test_list_items 有個參數是 items,會調用之前的 fixture,提前往數據庫插入了 2 條記錄,因此斷言記錄數為 2。

每個測試函數執行時互不影響,執行完成后,數據庫都會回滾,測試前 items 是空的,測試之后 表仍然是空的,這樣就可以自動進行數據庫的測試了。

完整代碼

不能選擇 sqlite 數據庫進行測試,因為它不支持并發訪問。

 

代碼的數據庫配置為 mysql,用戶名、密碼、數據庫名請自行修改后執行。

 

責任編輯:武曉燕 來源: Python七號
相關推薦

2013-06-07 19:04:15

測試

2018-05-11 08:29:10

Python自動化測試數據驅動

2018-05-11 13:39:05

PythonCSV接口測試

2023-05-18 14:01:00

前端自動化測試

2017-01-17 15:14:49

MySQL數據庫自動化

2011-04-01 15:07:29

數據庫自動化

2023-09-13 11:40:12

2022-12-26 12:30:28

接口測試

2012-02-27 17:34:12

Facebook自動化

2021-09-03 09:56:18

鴻蒙HarmonyOS應用

2022-02-17 10:37:16

自動化開發團隊預測

2013-05-16 10:58:44

Android開發自動化測試

2014-04-16 14:15:01

QCon2014

2010-12-21 13:13:10

BMC數據庫自動化服務

2011-12-23 17:09:57

自動化測試

2021-06-30 19:48:21

前端自動化測試Vue 應用

2012-12-24 22:54:31

2024-11-01 15:05:12

2016-09-23 09:22:12

2014-11-20 13:49:15

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人第一页 | 国产一区二区在线免费播放 | 日韩在线欧美 | 亚洲一区视频 | 成人免费xxxxx在线视频 | 成人精品一区 | 一区视频 | 涩涩视频在线看 | 国产精品视频一区二区三区不卡 | 精品亚洲一区二区 | 欧美三级免费观看 | 精品国产一区二区在线 | 亚洲精品免费视频 | 国产成人免费视频网站高清观看视频 | 亚洲国产精品人人爽夜夜爽 | 日本一二区视频 | 欧美福利一区 | 国产91av视频在线观看 | 一本大道久久a久久精二百 欧洲一区二区三区 | 日韩精品一区在线 | 亚洲区一区二 | 综合久久av | 久久青 | 久久精品一 | 国产黄色大片 | 手机在线观看av | av国产精品毛片一区二区小说 | 亚洲综合一区二区三区 | 国产精品久久久久久久久久久久久久 | 91网在线观看 | 黄色大片网站 | 欧美一区视频 | 国产精品夜间视频香蕉 | 亚洲综合久久久 | 国产一区| 国产三级一区二区三区 | 婷婷综合 | 亚洲精品电影 | 91视频91| 欧美一级在线观看 | 日韩av在线一区二区 |