Unit test단위로 flask api 리팩토링 하기

최지웅·2025년 8월 21일

백엔드

목록 보기
4/6

(25.08.21)

테스트 코드 작성 중 발견한 문제

pytest기반 초기 테스트 실행 velog
위 글에서처럼 pytest기반으로 한 테스트 코드 환경 설정을 마쳤지만, 현재 사용중인 app.py에 등록된 api들이 사실상 Integral한 작업을 수행하다보니 UnitTest를 구성하기에 어려움이 있었다(ex. /search를 수행하면 무조건 슬랙 알림이 온다던지..)

리팩토링 계획 수립

그리하여 리팩토링 필요성을 체감한 뒤, 아래의 과정으로 리팩토링 계획을 세워봤다.

  • flask api 함수 기능단위 세분화
  • openai api사용 부에서 prompt 분리
  • pytest를 이용한 unit test코드 작성
  • pytest를 이용한 integral test코드 작성

고로 현재 api호출 시 response의 status_code만 확인하는 구조를 사용하고 있는데, 원활한 api unit test및 integral테스트를 위해 현재의 api부터 리팩토링해보자.

flask api 구조 정리

현재 app.py에서 라우팅을 담당하는 함수는 다음과 같다.(총 14개)

index()
result()
api_questions()
receive_ping()
api_products()
log_click()
page_not_found(e)
chat()
log_event()
sitemap()
robots()
get_price()
get_intro()
get_product_card()

또한 내장 함수는 다음과 같다.(총 3개)

send_slack_alert(message)
fetch_price_and_link(query)
fetch_naver_img(query)

unit test이전에 현재 진행할 flask api의 리팩토링의 목표는 불필요한 코드의 삭제 및 기능 단위 함수 분리 및 재사용이다.

기본적으로 route는 request를 인자로 받고 response를 반환하는 구조이다.

1. flask api 함수 기능단위 세분화

  • index()
    수행하는 기능: 유저 쿠키 관리, 사용자 방문 로깅, index.html 렌더링
    변경사항: 내장함수 cookie_manage(request, response)를 정의 후 쿠키 설정&로깅 수행, index에서는 make_response 수행
    단위테스트: test_cookie_manager_new_user(client), test_cookie_manage_existing_user(client)
    비고:

  • result()
    수행하는 기능: 현재시간 가져오기, 쿼리 가져오기, 쿠키 체크, 로깅, 슬랙알림, result.html 렌더링
    변경사항: cookie_manage함수 사용, 로그출력 순서에서 시각 정보를 뒤로 이동
    단위테스트: test_slack_api(client)
    비고: 위 함수는 result.html을 랜더링 시키고 구체적인 로직은 result.js에서 이루어지기에 별도의 테스트는 없이 slack api test만 진행.

2. openai api사용 부에서 prompt 분리

3. pytest를 이용한 unit test코드 작성

4. pytest를 이용한 integral test코드 작성

부록

도커 빌드 관련

sudo firewall-cmd --add-port=5000/tcp --permanent
suddo firewall-cmd --reload

docker build -t com-on:1.0
docker run -d -p 5000:5000 --name com-on-container com-on:1.0

github 토큰 만료 갱신

토큰 만료 없이 새로 생성한 뒤 github 토큰 갱신하기 velog에 따라 수행했다.

그 후 commit시 root가 안뜨게 하기 위해

# git config --global --edit

# git config --global user.name "choijiwoong"
# git config --global user.email "gogogi313@naver.com"

으로 vim을 사용하여 사용자이름, 이메일을 세팅해두었다.

이거 토큰을 매번 입력하라해서

profile
이제 4학년!!!

0개의 댓글