1. Qué significa automatizar pruebas y cuándo conviene hacerlo

1.1 Objetivo del tema

Automatizar pruebas no significa solamente escribir pruebas con código. Significa construir un mecanismo repetible para ejecutar verificaciones, obtener resultados claros y detectar regresiones sin depender de una revisión manual en cada cambio.

En este primer tema vamos a definir qué es una prueba automatizada, qué problemas resuelve, cuándo conviene automatizar y cuándo todavía es mejor probar manualmente. También crearemos un ejemplo mínimo en Python para comparar una verificación manual con una verificación automatizada.

Objetivo práctico: comprender el criterio de automatización y ejecutar una primera prueba automatizada con Python y pytest.

1.2 Qué es automatizar una prueba

Una prueba automatizada es un programa que prepara una situación, ejecuta una acción sobre el sistema y verifica si el resultado obtenido coincide con el resultado esperado.

La diferencia principal con una prueba manual es que la verificación queda expresada en código. Eso permite ejecutarla muchas veces, en distintos momentos y con menos posibilidad de olvidar pasos importantes.

Una prueba automatizada útil debe cumplir tres condiciones:

  • Ser repetible: debe poder ejecutarse varias veces con el mismo resultado si el sistema no cambió.
  • Ser clara: debe mostrar qué comportamiento está verificando.
  • Ser confiable: debe fallar por un problema real y no por azar, dependencia externa o mala preparación del escenario.

1.3 Qué no es automatizar pruebas

Automatizar no es grabar pasos sin entender qué se valida, ni crear pruebas para todo sin criterio. Tampoco reemplaza por completo el análisis humano, la exploración ni la revisión funcional de una característica nueva.

La automatización debe enfocarse en verificaciones que se repiten, que son importantes para el negocio o que sería costoso revisar a mano cada vez que cambia el código.

Una mala prueba automatizada puede dar una falsa sensación de seguridad. Por eso, además de automatizar, debemos diseñar pruebas simples, legibles y mantenibles.

1.4 Cuándo conviene automatizar

Conviene automatizar cuando una verificación cumple una o varias de estas condiciones:

  • Se ejecuta con frecuencia.
  • Es parte de una regresión importante.
  • Requiere muchos datos o muchas combinaciones.
  • Debe repetirse después de cada cambio de código.
  • Puede verificarse con un resultado objetivo.
  • Es lenta, tediosa o propensa a errores si se hace manualmente.

Por ejemplo, si una función calcula descuentos y se usa en muchas ventas, conviene automatizar los casos principales, los límites y los errores esperados.

1.5 Cuándo no conviene automatizar todavía

No toda prueba debe automatizarse de inmediato. Puede ser mejor esperar cuando:

  • La funcionalidad cambia todos los días y todavía no tiene reglas estables.
  • El resultado esperado depende de una evaluación visual o subjetiva.
  • La automatización tardaría más que el valor que aportará.
  • El escenario depende de servicios externos inestables que aún no podemos controlar.
  • La prueba solo se hará una vez y no forma parte de una regresión futura.

En esos casos puede ser más útil comenzar con pruebas manuales exploratorias, documentar los casos importantes y automatizar cuando el comportamiento esté más definido.

1.6 Un ejemplo manual

Supongamos que tenemos una función que calcula el precio final de un producto aplicando un descuento. Una verificación manual podría ser:

  • Tomar un precio de 100.
  • Aplicar un descuento del 10%.
  • Comprobar que el resultado sea 90.

Si hacemos esto una sola vez, la prueba manual alcanza. Pero si el cálculo se ejecuta en muchas partes del sistema y puede romperse con futuros cambios, conviene automatizarlo.

1.7 Crear el código a verificar

Crea una carpeta de práctica y dentro de ella un archivo llamado precios.py:

def calcular_precio_final(precio, descuento):
    if precio < 0:
        raise ValueError("El precio no puede ser negativo")

    if descuento < 0 or descuento > 100:
        raise ValueError("El descuento debe estar entre 0 y 100")

    return precio - (precio * descuento / 100)

La función tiene una regla simple: recibe un precio, recibe un porcentaje de descuento y devuelve el precio final. También valida datos inválidos.

1.8 Automatizar la primera verificación

Ahora crea un archivo llamado test_precios.py en la misma carpeta:

from precios import calcular_precio_final


def test_calcular_precio_final_con_descuento():
    resultado = calcular_precio_final(100, 10)

    assert resultado == 90

La prueba expresa en código la misma verificación manual. Si alguien cambia la función y rompe el cálculo, esta prueba fallará.

1.9 Ejecutar la prueba automatizada

Desde la terminal, en la carpeta donde están los archivos, ejecuta:

python -m pytest

Si todo está correcto, pytest informará que la prueba pasó. Esa salida es la evidencia automática de que el comportamiento verificado sigue funcionando.

1.10 Agregar más escenarios

Una ventaja de automatizar es que podemos sumar casos sin tener que repetirlos manualmente cada vez. Agrega estas pruebas al archivo test_precios.py:

import pytest

from precios import calcular_precio_final


def test_calcular_precio_final_con_descuento():
    resultado = calcular_precio_final(100, 10)

    assert resultado == 90


def test_calcular_precio_final_sin_descuento():
    resultado = calcular_precio_final(150, 0)

    assert resultado == 150


def test_calcular_precio_final_con_descuento_total():
    resultado = calcular_precio_final(80, 100)

    assert resultado == 0


def test_calcular_precio_final_rechaza_precio_negativo():
    with pytest.raises(ValueError):
        calcular_precio_final(-10, 20)


def test_calcular_precio_final_rechaza_descuento_mayor_a_cien():
    with pytest.raises(ValueError):
        calcular_precio_final(100, 120)

Ahora la suite revisa escenarios normales y errores esperados. Cada ejecución de python -m pytest validará todos esos comportamientos.

1.11 Qué ganamos con esta automatización

Con este ejemplo pequeño ya aparecen beneficios concretos:

  • La verificación se ejecuta en segundos.
  • Los casos quedan documentados como código ejecutable.
  • La prueba se puede repetir cada vez que cambiamos la función.
  • El error se detecta cerca del cambio que lo produjo.
  • La suite puede crecer con nuevos escenarios sin perder claridad.

En proyectos reales, estos beneficios se multiplican porque una suite automatizada puede contener cientos o miles de verificaciones.

1.12 Costo de automatizar

Automatizar también tiene costo. Hay que escribir pruebas, mantenerlas, corregirlas cuando cambian las reglas y eliminar las que dejan de aportar valor.

Por eso la pregunta correcta no es "¿podemos automatizarlo?", sino "¿vale la pena automatizarlo?". Una prueba automatizada vale la pena cuando ahorra tiempo, reduce riesgo o mejora la confianza en los cambios.

1.13 Criterio práctico de decisión

Antes de automatizar una prueba, responde estas preguntas:

  • ¿Esta verificación se repetirá muchas veces?
  • ¿El resultado esperado es claro y objetivo?
  • ¿La funcionalidad es importante para el usuario o el negocio?
  • ¿La prueba puede ejecutarse sin intervención manual?
  • ¿Podemos preparar los datos necesarios de forma controlada?
  • ¿La prueba será fácil de entender cuando falle?

Si la mayoría de las respuestas es afirmativa, probablemente conviene automatizar.

1.14 Tipos de automatización que veremos en el curso

Durante el curso trabajaremos con automatización de pruebas usando Python, principalmente con pytest. Veremos cómo organizar suites, preparar datos, parametrizar escenarios, clasificar pruebas, ejecutar comandos, generar reportes y mantener pruebas confiables.

No profundizaremos todavía en automatización específica de APIs REST, aplicaciones web, CI/CD o rendimiento, porque esos temas tendrán cursos propios. Aquí nos concentraremos en la base que permite que cualquier suite automatizada sea ordenada y sostenible.

1.15 Buenas prácticas desde el inicio

  • Automatiza comportamientos importantes, no detalles internos innecesarios.
  • Usa nombres de pruebas que expliquen el caso verificado.
  • Mantén cada prueba enfocada en una idea principal.
  • Evita depender de datos cambiantes o servicios externos si no están controlados.
  • Ejecuta la suite con frecuencia, no solo al final del trabajo.
  • Corrige las pruebas frágiles en lugar de acostumbrarte a ignorarlas.

1.16 Ejercicio práctico

Crea un archivo llamado envios.py con una función que calcule el costo de envío según el monto de compra:

  • Si el monto es mayor o igual a 5000, el envío cuesta 0.
  • Si el monto es menor a 5000, el envío cuesta 800.
  • Si el monto es negativo, debe producirse un ValueError.

Luego crea test_envios.py y automatiza al menos tres pruebas: envío gratuito, envío con costo y monto inválido.

1.17 Solución propuesta

Una posible implementación es:

def calcular_costo_envio(monto):
    if monto < 0:
        raise ValueError("El monto no puede ser negativo")

    if monto >= 5000:
        return 0

    return 800

Y las pruebas automatizadas podrían escribirse así:

import pytest

from envios import calcular_costo_envio


def test_envio_es_gratis_para_compras_desde_cinco_mil():
    assert calcular_costo_envio(5000) == 0


def test_envio_tiene_costo_para_compras_menores_a_cinco_mil():
    assert calcular_costo_envio(4999) == 800


def test_envio_rechaza_monto_negativo():
    with pytest.raises(ValueError):
        calcular_costo_envio(-1)

1.18 Lista de verificación

Antes de continuar con el próximo tema, verifica lo siguiente:

  • Comprendes la diferencia entre probar manualmente y automatizar una prueba.
  • Sabes explicar cuándo conviene automatizar una verificación.
  • Ejecutaste al menos una prueba con python -m pytest.
  • Creaste pruebas para casos normales y para errores esperados.
  • Identificaste que una buena prueba automatizada debe ser repetible, clara y confiable.

1.19 Conclusión

En este tema vimos que automatizar pruebas consiste en convertir verificaciones importantes en código ejecutable. Esto permite repetirlas de forma rápida, detectar regresiones y trabajar con más confianza cuando el sistema cambia.

También vimos que no todo debe automatizarse de inmediato. La automatización tiene sentido cuando la prueba aporta valor, se repetirá y puede verificarse con un resultado claro.

En el próximo tema prepararemos un proyecto base en Python para organizar correctamente el código, las pruebas y las herramientas que usaremos durante el curso.