Backend/FastAPI
-
[TDD] FastAPI에서 pytest 로 단위테스트 하기 - 4. pytest 에서 테스트 병렬 수행 및 Html 결과 출력하기Backend/FastAPI 2024. 2. 18. 20:22
필자는 전체 통합 테스트를 하면서, main_test.py의 테스트 케이스가 많아서 시간이 좀 걸리는 것을 발견했다. 이를 관련하여 찾아보다가, pytest 자체적으로 병렬 처리를 하는 라이브러리가 있다는 것을 발견했고, 이를 적용해보았다. 그리고 나아가 결과물을 html로 볼 수 있도록 하는 방법도 같이 적어보도록 하겠다! 1. pytest-xdist 설치 : pip install pytest-xdist 실행방법_1 : pytest -n auto {test파일명}.py 실행방법_2: pytest -n {프로세스 개수} {test파일명}.py main_test.py를 실행했을 때! 저번과 달리 worker수가 등장한다 - > 이때 -n -auto 옵션이기 때문에 cpu 코어 개수에 다라 프로세스 개수를 ..
-
[TDD] FastAPI에서 pytest 로 단위테스트 하기 - 3. pytest 에서 Parameterize 사용법Backend/FastAPI 2024. 2. 18. 17:44
이번에는 본격적으로 테스트 파일을 만들면서, 여러가지 Request를 보내는 Parameterize 사용법에 대해 설명하겠다. 먼저, parameterize란 무엇일까? 테스트 케이스마다 테스트 값을 포함한 테스트 함수를 호출하는 코드도 중복 작성하는 부분이다. @pytest.mark.parametrize(args, argvalues) 데코레이터로 작성하여 테스트 코드를 간결하게 만들 수 있다. (필자의 경우 -> 테스트 값을 포함하지 않았다. - 통신 200이 목적이었기 때문에) 그렇다면, 어떻게 적용했는지 코드를 통해서 보자 import pytest from fastapi.testclient import TestClient from main import start_app app = start_app(..
-
[TDD] FastAPI에서 pytest 로 단위테스트 하기 - 2. pytest 적용하기Backend/FastAPI 2024. 2. 16. 22:26
필자는 앞서, TDD에 대한 설명을 했다. 이제는 바로 적용해보자 (가상환경): pip install pytest 와 같이, Pytest library를 설치한다. 이후, 1. 구조 2. 명명규칙 만 잘 따르면 금방 진행된다! 1. 구조 구조는 기존의 app 과 같은 선상에 test 폴더를 위치해준다. app > api test > api 꼭 __init__.py 파일을 넣어준다! (넣지 않을 경우 -> ModuleNotFoundError가 발생 ) 2. 명명 규칙 파일 이름 : test_*.py 혹은 *_test.py(python3.8 ver) 형식으로 지정 클래스 명칭: class Test* 형식 클래스 메서드 혹은 함수 명칭 : def test_* 형식 (pytest라는 Librarys는 test...
-
[TDD] FastAPI에서 pytest 로 단위테스트 하기 - 1. 단위 테스트란?Backend/FastAPI 2024. 2. 16. 21:40
필자는, 현재 프로젝트를 진행하며 수정사항이 있을 때 마다 main.py를 구동하여 테스트 하였다. 테스트 코드를 미리 작성하면 편리하다는 것을 알지만,,, 마감이 얼마 남지 않았기에 개발을 후다닥 하였다. 하지만 지금이라도 늦지 않았다 생각하고, 마음먹고 작성해보았다. pytest를 적용하기 앞서, 단위 테스트가 왜 중요한지, 좋은 단위 테스트란 무엇인지 찾아보았다. 단위테스트(Unit Test)를 작성해야 하는 이유 1. 코드 수정 혹은 기능 추가 -> 바로바로 검증 가능 2. 리팩토링 -> 안정성 & 빠른 속도 3. 테스트에 대한 시간과 비용 감소 (ex - db 연결) 우리가 주로 하는 테스트는 과연 좋은 테스트 일까? 만약 100개 넘는 API에, request의 종류가 각 5개씩이라면, 총 5..
-
FastAPI에서 DB Connection-mysql 연결하기Backend/FastAPI 2023. 9. 21. 14:48
필자는 mysql 설치 완료 후, FastAPI에서 mysql을 연결하여 사용하려 한다. 먼저, 이 프로젝트의 구조는 아래와 같다. api : 메인 로직 작성 (mvc 패턴에서 controller 역활과 같다.), router(url 경로에 따라 포함하고 있다.) db : db 연결, db 세션 관리 model : db 컬럼 정의, 그 외 모델들을 정의 middlewares : 토큰 및 accesscontrol 정의 schemas: type 정의 utils: 공통 함수 정의 __init__.py: 해당 폴더가 패키지의 일부 즉, 연결 된다는 것을 나타냄. 파일 자체에 작성되어 있는 것은 없음 본격, DB 연결하기 필자의 경우, main.py에 설정하였다. 1. main.py # main.py import..
-
FastAPI에서 빅쿼리 호출 및 전처리까지Backend/FastAPI 2023. 6. 27. 17:56
필자는 Bigquery 연동 후 class로 만드는 것 까지 완성했다. 이제 간단한 API를 통해 request -> bigquery -> reponse 까지의 일련의 과정을 나열해보자 먼저, 새로운 tip.py 라는 페이지를 controller, router, model에 생성한다. (다른 API와 헷갈리지 않기 위해 만들었음) 아래는 router의 tip.py를 만든 코드이다. from fastapi import APIRouter, HTTPException from typing import Union, List, Dict from common.exception import * from controller import tip as ctrl_tip from model import tip router = ..
-
FastAPI 로 router 구현하기Backend/FastAPI 2023. 6. 26. 21:38
필자는 mvc 패턴 구조를 기반으로 할 때, 동일한 이름의 파일명으로 통일해준다. (오른쪽 그림 참고) 만약 food.py 중 하나의 API를 수정해야 한다고 가정하자. 이때, response model 의 타입 변경을 위해서 model속 food.py만 수정하면 되는 편리함(?) 이 있다. -> 유지 보수 편리! -> 특히, 서로 서로 참고할 때(from model import food 와 같이 가독성 및 이해하기 쉬움 ) 그리고, router속의 여러가지 api들은 api.py 에 묶어서 main.py의 미들웨어에서 사용 예정이다! 본격적으로 API를 하나 만들어 보자! (보통, 화면 설계서를 바탕으로 API 명세서를 작성 후 API를 만든다!) 1. query string 을 사용 할 때 # rou..
-
FastAPI - main.py 구성하기Backend/FastAPI 2023. 6. 26. 21:13
필자도 Fastapi를 처음 접했을 때, main.py에 test용 api를 만들고 풀 명령어를 이용하여 test를 했었다. (아래와 같이) from fastapi import FastAPI from typing import Union app = FastAPI() @app.get("/") def root(): return {"hello root"} @app.get("/world") def world(): return {"hello world"} @app.get("/table/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} 명령어 : uvicorn main:app --..