對於開發好的接口需要進行測試之後次才能發佈。當我們在開發的時候,沒有提測前,我們也要對我們自己的接口進行測試,那麼FastAPI 自身也帶了針對開發的接口的測試的。我們看下FastAPI官方給我們了什麼樣的支持呢。
接口還是基於FastAPI 學習之路(三十七)元數據和文檔 URL實現。我們看下如何測試。
from fastapi import FastAPI from fastapi.testclient import TestClient from routers.user import usersRouter from routers.items import itemsRouter app = FastAPI(docs_url="/openapi", redoc_url="/apidoc") app.include_router(usersRouter, prefix="/user", tags=['users']) app.include_router(itemsRouter, prefix="/items", tags=['Itmes']) client = TestClient(app) def test_read_main(): response = client.get("/items/items/") assert response.status_code == 200 assert response.json() == [] if __name__=="__main__": test_read_main()
其實很簡單,fastapi裏面有個模塊,我們直接導入進來,編寫用例即可。
可是我們簡單的寫的,運行後只是沒有報錯而已。證明執行成功,但是在實際中,我們做還是不夠的,我們想要看着是否執行通過。如何實現呢。
我們可以python自帶的unittest來組織測試用例。
我們看下改造後的。
from fastapi import FastAPI from fastapi.testclient import TestClient from routers.user import usersRouter from routers.items import itemsRouter import unittest app = FastAPI(docs_url="/openapi", redoc_url="/apidoc") app.include_router(usersRouter, prefix="/user", tags=['users']) app.include_router(itemsRouter, prefix="/items", tags=['Itmes']) class FastApiTest(unittest.TestCase): def setUp(self) -> None: self.client = TestClient(app) def tearDown(self) -> None: self.client=None def test_read_main(self): response = self.client.get("/items/items/") self.assertEqual(response.status_code,200) self.assertEqual(response.json(),[]) def test_read_one(self): response = self.client.get("/items/items/?limit=1") self.assertEqual(response.status_code, 200) self.assertEqual(len(response.json()), 1) if __name__=="__main__": unittest.main()
我們看下執行結果
我們可以改造下,單獨放在一個test文件中。
改造後的測試文件
from main import app import unittest from fastapi.testclient import TestClient class FastApiTest(unittest.TestCase): def setUp(self) -> None: self.client = TestClient(app) def tearDown(self) -> None: self.client = None def test_read_main(self): response = self.client.get("/items/items/") self.assertEqual(response.status_code, 200) self.assertEqual(response.json(), []) def test_read_one(self): response = self.client.get("/items/items/?limit=1") self.assertEqual(response.status_code, 200) self.assertEqual(len(response.json()), 1) if __name__ == "__main__": unittest.main()
我們可以執行以下
這樣我們就實現了對fastapi在開發過程中的接口測試,很簡單,我們也不用啓動服務端。
文章首發在公衆號,歡迎關注。