Flask
Pruebas
Buscar..
Probando nuestra aplicación Hello World
Introducción
En este ejemplo minimalista, usando pytest
vamos a probar que, de hecho, nuestra aplicación Hello World devuelve "Hello, World!" con un código de estado HTTP OK de 200, cuando se encuentra con una solicitud GET en la URL /
Primero pytest
en nuestro virtualenv
pip install pytest
Y solo para referencia, esta es nuestra aplicación hola mundo:
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, World!'
Definiendo la prueba
Junto a nuestro hello.py
, definimos un módulo de prueba llamado test_hello.py
que será descubierto por 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!'
Solo para revisar, en este punto nuestra estructura de proyecto obtenida con el comando de tree
es:
.
├── hello.py
└── test_hello.py
Corriendo la prueba
Ahora podemos ejecutar esta prueba con el comando py.test
que descubrirá automáticamente nuestro test_hello.py
y la función de prueba en su interior.
$ py.test
Debería ver algunos resultados y una indicación de que ha pasado 1 prueba, por ejemplo,
=== test session starts ===
collected 1 items
test_hello.py .
=== 1 passed in 0.13 seconds ===
Probando una API JSON implementada en Flask
Este ejemplo asume que sabe cómo probar una aplicación Flask usando pytest
A continuación se muestra una API que toma una entrada JSON con los valores enteros a
y b
por ejemplo, {"a": 1, "b": 2}
, los suma y devuelve la suma a + b
en una respuesta JSON, por ejemplo, {"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']})
Probando esta API con pytest
Podemos probarlo 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
Ahora ejecuta la prueba con el comando py.test
.
Acceso y manipulación de las variables de sesión en sus pruebas utilizando Flask-Testing
La mayoría de las aplicaciones web utilizan el objeto de sesión para almacenar información importante. Estos ejemplos muestran cómo puede probar dicha aplicación utilizando Flask-Testing. El ejemplo completo de trabajo también está disponible en github .
Así que primero instala Flask-Testing en tu virtualenv
pip install flask_testing
Para poder usar el objeto de sesión, debes configurar la clave secreta
app.secret_key = 'my-seCret_KEy'
Imaginemos que tiene en su función de aplicación que necesita almacenar algunos datos en variables de sesión como esta
@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'
Para probar esta función, puede importar flask_testing y dejar que su clase de prueba herede flask_testing.TestCase. Importar también todas las bibliotecas necesarias.
import flask
import unittest
import flask_testing
from myapp.run import app
class TestMyApp(flask_testing.TestCase):
Es muy importante antes de comenzar la prueba implementar la función create_app, de lo contrario habrá una excepción.
def create_app(self):
return app
Para probar tu aplicación está funcionando como lo deseas, tienes un par de posibilidades. Si solo quiere asegurarse de que su función está configurando valores particulares para una variable de sesión, puede mantener el contexto y acceder 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 truco más útil es diferenciar entre los métodos GET y POST como en la siguiente función de prueba
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')
Ahora imagine que su función espera que una variable de sesión se establezca y reacciona de manera diferente en valores particulares como este
@app.route('/changeSessionVar')
def changeSessionVariable():
if session['existingSessionVar'] != 'hello':
raise Exception('unexpected session value of existingSessionVar!')
session['existingSessionVar'] = 'hello world'
return 'ok'
Para probar esta función, debe utilizar la llamada transacción de sesión y abrir la sesión en el contexto del cliente de prueba. Esta función está disponible desde 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')
La ejecución de las pruebas es como siempre para unittest
if __name__ == "__main__":
unittest.main()
Y en la linea de comando.
python tests/test_myapp.py
Otra buena manera de ejecutar tus pruebas es usar Unittest Discovery de esta manera:
python -m unittest discover -s tests