Flask
testen
Zoeken…
Onze Hello World-app testen
Invoering
In dit minimalistische voorbeeld pytest
we met behulp van pytest
testen dat onze Hello World-app inderdaad "Hallo wereld!" met een HTTP OK-statuscode van 200, wanneer hit met een GET-verzoek op de URL /
Laten we eerst pytest
in onze virtualenv installeren
pip install pytest
En alleen voor referentie, dit is onze hallo wereld-app:
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
Bepaling van de test
Naast onze hello.py
definiëren we een testmodule genaamd test_hello.py
die wordt ontdekt door 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!'
Even ter beoordeling, op dit punt is onze projectstructuur verkregen met het tree
:
.
├── hello.py
└── test_hello.py
De test uitvoeren
Nu kunnen we deze test uitvoeren met de opdracht py.test
die automatisch onze test_hello.py
en de testfunctie erin ontdekt
$ py.test
Je zou wat output moeten zien en een indicatie dat 1 test geslaagd is, bijv
=== test session starts ===
collected 1 items
test_hello.py .
=== 1 passed in 0.13 seconds ===
Testen van een JSON API geïmplementeerd in Flask
In dit voorbeeld wordt ervan uitgegaan dat u weet hoe u een Flask-app kunt testen met behulp van pytest
Hieronder is een API die een JSON-invoer met gehele getallen a
en b
bijvoorbeeld {"a": 1, "b": 2}
, deze optelt en som a + b
retourneert in een JSON-antwoord, bijvoorbeeld {"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 van deze API met pytest
We kunnen het testen met 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
Voer nu de test uit met de opdracht py.test
.
Toegang krijgen tot en manipuleren van sessievariabelen in uw tests met behulp van Flask-Testing
De meeste webapplicaties gebruiken het sessieobject om belangrijke informatie op te slaan. Deze voorbeelden laten zien hoe u een dergelijke toepassing kunt testen met behulp van Flask-Testing. Een volledig werkend voorbeeld is ook beschikbaar op github .
Installeer daarom eerst Flask-Testing in uw virtualenv
pip install flask_testing
Om het sessieobject te kunnen gebruiken, moet u de geheime sleutel instellen
app.secret_key = 'my-seCret_KEy'
Stel je voor dat je in je applicatiefunctie een aantal gegevens moet opslaan in sessievariabelen zoals deze
@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'
Om deze functie te testen, kunt u flask_testing importeren en uw testklasse flask_testing.TestCase laten erven. Importeer ook alle benodigde bibliotheken
import flask
import unittest
import flask_testing
from myapp.run import app
class TestMyApp(flask_testing.TestCase):
Heel belangrijk voordat je begint met testen is het implementeren van de functie create_app, anders is er een uitzondering.
def create_app(self):
return app
Om te testen of uw applicatie naar wens werkt, heeft u een aantal mogelijkheden. Als u er gewoon voor wilt zorgen dat uw functie bepaalde waarden instelt op een sessievariabele, kunt u gewoon de context behouden en toegang krijgen tot 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')
Nog een handige truc is om onderscheid te maken tussen GET- en POST- methoden zoals in de volgende testfunctie
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')
Stel je nu voor dat je functie verwacht dat een sessievariabele wordt ingesteld en reageert anders op bepaalde waarden zoals deze
@app.route('/changeSessionVar')
def changeSessionVariable():
if session['existingSessionVar'] != 'hello':
raise Exception('unexpected session value of existingSessionVar!')
session['existingSessionVar'] = 'hello world'
return 'ok'
Om deze functie te testen, moet u de zogenaamde sessietransactie gebruiken en de sessie openen in de context van de testclient. Deze functie is beschikbaar sinds fles 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')
De tests uitvoeren is zoals gewoonlijk voor unittest
if __name__ == "__main__":
unittest.main()
En op de opdrachtregel
python tests/test_myapp.py
Een andere leuke manier om je tests uit te voeren is om unittest Discovery als volgt te gebruiken:
python -m unittest discover -s tests