수색…
Hello World 앱 테스트
소개
이 미니멀리스트 예제에서는 pytest
를 사용하여 Hello World 앱이 실제로 "Hello, World!"를 리턴하는지 테스트 할 것입니다. HTTP OK 상태 코드 200을 사용하여 URL /
URL에서 GET 요청으로 조회하면
먼저 pytest
를 virtualenv에 설치합시다.
pip install pytest
참고로이 안녕하세요 세계 앱 :
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
테스트 정의
우리의 hello.py
와 함께, 우리는 py.test
의해 발견 될 test_hello.py
라는 테스트 모듈을 정의한다.
# test_hello.py
from hello import app
def test_hello():
response = app.test_client().get('/')
assert response.status_code == 200
assert response.data == b'Hello, World!'
검토하기 위해 tree
명령으로 얻은 프로젝트 구조는 다음과 같습니다.
.
├── hello.py
└── test_hello.py
테스트 실행하기
이제이 테스트를 py.test
명령으로 실행할 수 있습니다.이 명령은 test_hello.py
와 그 내부의 테스트 함수를 자동으로 발견합니다.
$ py.test
1 개의 테스트가 통과되었다는 표시와 출력이 있어야합니다.
=== test session starts ===
collected 1 items
test_hello.py .
=== 1 passed in 0.13 seconds ===
Flask에 구현 된 JSON API 테스트
이 예제에서는 pytest를 사용하여 Flask 앱 을 테스트하는 방법을 알고 있다고 가정합니다.
다음은 정수 값 a
와 b
예 : {"a": 1, "b": 2}
)가있는 JSON 입력을 가져와 JSON 응답에 sum a + b
를 반환하는 API입니다 (예 : {"sum": 3}
.
# hello_add.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/add', methods=['POST'])
def add():
data = request.get_json()
return jsonify({'sum': data['a'] + data['b']})
pytest
로이 API 테스트하기
우리는 pytest
테스트 할 수있다.
# test_hello_add.py
from hello_add import app
from flask import json
def test_add():
response = app.test_client().post(
'/add',
data=json.dumps({'a': 1, 'b': 2}),
content_type='application/json',
)
data = json.loads(response.get_data(as_text=True))
assert response.status_code == 200
assert data['sum'] == 3
이제 py.test
명령으로 테스트를 실행하자.
Flask-Testing을 사용하여 테스트에서 세션 변수 액세스 및 조작
대부분의 웹 응용 프로그램은 세션 객체를 사용하여 중요한 정보를 저장합니다. 이 예제는 Flask-Testing을 사용하여 그러한 응용 프로그램을 테스트하는 방법을 보여줍니다. github 에서도 전체 작동 예제를 사용할 수 있습니다.
먼저 가상 테스트에 Flask-Testing을 설치하십시오.
pip install flask_testing
세션 객체를 사용하려면 비밀 키를 설정해야합니다.
app.secret_key = 'my-seCret_KEy'
애플리케이션 변수에 다음과 같은 세션 변수에 데이터를 저장해야한다고 가정 해 봅시다.
@app.route('/getSessionVar', methods=['GET', 'POST'])
def getSessionVariable():
if 'GET' == request.method:
session['sessionVar'] = 'hello'
elif 'POST' == request.method:
session['sessionVar'] = 'hi'
else:
session['sessionVar'] = 'error'
return 'ok'
이 함수를 테스트하려면 flask_testing을 가져 와서 테스트 클래스가 flask_testing.TestCase를 상속받을 수있게합니다. 필요한 모든 라이브러리 가져 오기
import flask
import unittest
import flask_testing
from myapp.run import app
class TestMyApp(flask_testing.TestCase):
테스트를 시작하기 전에 create_app 함수를 구현하는 것이 매우 중요합니다. 그렇지 않으면 예외가 발생합니다.
def create_app(self):
return app
원하는대로 응용 프로그램을 테스트하려면 두 가지 가능성이 있습니다. 함수가 특정 값을 세션 변수로 설정한다는 것을 확실하게 보장 하려면 컨텍스트를 유지하고 flask.session에 액세스 하면됩니다
def testSession1(self):
with app.test_client() as lTestClient:
lResp= lTestClient.get('/getSessionVar')
self.assertEqual(lResp.status_code, 200)
self.assertEqual(flask.session['sessionVar'], 'hello')
한가지 더 유용한 트릭은 다음 테스트 함수에서와 같이 GET 메소드와 POST 메소드를 구별하는 것입니다
def testSession2(self):
with app.test_client() as lTestClient:
lResp= lTestClient.post('/getSessionVar')
self.assertEqual(lResp.status_code, 200)
self.assertEqual(flask.session['sessionVar'], 'hi')
이제 함수가 세션 변수를 설정하고이 값과 같은 특정 값에 대해 다른 반응을 보일 것이라고 생각해보십시오.
@app.route('/changeSessionVar')
def changeSessionVariable():
if session['existingSessionVar'] != 'hello':
raise Exception('unexpected session value of existingSessionVar!')
session['existingSessionVar'] = 'hello world'
return 'ok'
이 함수를 테스트하려면 세션 트랜잭션 을 사용하고 테스트 클라이언트의 컨텍스트에서 세션을 열어야합니다. 플라스크 0.8 이후이 기능을 사용할 수 있습니다.
def testSession3(self):
with app.test_client() as lTestClient:
#keep the session
with lTestClient.session_transaction() as lSess:
lSess['existingSessionVar'] = 'hello'
#here the session is stored
lResp = lTestClient.get('/changeSessionVar')
self.assertEqual(lResp.status_code, 200)
self.assertEqual(flask.session['existingSessionVar'], 'hello world')
테스트를 실행하는 것은 unittest에서 평소와 같습니다.
if __name__ == "__main__":
unittest.main()
그리고 명령 행에서
python tests/test_myapp.py
테스트를 실행하는 또 다른 좋은 방법은 unittest Discovery를 다음과 같이 사용하는 것입니다.
python -m unittest discover -s tests