Flask
Essai
Recherche…
Test de notre application Hello World
introduction
Dans cet exemple minimaliste, en utilisant pytest
nous allons tester que notre application Hello World renvoie effectivement "Hello, World!" avec un code d'état HTTP OK de 200, lorsqu'il est frappé avec une requête GET sur l'URL /
D'abord, installons pytest
dans notre virtualenv
pip install pytest
Et juste pour référence, ceci notre application du monde Bonjour:
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
Définir le test
A côté de notre hello.py
, nous définissons un module de test appelé test_hello.py
qui sera découvert par 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!'
Juste pour examiner, à ce stade, notre structure de projet obtenue avec la commande tree
est la suivante:
.
├── hello.py
└── test_hello.py
Lancer le test
Maintenant, nous pouvons exécuter ce test avec la commande py.test
qui découvrira automatiquement notre test_hello.py
et la fonction de test qu'il test_hello.py
.
$ py.test
Vous devriez voir une sortie et une indication que 1 test a réussi, par exemple
=== test session starts ===
collected 1 items
test_hello.py .
=== 1 passed in 0.13 seconds ===
Test d'une API JSON implémentée dans Flask
Cet exemple suppose que vous savez comment tester une application Flask en utilisant pytest
Voici une API qui prend une entrée JSON avec des valeurs entières a
et b
par exemple {"a": 1, "b": 2}
, les ajoute et renvoie la somme a + b
dans une réponse JSON, par exemple {"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']})
Test de cette API avec pytest
Nous pouvons le tester avec 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
Exécutez maintenant le test avec la commande py.test
.
Accéder à et manipuler des variables de session dans vos tests en utilisant Flask-Testing
La plupart des applications Web utilisent l'objet de session pour stocker des informations importantes. Ces exemples montrent comment tester une telle application à l'aide de Flask-Testing. L'exemple de travail complet est également disponible sur github .
Donc, installez d'abord Flask-Testing dans votre virtualenv
pip install flask_testing
Pour pouvoir utiliser l'objet de session, vous devez définir la clé secrète
app.secret_key = 'my-seCret_KEy'
Imaginons que vous ayez dans votre application la fonction de stocker des données dans des variables de session comme celle-ci
@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'
Pour tester cette fonction, vous pouvez importer flask_testing et laisser votre classe de test hériter de flask_testing.TestCase. Importer aussi toutes les librairies nécessaires
import flask
import unittest
import flask_testing
from myapp.run import app
class TestMyApp(flask_testing.TestCase):
Avant de commencer le test, il est très important d’implémenter la fonction create_app sinon il y aura des exceptions.
def create_app(self):
return app
Pour tester votre application fonctionne comme vous le souhaitez, vous avez plusieurs possibilités. Si vous voulez simplement vous assurer que votre fonction attribue des valeurs particulières à une variable de session, vous pouvez simplement conserver le contexte et accéder à 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')
Une autre astuce utile consiste à différencier les méthodes GET et POST comme dans la prochaine fonction de test.
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')
Maintenant, imaginez que votre fonction attend une variable de session à définir et réagit différemment sur des valeurs particulières comme celle-ci
@app.route('/changeSessionVar')
def changeSessionVariable():
if session['existingSessionVar'] != 'hello':
raise Exception('unexpected session value of existingSessionVar!')
session['existingSessionVar'] = 'hello world'
return 'ok'
Pour tester cette fonction, vous devez utiliser la transaction dite de session et ouvrir la session dans le contexte du client de test. Cette fonction est disponible depuis 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')
Exécuter les tests est comme d'habitude pour unittest
if __name__ == "__main__":
unittest.main()
Et dans la ligne de commande
python tests/test_myapp.py
Une autre bonne façon d’exécuter vos tests consiste à utiliser la découverte la plus courante comme celle-ci:
python -m unittest discover -s tests