¡Este es un texto traducido automáticamente que puede contener errores!
Pruebas de unidad y validación
Ahora que hemos creado clases y trabajado con la validación, tenemos una buena base para comenzar a probar. Las pruebas son una parte importante del proceso de desarrollo y nos ayudan a asegurarnos de que nuestro código funcione como se espera.
¿Cómo podemos estar seguros de que el código funciona correctamente si no lo probamos?
¿Qué son las pruebas unitarias?
Las pruebas unitarias son un método para probar automáticamente y sistemáticamente pequeñas partes de nuestro código. En Python, utilizamos un módulo llamado pytest para escribir y ejecutar pruebas. Una “unit” es la parte más pequeña y comprobable de una aplicación, a menudo una sola función o método. Cuando utilizamos pytest, es importante que sigamos las convenciones de nomenclatura correctas para que pytest pueda encontrar nuestras pruebas, como nombrar los archivos de prueba con test_ al principio y las funciones de prueba con test_ al principio.
Ejemplo de una prueba unitaria:
The provided input does not contain any Norwegian comments that need translation; therefore, it is returned unchanged as required by the constraints.
def test_add():
assert 0.3 + 0.3 + 0.3 == 0.9
Se ejecuta escribiendo pytest en la terminal.
Dato curiosa
El código anterior fallará porque .3+.3+.3 se convierte en 0.8999999999 en ¡Python!
Tarea 1 - Instalar pytest
Instala pytest en tu entorno virtual. Esto lo haces ejecutando el siguiente comando en la terminal:
pip install pytest
Tarea 2 - Crear una prueba
Crea un nuevo archivo en tu carpeta de proyecto llamado test_data.py. En este archivo debes crear una prueba para la clase Person que creaste en el módulo anterior. La prueba debe verificar que se pueda crear una instancia de Person con valores válidos.
Ejemplo de cómo puede verse la prueba:
from main import Person
def test_person_working():
bob_kaare = Person(name="Bob Kåre",
eye_color=EyeColor.BLUE,
phone_number=PhoneNumber("12345678"),
email=Email("bob_kaare@example.com"))
assert bob_kaare.name == "Bob Kåre"
assert bob_kaare.eye_color == EyeColor.BLUE
Este tipo de pruebas se denomina prueba del “camino feliz”, ya que probamos que todo funciona como debe cuando se proporcionan valores válidos y no es particularmente útil.
Tarea 3 - Probar la validación
Crea varias pruebas en test_person.py que comprueben que la validación de Email y PhoneNumber funciona como debe ser. Prueba tanto valores válidos como inválidos. Aquí debes usar una función de pytest llamada raises, que verifica que se lance un error específico.
import pytest
def test_exception():
with pytest.raises(KeyError):
my_dict = {"a": 1, "b": 2}
value = my_dict["c"] # Esto lanzará un KeyError
Tip
Puedes crear tantas funciones como quieras, siempre y cuando el nombre de la función comience con test_.
Solución: Ejemplo de una prueba para un correo electrónico no válido
from main import Email
import pytest
def test_invalid_email():
with pytest.raises(ValueError):
email = Email("not-an-email")
¿Por qué hacer esto?
Al contar con buenas pruebas para nuestro código, podemos estar seguros de que funciona como debe y podemos detectar fácilmente si algo falla al realizar cambios en el código. Esto es especialmente importante en proyectos grandes, donde muchos desarrolladores trabajan juntos y es fácil cometer errores.
Vídeo: Por qué las pruebas protegen el código de nuevos errores
El vídeo explica por qué es importante la prueba y cómo las pruebas automatizadas pueden detectar errores después de cambios en el código.
Por ejemplo, al utilizar software como Jest o Selenium se puede probar sitios web automáticamente, asegurándose así de que todo funcione correctamente tras cada cambio en el código. Queremos saber que el «registro de usuarios», el «pago» y el «inicio de sesión» funcionan como deben, ¿verdad?
Considera los siguientes escenarios
¿Qué sucede (o debería suceder) si…:
- ¿Un usuario intenta registrarse con un correo electrónico que ya está en uso?
- ¿Un usuario tiene una fecha de nacimiento en el futuro?
- ¿Un usuario escribe su nombre como “jOHN dOE”?
Tarea 4 - Pruebas automáticas (CI)
Cuando publicamos código en GitHub, podemos configurar algo llamado GitHub Actions que puede ejecutar nuestras pruebas automáticamente cada vez que hacemos un cambio en el código. Esto se llama Integración Continua (CI) y nos ayuda a asegurarnos de que nuestro código siempre funcione como debe ser.
Crea un archivo en tu carpeta del proyecto con el nombre .github/workflows/pytest.yml. En este archivo debes agregar el siguiente código:
name: Pytest
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest
# Instala cualquier otra dependencia que necesite tu proyecto
pip install -r requirements.txt
- name: Run tests with pytest
run: pytest
Si lo has configurado correctamente, ahora verás una nueva pestaña en tu repositorio de GitHub llamada “Actions”. Aquí podrás observar que tus pruebas se ejecutan automáticamente cada vez que realizas un cambio en el código y recibirás una notificación si alguna de las pruebas falla (cruz roja y por correo electrónico).
Nota sobre la estructura de archivos
La estructura de tus archivos determinará si GitHub Actions funciona o no. Asegúrate de que la carpeta .github esté en el directorio raíz de tu proyecto y lo mismo ocurra con una carpeta tests donde se encuentren tus archivos de prueba.
Puedes cambiar el archivo pytest.yml para apuntar al directorio correcto.
Los archivos de GitHub Actions también se pueden utilizar para probar tu código en varias versiones de Python o sistemas operativos; además, se pueden emplear para compilar y publicar automáticamente tu software, por ejemplo, publicando un sitio web o actualizando una aplicación en la App Store o Google Play.
Cobertura de código
También existe algo llamado “Cobertura de código” (Code Coverage), que puede ayudarte a ver cuánto de tu código está siendo probado realmente. Esto puede ser útil para saber si tienes suficientes pruebas o si hay partes de tu código que no están siendo probadas en absoluto.
Algunos lugares de trabajo requieren que tengas un cierto porcentaje de cobertura de pruebas sobre tu código antes de poder desplegarlo, para asegurarse de que el código sea robusto y funcione como debe.

