TEC · Técnica 7 · Archivos y errores

35.Pruebas

Código que comprueba automáticamente que otras partes del programa dan el resultado esperado, para encontrar errores antes que el usuario.

¿Qué es?

Una prueba es un pedazo de código que revisa automáticamente si otra parte del programa funciona: le da datos a una función y compara lo que devuelve con lo que debería devolver.

Es como la lista de verificación de un piloto antes de despegar: no revisa «a ver si funciona», sino puntos concretos con un resultado esperado. Y la repite cada vez, no solo la primera.

Para qué sirven

  • Encontrar errores antes de que los encuentre el usuario.
  • Cambiar el código con confianza: si rompes algo, una prueba falla y te avisa.
  • Documentar: las pruebas muestran con ejemplos qué debe hacer cada función.

Qué casos probar

Tipo de caso Ejemplo para es_aprobado(calificacion)
Normal 8 → True, 4 → False
Límite 6 → True, 5.99 → False, 10, 0
Inválido -1 u 11 → debe lanzar ValueError

Sintaxis (pseudocódigo / Python)

PSeInt

PSeInt no tiene una herramienta de pruebas, pero la idea se aplica igual: escribe una tabla de entradas y salidas esperadas, ejecuta el algoritmo con cada una y anota si coincide.

Entrada Esperado Obtenido ¿Pasa?
8 Aprobado Aprobado ✔
6 Aprobado Reprobado ✘

Python con assert

def es_aprobado(calificacion):
    if calificacion < 0 or calificacion > 10:
        raise ValueError("La calificación debe estar entre 0 y 10")
    return calificacion >= 6

assert es_aprobado(8) is True
assert es_aprobado(4) is False
assert es_aprobado(6) is True       # caso límite
assert es_aprobado(5.99) is False   # caso límite
print("Todas las pruebas pasaron")

Si una condición de assert es falsa, Python lanza AssertionError y se detiene en esa línea.

Python con unittest (incluido en Python)

import unittest

def es_aprobado(calificacion):
    if calificacion < 0 or calificacion > 10:
        raise ValueError("La calificación debe estar entre 0 y 10")
    return calificacion >= 6

class PruebasAprobado(unittest.TestCase):
    def test_casos_normales(self):
        self.assertTrue(es_aprobado(8))
        self.assertFalse(es_aprobado(4))

    def test_limites(self):
        self.assertTrue(es_aprobado(6))
        self.assertFalse(es_aprobado(5.99))

    def test_invalidos(self):
        with self.assertRaises(ValueError):
            es_aprobado(11)

unittest.main(argv=["pruebas"], exit=False)

Salida:

...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Ejemplo guiado

Problema: probar una función que calcula el precio con descuento, organizada como en un proyecto real con pytest.

1. Archivo precios.py:

# sin probar en la ficha (proyecto de dos archivos con pytest); ver nota al final
def precio_con_descuento(precio, porcentaje):
    if precio < 0 or not 0 <= porcentaje <= 100:
        raise ValueError("Datos fuera de rango")
    return round(precio * (1 - porcentaje / 100), 2)

2. Archivo test_precios.py:

# sin probar en la ficha (proyecto de dos archivos con pytest); ver nota al final
import pytest
from precios import precio_con_descuento

def test_sin_descuento():
    assert precio_con_descuento(100, 0) == 100

def test_descuento_normal():
    assert precio_con_descuento(200, 15) == 170

def test_descuento_total():
    assert precio_con_descuento(80, 100) == 0

def test_porcentaje_invalido():
    with pytest.raises(ValueError):
        precio_con_descuento(100, 120)

3. Ejecutar en la terminal:

pip install pytest
pytest

Resultado esperado: 4 passed.

Si mañana alguien cambia la fórmula y la rompe, pytest lo dirá en segundos, antes de que llegue al usuario.

Errores comunes

Buenas prácticas

  • Escribe la prueba junto con la función (o incluso antes, como en el desarrollo guiado por pruebas, TDD).
  • Nombres descriptivos: test_descuento_mayor_a_100_lanza_error.
  • Una idea por prueba.
  • Ejecuta todas las pruebas antes de entregar o de subir cambios con Git.
  • Funciones pequeñas y sin input()/print() son mucho más fáciles de probar.

Material descargable

Aún no hay material descargable para este tema. Pronto habrá cuadernillos, manuales o laboratorios.

Referencias

© solutions_ · Fundamentos de programación · 35 Pruebas