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.
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:
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.
Conviene automatizar cuando una verificación cumple una o varias de estas condiciones:
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.
No toda prueba debe automatizarse de inmediato. Puede ser mejor esperar cuando:
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.
Supongamos que tenemos una función que calcula el precio final de un producto aplicando un descuento. Una verificación manual podría ser:
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.
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.
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á.
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.
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.
Con este ejemplo pequeño ya aparecen beneficios concretos:
En proyectos reales, estos beneficios se multiplican porque una suite automatizada puede contener cientos o miles de verificaciones.
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.
Antes de automatizar una prueba, responde estas preguntas:
Si la mayoría de las respuestas es afirmativa, probablemente conviene automatizar.
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.
Crea un archivo llamado envios.py con una función que calcule el costo de envío según el monto de compra:
ValueError.Luego crea test_envios.py y automatiza al menos tres pruebas: envío gratuito, envío con costo y monto inválido.
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)
Antes de continuar con el próximo tema, verifica lo siguiente:
python -m pytest.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.