Backend/Flask 개발일지

19. miniter API Unit test 1

Fullstacknology 2022. 2. 3. 02:42

miniter API 를 Unit test 하기 위해 새로 test_endpoints.py 파일을 생성한다. 일단 파일만 만들고 테스트를 할 DB를 만든다. 

 

 

중간에 오타나면 처음부터 다시 쳐야하나? 하는 생각이 들었다.

 

unit test의 테스트 DB에 접속할 수 있도록 config.py 파일을 수정한다. 

 

db = {
    'user'      : 'root',
    'password'  : 'qwer123123!',
    'host'      : 'localhost',
    'port'      :  3306,
    'database'  : 'miniter'
}

DB_URL                = f"mysql+mysqlconnector://{db['user']}:{db['password']}@{db['host']}:{db['port']}/{db['database']}?charset=utf8"

test_db = {
    'user'      : 'test',
    'password'  : 'test1234',
    'host'      : 'localhost',
    'port'      : 3306,
    'database'  : 'test_db'
}

test_config = {		
    'DB_URL' : f"mysql+mysqlconnector://{test_db['user']}:{test_db['password']}@{test_db['host']}:{test_db['port']}/{test_db['database']}?charset=utf8",
}

 

그 후 다시 test_endpoints.py 로 되돌아와서 코드를 입력하여 테스트 설정들을 읽어 들일 수 있도록 한다.

 

import config                                           # 1

from sqlalchemy import create_engine, text

database = create_engine(config.test_config['DB_URL'], encoding= 'utf-8' max_overflow = 0) # 2

 

# 1  : config 파일을 import 하여 설정을 읽어들인다. 

 

# 2  : 테스트 설정을 읽어들여 test DB에 접속한다. 

 

그 다음 가장 간단한 ping 엔드포인트를 테스트 하기 위해서 test_endpoints.py 파일에 코드를 계속 작성한다. 

 

import pytest
import bcrypt
import json
import config

from app import create_app                      # 1
from sqlalchemy import create_engine, test

database = create_engine(config.test_config['DB_URL'], encoding = 'utf-8', max_overflow = 0)

@pytest.fixture                                 # 2
def api():                                      # 3
    app = create_app(config.test_config)        # 4
    app.config['TEST'] = True                   # 5
    api = app.test_client()                     # 6
    
    return api                                  # 7
 
# 1 : 소스코드 파일인 app.py 에서 create_app 함수를 import 한다.
 
# 2 : pytest.fixture decorator 가 적용된 함수와 같은 이름의 인자가 다른 test 함수에 지정되어 있으면 pytest가 알아서 같은 이름의 함수의 리턴 값을 해당 인자에 넣어 준다.
 
 
# 3 : fixture 함수 이름, 여기서 동일한 이름의 인자를 해당 함수의 리턴 값으로 적용시켜 준다. ping 를 입력하면 ping 엔드포인트의 리턴 값을 적용시켜 준다.
 
# 4 : create_app 함수를 사용해서 miniter API 애플리케이션을 생성한다. test_config을 create_app 함수에 인자로 넘겨 DB 등의 설정이 모두 테스트 설정이 적용되도록 한다.
 
 
# 5 : TEST 옵션을 true로 설정하여 Flask 에러 발생시 HTTP 요청 오류 부분은 출력되지 않게 한다.
 
 
# 6 : test_client 함수를 호출해서 테스트용 클라이언트를 생성한다. 이를 이용하여 URI 기반으로 원하는 엔드포인트를 호출 할 수 있다.
 
# 7 : 위에서 호출한 test client를 return 해 준다.