Introducción
En este laboratorio, aprenderemos a escribir pruebas unitarias para una aplicación Flask. Usaremos pytest y coverage para probar y medir nuestro código. Al final de este laboratorio, entenderás cómo asegurarte de que tu aplicación funcione como se espera y cómo identificar áreas que necesitan mejorar.
Nota: Debes crear el archivo de código por ti mismo y ejecutarlo en el entorno. Puedes previsualizar el estado del servicio Flask en el Web 5000.
Instalar Pytest y Coverage
En primer lugar, necesitamos instalar pytest y coverage. Estos son herramientas de prueba y medición de código respectivamente. Ejecuta el siguiente comando en tu terminal para instalar:
pip install pytest coverage
Configuración y Fixtures
A continuación, configuraremos fixtures en un archivo llamado conftest.py. Una fixture es una función que se ejecuta antes de cada función de prueba a la que se aplica.
En este paso, crearemos una base de datos temporal y la llenaremos con algunos datos para las pruebas.
Aquí está el código para agregar en tests/conftest.py:
## tests/conftest.py
import os
import tempfile
import pytest
from flaskr import create_app
from flaskr.db import get_db, init_db
with open(os.path.join(os.path.dirname(__file__), 'data.sql'), 'rb') as f:
_data_sql = f.read().decode('utf8')
@pytest.fixture
def app():
db_fd, db_path = tempfile.mkstemp()
app = create_app({
'TESTING': True,
'DATABASE': db_path,
})
with app.app_context():
init_db()
get_db().executescript(_data_sql)
yield app
os.close(db_fd)
os.unlink(db_path)
@pytest.fixture
def client(app):
return app.test_client()
@pytest.fixture
def runner(app):
return app.test_cli_runner()
Escribir Pruebas para la Fábrica
A continuación, escribiremos pruebas para la función de fábrica que es responsable de crear la aplicación Flask. Estas pruebas aseguran que la aplicación se comporte como se espera en base a la configuración que se le pasa.
Aquí está el código para agregar en tests/test_factory.py:
## tests/test_factory.py
from flaskr import create_app
def test_config():
assert not create_app().testing
assert create_app({'TESTING': True}).testing
def test_hello(client):
response = client.get('/hello')
assert response.data == b'Hello, World!'
Prueba de la Conexión a la Base de Datos
Después de probar la fábrica, probaremos la conexión a la base de datos. Estas pruebas aseguran que la conexión a la base de datos se establece y cierra como se espera.
Aquí está el código para agregar en tests/test_db.py:
## tests/test_db.py
import sqlite3
import pytest
from flaskr.db import get_db
def test_get_close_db(app):
with app.app_context():
db = get_db()
assert db is get_db()
with pytest.raises(sqlite3.ProgrammingError) as e:
db.execute('SELECT 1')
assert 'closed' in str(e.value)
Prueba de la Autenticación
A continuación, escribiremos pruebas para la autenticación de usuarios. Estas pruebas aseguran que los usuarios puedan iniciar sesión y cerrar sesión como se espera, y que se muestren los mensajes de error adecuados cuando sea necesario.
Aquí está el código para agregar en tests/test_auth.py:
## tests/test_auth.py
import pytest
from flask import g, session
from flaskr.db import get_db
def test_login(client, auth):
assert client.get('/auth/login').status_code == 200
response = auth.login()
assert response.headers["Location"] == "/"
with client:
client.get('/')
assert session['user_id'] == 1
assert g.user['username'] == 'test'
Pruebas de Publicaciones del Blog
Finalmente, escribiremos pruebas para las publicaciones del blog. Estas pruebas aseguran que los usuarios puedan crear, actualizar y eliminar publicaciones del blog como se espera.
Aquí está el código para agregar en tests/test_blog.py:
## tests/test_blog.py
import pytest
from flaskr.db import get_db
def test_create(client, auth, app):
auth.login()
assert client.get('/create').status_code == 200
client.post('/create', data={'title': 'created', 'body': ''})
with app.app_context():
db = get_db()
count = db.execute('SELECT COUNT(id) FROM post').fetchone()[0]
assert count == 2
Ejecutar las Pruebas
Ahora que hemos escrito nuestras pruebas, podemos ejecutarlas usando el comando pytest:
pytest
Para medir la cobertura de código de tus pruebas, usa el comando coverage para ejecutar pytest:
coverage run -m pytest
Puedes ver un informe de cobertura simple en la terminal con el siguiente comando:
coverage report
Resumen
En este laboratorio, hemos aprendido cómo escribir pruebas unitarias para una aplicación Flask usando pytest y coverage. Estas herramientas nos ayudan a asegurar que nuestra aplicación funcione como se espera y a identificar áreas que necesitan mejorar. Escribir pruebas para tu código es una buena práctica ya que te ayuda a detectar errores antes de que se conviertan en un problema.