Pruebas unitarias y validación

Skip to content

¡Este es un texto traducido automáticamente que puede contener errores!

Ahora que hemos creado clases y trabajado con validación, tenemos una buena base para comenzar con las pruebas. Las pruebas son una parte importante del proceso de desarrollo y nos ayudan a asegurar que nuestro código funciona como se espera.

¿Cómo podemos estar seguros de que el código funciona como debería, 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:

def test_add():
    # Assert at 0.3 + 0.3 + 0.3 er lik 0.9
    assert 0.3 + 0.3 + 0.3 == 0.9

Se ejecuta escribiendo pytest en la terminal.

Fun fact

¡El código anterior fallará, porque .3+.3+.3 se convierte en 0.8999999999 en Python!

Easy Tarea 1 - Instalar pytest

Instala pytest en tu entorno virtual. Esto lo haces ejecutando el siguiente comando en la terminal:

pip install pytest
# Installer pytest - Instala pytest

Easy Tarea 2 - Crea 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 una Person se pueda crear con valores válidos.

Ejemplo de cómo podría 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"))
    # Verifica que el nombre sea correcto
    assert bob_kaare.name == "Bob Kåre"
    # Verifica que el color de ojos sea correcto
    assert bob_kaare.eye_color == EyeColor.BLUE

Este tipo de prueba se llama “happy path” testing, porque probamos que todo funciona como debería cuando proporcionamos valores válidos, y no es particularmente útil.

Medium Tarea 3 - Prueba de validación

Crea más pruebas en test_person.py que verifiquen que la validación en Email y PhoneNumber funciona como debería. Prueba tanto valores válidos como inválidos. Aquí debes usar una función en pytest que se llama 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 "raise" una KeyError

Tip

Puedes crear tantas funciones como quieras, siempre y cuando el nombre de la función comience con test_.

Løsning: Ejemplo de una prueba para correo electrónico invá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 tener buenas pruebas para nuestro código, podemos estar seguros de que funciona como debería, y podemos averiguar fácilmente si algo ha salido mal si hacemos cambios en el código. Esto es especialmente importante en proyectos más grandes, donde muchos desarrolladores trabajan juntos y es fácil cometer errores.

Por ejemplo, utilizando software como Jest o Selenium, podemos probar sitios web automáticamente y, por lo tanto, asegurarnos de que todo funcione como debería después de cada cambio en el código. Nos gustaría saber que “registro de usuarios”, “pago” e “inicio de sesión” funcionan como deberían, ¿verdad?

Tenk over følgende scenarioer

¿Qué ocurre (o debería ocurrir) 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 que introduce el nombre “jOHN dOE”?

A software tester walks into a bar...

Hard 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 realizamos un cambio en el código. Esto se llama Integración Continua (CI), y nos ayuda a asegurar que nuestro código siempre funcione como debería.

Crea un archivo en la carpeta de tu proyecto llamado .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 la has configurado correctamente, ahora deberías ver una nueva pestaña en tu repositorio de GitHub llamada “Actions”. Aquí podrás ver 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).

Merknad om filestructura

La estructura de archivos determinará si GitHub Actions funciona o no. Asegúrese de que la carpeta .github se encuentre en la carpeta raíz de su proyecto, y lo mismo ocurre con una carpeta tests donde se encuentran sus archivos de prueba.

Puede modificar el archivo pytest.yml para apuntar a la carpeta correcta.

Los archivos de Actions como estos también se pueden utilizar para probar tu código en múltiples versiones de Python o sistemas operativos, también se pueden utilizar para construir y publicar tu software automáticamente, por ejemplo, publicar una página web o actualizar una aplicación en App Store o Google Play.

Code Coverage

Existe también algo llamado “Code Coverage”, que puede ayudarte a ver cuánto de tu código está realmente siendo probado. Esto puede ser útil para determinar si tienes suficientes pruebas, o si hay partes de tu código que no se están probando en absoluto.

Algunos lugares de trabajo requieren que tengas un cierto porcentaje de tu código cubierto por pruebas antes de poder implementarlo, para asegurar que el código sea robusto y funcione como debería.

Unit Test Meme