Flask
analisi
Ricerca…
Test della nostra app Hello World
introduzione
In questo esempio minimalista, usando pytest
, pytest
che la nostra app Hello World restituisce "Hello, World!" con un codice di stato HTTP OK di 200, quando viene colpito con una richiesta GET sull'URL /
Per prima cosa installiamo pytest
nel nostro virtualenv
pip install pytest
E solo per riferimento, questa nostra app ciao mondo:
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
Definire il test
Accanto al nostro hello.py
, definiamo un modulo di test chiamato test_hello.py
che verrà scoperto da 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!'
Giusto per valutare, a questo punto la nostra struttura di progetto ottenuta con il comando ad tree
è:
.
├── hello.py
└── test_hello.py
Esecuzione del test
Ora possiamo eseguire questo test con il comando py.test
che scoprirà automaticamente il nostro test_hello.py
e la funzione di test al suo interno
$ py.test
Dovresti vedere alcuni risultati e un'indicazione che è passato 1 test, ad es
=== test session starts ===
collected 1 items
test_hello.py .
=== 1 passed in 0.13 seconds ===
Test di un'API JSON implementata in Flask
Questo esempio presume che tu sappia come testare un'app Flask usando pytest
Di seguito è riportata un'API che accetta un input JSON con valori interi a
e b
eg {"a": 1, "b": 2}
, li somma e restituisce sum a + b
in una risposta JSON, ad esempio {"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']})
Testare questa API con pytest
Possiamo testarlo con 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
Ora esegui il test con il comando py.test
.
Accesso e manipolazione delle variabili di sessione nei test mediante Flask-Testing
La maggior parte delle applicazioni Web utilizza l'oggetto sessione per memorizzare alcune informazioni importanti. Questo esempio mostra come testare tale applicazione utilizzando Flask-Testing. L'esempio operativo completo è disponibile anche su github .
Quindi, prima installa Flask-Testing nel tuo virtualenv
pip install flask_testing
Per poter utilizzare l'oggetto sessione è necessario impostare la chiave segreta
app.secret_key = 'my-seCret_KEy'
Immaginiamo di avere nella funzione dell'applicazione che è necessario memorizzare alcuni dati in variabili di sessione come questa
@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'
Per testare questa funzione è possibile importare flask_testing e lasciare che la classe di test erediti flask_testing.TestCase. Importa anche tutte le librerie necessarie
import flask
import unittest
import flask_testing
from myapp.run import app
class TestMyApp(flask_testing.TestCase):
Molto importante prima di iniziare il test è implementare la funzione create_app altrimenti ci sarà un'eccezione.
def create_app(self):
return app
Per testare la tua applicazione funziona come volevi hai un paio di possibilità. Se vuoi solo assicurarti che la tua funzione stia impostando valori particolari su una variabile di sessione puoi semplicemente mantenere il contesto intorno e accedere a 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')
Un altro trucco utile è quello di differenziare tra i metodi GET e POST come nella prossima funzione di 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')
Ora immagina che la tua funzione si aspetti che una variabile di sessione sia impostata e reagisca in modo diverso su valori particolari come questo
@app.route('/changeSessionVar')
def changeSessionVariable():
if session['existingSessionVar'] != 'hello':
raise Exception('unexpected session value of existingSessionVar!')
session['existingSessionVar'] = 'hello world'
return 'ok'
Per testare questa funzione è necessario utilizzare la cosiddetta transazione di sessione e aprire la sessione nel contesto del client di test. Questa funzione è disponibile dal 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')
Eseguire i test è come al solito per unittest
if __name__ == "__main__":
unittest.main()
E nella riga di comando
python tests/test_myapp.py
Un altro bel modo per eseguire i test consiste nell'utilizzare l'Unittest Discovery in questo modo:
python -m unittest discover -s tests