Pruebas unitarias de Flask con Pytest y Cobertura

FlaskFlaskBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL flask(("Flask")) -.-> flask/CoreConceptsGroup(["Core Concepts"]) flask(("Flask")) -.-> flask/DevelopmentToolsGroup(["Development Tools"]) flask(("Flask")) -.-> flask/DataHandlingGroup(["Data Handling"]) flask/DataHandlingGroup -.-> flask/incoming_request_data("Incoming Request Data") flask/DataHandlingGroup -.-> flask/application_globals("Application Globals") flask/DataHandlingGroup -.-> flask/response_objects("Response Objects") flask/CoreConceptsGroup -.-> flask/application_object("Application Object") flask/CoreConceptsGroup -.-> flask/session_interface("Session Interface") flask/CoreConceptsGroup -.-> flask/test_client("Test Client") flask/CoreConceptsGroup -.-> flask/useful_internals("Useful Internals") flask/DevelopmentToolsGroup -.-> flask/blueprint_objects("Blueprint Objects") flask/DevelopmentToolsGroup -.-> flask/command_line_interface("Command Line Interface") subgraph Lab Skills flask/incoming_request_data -.-> lab-136342{{"Pruebas unitarias de Flask con Pytest y Cobertura"}} flask/application_globals -.-> lab-136342{{"Pruebas unitarias de Flask con Pytest y Cobertura"}} flask/response_objects -.-> lab-136342{{"Pruebas unitarias de Flask con Pytest y Cobertura"}} flask/application_object -.-> lab-136342{{"Pruebas unitarias de Flask con Pytest y Cobertura"}} flask/session_interface -.-> lab-136342{{"Pruebas unitarias de Flask con Pytest y Cobertura"}} flask/test_client -.-> lab-136342{{"Pruebas unitarias de Flask con Pytest y Cobertura"}} flask/useful_internals -.-> lab-136342{{"Pruebas unitarias de Flask con Pytest y Cobertura"}} flask/blueprint_objects -.-> lab-136342{{"Pruebas unitarias de Flask con Pytest y Cobertura"}} flask/command_line_interface -.-> lab-136342{{"Pruebas unitarias de Flask con Pytest y Cobertura"}} end

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.