Flask
Testen
Suche…
Testen Sie unsere Hello World App
Einführung
In diesem minimalistischen Beispiel werden wir mit pytest
testen, dass unsere Hello World-App tatsächlich "Hallo, Welt!" pytest
mit einem HTTP-OK-Statuscode von 200, wenn eine GET-Anforderung über die URL getroffen wird /
Lassen Sie uns zunächst pytest
in unsere Virtualenv installieren
pip install pytest
Und als Referenz, dies ist unsere Hallo Welt App:
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
Test definieren
Neben unserem hello.py
definieren wir ein Testmodul namens test_hello.py
, das von py.test
entdeckt wird
# 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!'
Um es noch einmal zu überprüfen, lautet unsere Projektstruktur, die Sie mit dem tree
:
.
├── hello.py
└── test_hello.py
Test ausführen
Jetzt können wir diesen Test mit dem Befehl py.test
, der automatisch test_hello.py
und die darin enthaltene Testfunktion test_hello.py
$ py.test
Sie sollten eine Ausgabe und einen Hinweis sehen, dass 1 Test bestanden ist, z
=== test session starts ===
collected 1 items
test_hello.py .
=== 1 passed in 0.13 seconds ===
Testen einer in Flask implementierten JSON-API
In diesem Beispiel wird vorausgesetzt, dass Sie wissen, wie Sie eine Flask-App mit pytest testen
Im Folgenden ist eine API , die einen JSON Eingang mit ganzzahligen nehmen Werte a
und b
zum Beispiel {"a": 1, "b": 2}
, fügt sie auf und kehrt Summe a + b
in einer JSON Antwort zB {"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']})
Testen dieser API mit pytest
Wir können es mit 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
Führen Sie nun den Test mit py.test
Befehl py.test
.
Zugriff und Bearbeitung von Sitzungsvariablen in Ihren Tests mit Flask-Testing
Die meisten Webanwendungen verwenden das Sitzungsobjekt, um wichtige Informationen zu speichern. Diese Beispiele zeigen, wie Sie eine solche Anwendung mit Flask-Testing testen können. Ein voll funktionsfähiges Beispiel ist auch auf Github verfügbar.
Installieren Sie also zuerst Flask-Testing in Ihrer Virtualenv
pip install flask_testing
Um das Sitzungsobjekt verwenden zu können, müssen Sie den geheimen Schlüssel festlegen
app.secret_key = 'my-seCret_KEy'
Stellen wir uns vor, Sie haben in Ihrer Anwendung Funktionen, die einige Daten in Sitzungsvariablen wie diesen speichern müssen
@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'
Um diese Funktion zu testen, können Sie flask_testing importieren und Ihre Testklasse flask_testing.TestCase erben lassen. Importieren Sie auch alle notwendigen Bibliotheken
import flask
import unittest
import flask_testing
from myapp.run import app
class TestMyApp(flask_testing.TestCase):
Bevor Sie mit dem Testen beginnen, ist es sehr wichtig, die Funktion create_app zu implementieren. Andernfalls gibt es eine Ausnahme.
def create_app(self):
return app
Um zu testen, ob Ihre Anwendung wie gewünscht funktioniert, haben Sie mehrere Möglichkeiten. Wenn Sie lediglich sicherstellen möchten, dass Ihre Funktion bestimmte Werte für eine Sitzungsvariable einstellt, können Sie den Kontext beibehalten und auf flask.session zugreifen
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')
Ein weiterer nützlicher Trick besteht darin, wie bei der nächsten Testfunktion zwischen GET- und POST- Methoden zu unterscheiden
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')
Stellen Sie sich nun vor, Ihre Funktion erwartet, dass eine Sitzungsvariable gesetzt wird, und reagiert auf bestimmte Werte wie diese anders
@app.route('/changeSessionVar')
def changeSessionVariable():
if session['existingSessionVar'] != 'hello':
raise Exception('unexpected session value of existingSessionVar!')
session['existingSessionVar'] = 'hello world'
return 'ok'
Um diese Funktion zu testen, müssen Sie eine so genannte Sitzungstransaktion verwenden und die Sitzung im Kontext des Testclients öffnen. Diese Funktion ist seit Flask 0.8 verfügbar
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')
Das Ausführen der Tests ist wie üblich für die Besten
if __name__ == "__main__":
unittest.main()
Und in der Kommandozeile
python tests/test_myapp.py
Eine weitere gute Möglichkeit, Ihre Tests auszuführen, ist die Verwendung der einzigen Erkennung wie folgt:
python -m unittest discover -s tests