소개
이 랩에서는 Flask 애플리케이션에 대한 유닛 테스트를 작성하는 방법을 배웁니다. pytest와 coverage를 사용하여 코드를 테스트하고 측정합니다. 이 랩을 마치면 애플리케이션이 예상대로 작동하는지 확인하고 개선이 필요한 영역을 식별하는 방법을 이해하게 됩니다.
참고: 코드 파일을 직접 생성하고 환경에서 실행해야 합니다. Web 5000 에서 Flask 서비스 상태를 미리 볼 수 있습니다.
This tutorial is from open-source community. Access the source code
이 랩에서는 Flask 애플리케이션에 대한 유닛 테스트를 작성하는 방법을 배웁니다. pytest와 coverage를 사용하여 코드를 테스트하고 측정합니다. 이 랩을 마치면 애플리케이션이 예상대로 작동하는지 확인하고 개선이 필요한 영역을 식별하는 방법을 이해하게 됩니다.
참고: 코드 파일을 직접 생성하고 환경에서 실행해야 합니다. Web 5000 에서 Flask 서비스 상태를 미리 볼 수 있습니다.
먼저, pytest와 coverage를 설치해야 합니다. 이들은 각각 테스트 및 코드 측정 도구입니다. 터미널에서 다음 명령을 실행하여 설치합니다.
pip install pytest coverage
다음으로, conftest.py라는 파일에 테스트 fixture (고정 장치) 를 설정합니다. Fixture (고정 장치) 는 적용되는 각 테스트 함수 전에 실행되는 함수입니다.
이 단계에서는 임시 데이터베이스를 생성하고 테스트를 위해 일부 데이터를 채웁니다.
tests/conftest.py에 추가할 코드는 다음과 같습니다.
## tests/conftest.py
import os
import tempfile
import pytest
from flaskr import create_app
from flaskr.db import get_db, init_db
with open(os.path.join(os.path.dirname(__file__), 'data.sql'), 'rb') as f:
_data_sql = f.read().decode('utf8')
@pytest.fixture
def app():
db_fd, db_path = tempfile.mkstemp()
app = create_app({
'TESTING': True,
'DATABASE': db_path,
})
with app.app_context():
init_db()
get_db().executescript(_data_sql)
yield app
os.close(db_fd)
os.unlink(db_path)
@pytest.fixture
def client(app):
return app.test_client()
@pytest.fixture
def runner(app):
return app.test_cli_runner()
다음으로, Flask 애플리케이션을 생성하는 역할을 하는 factory (팩토리) 함수에 대한 테스트를 작성합니다. 이러한 테스트는 애플리케이션이 전달된 구성에 따라 예상대로 동작하는지 확인합니다.
tests/test_factory.py에 추가할 코드는 다음과 같습니다.
## tests/test_factory.py
from flaskr import create_app
def test_config():
assert not create_app().testing
assert create_app({'TESTING': True}).testing
def test_hello(client):
response = client.get('/hello')
assert response.data == b'Hello, World!'
Factory (팩토리) 테스트 후, 데이터베이스 연결을 테스트합니다. 이러한 테스트는 데이터베이스 연결이 예상대로 설정되고 닫히는지 확인합니다.
tests/test_db.py에 추가할 코드는 다음과 같습니다.
## tests/test_db.py
import sqlite3
import pytest
from flaskr.db import get_db
def test_get_close_db(app):
with app.app_context():
db = get_db()
assert db is get_db()
with pytest.raises(sqlite3.ProgrammingError) as e:
db.execute('SELECT 1')
assert 'closed' in str(e.value)
다음으로, 사용자 인증에 대한 테스트를 작성합니다. 이러한 테스트는 사용자가 예상대로 로그인 및 로그아웃할 수 있는지, 그리고 필요한 경우 적절한 오류 메시지가 표시되는지 확인합니다.
tests/test_auth.py에 추가할 코드는 다음과 같습니다.
## tests/test_auth.py
import pytest
from flask import g, session
from flaskr.db import get_db
def test_login(client, auth):
assert client.get('/auth/login').status_code == 200
response = auth.login()
assert response.headers["Location"] == "/"
with client:
client.get('/')
assert session['user_id'] == 1
assert g.user['username'] == 'test'
마지막으로, 블로그 게시물에 대한 테스트를 작성합니다. 이러한 테스트는 사용자가 예상대로 블로그 게시물을 생성, 업데이트 및 삭제할 수 있는지 확인합니다.
tests/test_blog.py에 추가할 코드는 다음과 같습니다.
## tests/test_blog.py
import pytest
from flaskr.db import get_db
def test_create(client, auth, app):
auth.login()
assert client.get('/create').status_code == 200
client.post('/create', data={'title': 'created', 'body': ''})
with app.app_context():
db = get_db()
count = db.execute('SELECT COUNT(id) FROM post').fetchone()[0]
assert count == 2
이제 테스트를 작성했으므로 pytest 명령을 사용하여 실행할 수 있습니다.
pytest
테스트의 코드 커버리지 (code coverage) 를 측정하려면 coverage 명령을 사용하여 pytest 를 실행하십시오.
coverage run -m pytest
다음 명령을 사용하여 터미널에서 간단한 커버리지 보고서를 볼 수 있습니다.
coverage report
이 랩에서는 pytest와 coverage를 사용하여 Flask 애플리케이션에 대한 유닛 테스트 (unit test) 를 작성하는 방법을 배웠습니다. 이러한 도구는 애플리케이션이 예상대로 작동하는지 확인하고 개선이 필요한 영역을 식별하는 데 도움이 됩니다. 코드에 대한 테스트를 작성하는 것은 버그가 문제가 되기 전에 발견하는 데 도움이 되므로 좋은 습관입니다.