[Flask] Unit Test

ooknimm·2020년 9월 20일
1

Flask

목록 보기
5/7
post-thumbnail

test

테스트는 크게 3가지 방식으로 이루어진다.

  • UI Test
  • Intergration Test
  • Unit Test

UI Test 사용자가 실제로 시스템을 사용하는 방식과 동일하게 진행하는 전체적인 시스템 테스트이다. 자동화가 어렵고 사람이 직접 따져야 되는 작업이므로 시간이 많이 걸린다.

Intergration Test API 서버를 로컬에서 실행해 HTTP 요청을 보내고 올바른 HTTP 응답이 반환되는지 확인하는 부분적인 시스템 테스트이다. UI Test에 비해선 비교적 수월하지만 직접 서버를 실행하고 각 엔드포인트 별로 요청을 보내야 하기 때문에 여전히 까다로운 부분이 있다.
httpie같은 패키지를 사용해http localhost:5000/엔드포인트 같은 구문을 작성해 서버에 요청하는 방식이 바로 Intergration Test이다.

Unit Test 시스템을 테스트하는 개념보다는 코드를 테스트한다. 원하는 방식으로 코드가 구현됐는지 따지는 방식이다. 자동화가 100% 가능하며 실행속도도 빠르고 반복적으로 손쉽게 테스트할 수 있다. 전체적인 부분을 놓칠 수 있는 단점이 존재한다.

Test 비중

테스트는 중요하다. 실제 배포할 프로그램이 오류로 가득하다면 곤란한 상황이 벌어질 것이다. 그러므로 필히 거쳐야 하는 과정인데 문제는 너무 많은 시간이 소요된다. 그래서 자동화가 가능한 Unit Test가 필수적이다. 물론 다른 테스트들도 당연히 진행해야 하지만 비율로 따지자면 다음과 같다.

  1. Unit Test 70%

  2. Intergration Test 20%

  3. UI Test 10%

유닛테스트로 대부분의 코드 오류를 잡아내고 더 큰 단위인 엔드포인트 단위로 테스트를 하고 마지막으로 UI Test를 진행한다.




Unit Test

파이썬에서 unittest라는 내부 모듈을 제공하지만 외부 라이브러리 pytest를 사용하면 더욱 손쉽게 구현할 수 있다.

pytest

테스트파일은 test_로 시작하는 파일이어야 합니다.
터미널에서 pytest를 입력하면 테스트파일의 테스트를 진행합니다.

ptw라는 패키지를 이용하면 테스트 실행이 자동화된다. 파일을 저장할 때마다 자동으로 테스트가 진행된다.




테스트 파일 구현

해당 파이썬 파일을 곧바로 테스트할 수 있는 것이 아니라 따로 테스트 파일을 생성해서 구현해야 한다. 생성한 엔드포인트들을 테스트 파일에서 실행해 제대로 동작하는지 확인한다.

assert

해당 코드가 적절히 구현됐는지 확인하는 파이썬의 예외처리 명령어.
조건식이 참이면 통과되고 거짓이면 AssertionError를 발생시킨다.

assert 조건식, 에러메시지

에러메시지는 생략 가능하다.

assert 4 == 2

>> AssertionError

test_client

Flask에서 제공하는 메소드이다. 테스트 파일에서 각 엔드포인트를 URI,HTTP 메소드를 통해 호출하고 데이터를 전송, 응답받을 수 있다.(실제 네트워크를 통한 HTTP 통신은 아니다.)
이 함수를 사용해 생성한 엔드포인트를 호출하고 결과를 assert로 참인지 따지게 된다.

test_client를 사용하기 위해선 Flask app가 필요합니다. 새로 생성할 필요없이 기존에 생성한 Application Factory을 가져옵니다.

각각 테스트 함수마다 app에 test_client를 실행해야 하는 반복적인 작업을 pytest의 fixture라는 데코레이터가 대신합니다.
이 데코레이터는 해당 함수를 인자로 사용할 수 있게 합니다.

from app	import create_app
import pytest
import config

@pytest.fixture
def api():
	app = create_app(config.test_config)
    api = app.test_client()
    return api

팩토리 함수에는 테스트용 데이터베이스 설정, 비밀키를 사용하기 위해 config 파일 안에 test_config 변수를 만들고 인자로 넣었다.

이제 테스트 함수에 api라는 인자를 넣으면 해당 함수에 app.test_client()가 실행된다.

테스트 함수는 파일과 마찬가지로 test_를 앞에 붙여야 한다.

def test_ping(api):
	response = api.get('/ping')
    assert response.status_code == 200
    assert b'pong' in response.data

api에 HTTP 메소드를 적용해 요청하고 그 응답값을 변수에 할당한다.
그 후 assert를 사용해 값의 참 거짓 여부를 가린다.

setup과 teardown

테스트를 실행하기 전, 후 처리를 하는 pytest의 함수들이다.
예를 들어 데이터베이스를 사용하는 api를 테스트하려면 데이터베이스에 테스트용 데이터가 있어야 한다.그럴 때 setup 함수를 사용해 테스트가 실행되면 데이터를 생성하게 한다.
테스트가 완료되면 다음 테스트 때 데이터가 중복되거나 엉키지 않도록 추가한 데이터를 삭제해야한다. teardown을 사용하면 된다.

def setup_function():
	pass

def teardown_function():
	pass



참고

깔끔한 파이썬 탄탄한 백엔드

파이썬 코딩 도장

0개의 댓글