Flask
Testowanie
Szukaj…
Testowanie naszej aplikacji Hello World
Wprowadzenie
W tym minimalistycznym przykładzie za pomocą pytest
sprawdzimy, czy rzeczywiście nasza aplikacja Hello World zwraca „Hello, World!” z kodem stanu HTTP OK 200, po trafieniu żądaniem GET na adres URL /
Najpierw zainstalujmy pytest
w naszym virtualenv
pip install pytest
I tylko dla odniesienia, nasza aplikacja witaj na świecie:
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
Definiowanie testu
Obok naszego hello.py
definiujemy moduł testowy o nazwie test_hello.py
, który zostanie odkryty przez py.test
# 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!'
Dla porównania, w tym momencie nasza struktura projektu uzyskana za pomocą polecenia tree
to:
.
├── hello.py
└── test_hello.py
Uruchamianie testu
Teraz możemy uruchomić ten test za pomocą polecenia py.test
, które automatycznie wykryje nasze test_hello.py
i test_hello.py
w nim funkcję testową
$ py.test
Powinieneś zobaczyć jakieś dane wyjściowe i wskazanie, że 1 test przeszedł pomyślnie, np
=== test session starts ===
collected 1 items
test_hello.py .
=== 1 passed in 0.13 seconds ===
Testowanie JSON API zaimplementowanego w Flask
W tym przykładzie założono, że wiesz, jak przetestować aplikację Flask za pomocą zapytania
Poniżej znajduje się interfejs API, który pobiera dane wejściowe JSON z wartościami całkowitymi a
i b
np. {"a": 1, "b": 2}
, dodaje je i zwraca sumę a + b
w odpowiedzi JSON np. {"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']})
Testowanie tego interfejsu API za pomocą pytest
Możemy to przetestować za pomocą 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
Teraz uruchom test za py.test
polecenia py.test
.
Uzyskiwanie dostępu do zmiennych sesji i manipulowanie nimi w testach za pomocą Testowania kolby
Większość aplikacji internetowych używa obiektu sesji do przechowywania niektórych ważnych informacji. Te przykłady pokazują, w jaki sposób można przetestować taką aplikację za pomocą Testowania kolb. Pełny przykład działania jest również dostępny na github .
Więc najpierw zainstaluj Flask-Testing na swoim virtualenv
pip install flask_testing
Aby móc korzystać z obiektu sesji, musisz ustawić tajny klucz
app.secret_key = 'my-seCret_KEy'
Wyobraźmy sobie, że masz w swojej aplikacji funkcję, która musi przechowywać pewne dane w zmiennych sesji takich jak ta
@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'
Aby przetestować tę funkcję, możesz zaimportować test_testowy i pozwolić klasie testowej na dziedziczenie test_testowy.TestCase. Zaimportuj również wszystkie niezbędne biblioteki
import flask
import unittest
import flask_testing
from myapp.run import app
class TestMyApp(flask_testing.TestCase):
Bardzo ważne przed rozpoczęciem testowania jest wdrożenie funkcji create_app, w przeciwnym razie wystąpi wyjątek.
def create_app(self):
return app
Aby przetestować, czy aplikacja działa zgodnie z oczekiwaniami, masz kilka możliwości. Jeśli chcesz się tylko upewnić, że funkcja ustawia określone wartości zmiennej sesji, możesz po prostu zachować kontekst i uzyskać dostęp do 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')
Kolejną przydatną sztuczką jest rozróżnianie metod GET i POST , tak jak w następnej funkcji testowej
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')
Teraz wyobraź sobie, że twoja funkcja oczekuje, że zostanie ustawiona zmienna sesyjna i reaguje inaczej na określone wartości, takie jak ta
@app.route('/changeSessionVar')
def changeSessionVariable():
if session['existingSessionVar'] != 'hello':
raise Exception('unexpected session value of existingSessionVar!')
session['existingSessionVar'] = 'hello world'
return 'ok'
Aby przetestować tę funkcję, musisz użyć tak zwanej transakcji sesji i otworzyć sesję w kontekście klienta testowego. Ta funkcja jest dostępna od wersji Flask 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')
Przeprowadzanie testów jest jak zwykle w przypadku najbardziej nieprzystosowanych
if __name__ == "__main__":
unittest.main()
I w wierszu poleceń
python tests/test_myapp.py
Innym dobrym sposobem na uruchomienie testów jest użycie takiego Unittest Discovery:
python -m unittest discover -s tests