Curso
Probar te da la confianza de que tu código hace lo que esperas. En este tutorial, aprenderemos los conceptos básicos del desarrollo guiado por pruebas (TDD) con Python. Para empezar, veremos algo de contexto sobre qué es el TDD y por qué escribir primero las pruebas ayuda al programar. Adoptaremos un enfoque de pruebas primero: escribiremos casos de prueba que fallen para la funcionalidad que queremos implementar antes de escribir las funciones reales.
Requisitos previos del tutorial
Para seguir este tutorial, necesitas conocimientos básicos de Python; si quieres refrescarlos, puedes echar un vistazo a este curso: Introduction to Python for Developers.
Un enfoque de pruebas primero nos permitirá pensar en el comportamiento deseado y las salidas esperadas. Puedes usar varias librerías para probar en Python, como pytest y unnitest. Sin embargo, por ahora nos centraremos en cómo escribir casos de prueba sencillos usando Python nativo que validen que la funcionalidad deseada produce la salida esperada.
Empezaremos con un caso de prueba simple e iremos ampliando los casos de forma incremental para cubrir distintos escenarios. A medida que ampliemos las pruebas, puede que encontremos errores o lagunas en nuestra lógica inicial que debamos mejorar. Este proceso de escribir iterativamente pruebas más avanzadas, verlas fallar y volver a mejorar la implementación está en el corazón del desarrollo guiado por pruebas con Python.
Para este tutorial, usaremos DataLab, el cuaderno de datos en la nube de DataCamp que te permite escribir y ejecutar código Python sin instalar nada en local. ¡Vamos a ello!
Primeros pasos con DataLab
Antes de ponernos con el desarrollo guiado por pruebas, necesitamos explorar DataLab y entender cómo usarlo para que nos ayude en el aprendizaje. Si abres DataLab, verás que tienes muchas opciones. De momento, nos centraremos en escribir Python en DataLab.

Si seleccionas Python, el cuaderno abrirá una celda de código para que escribas. Se verá algo así:

Aquí tienes varias opciones útiles. Por ejemplo, puedes ejecutar la celda para ver la salida, añadir comentarios o notas para apoyar tu aprendizaje y usar IA para empezar o desbloquearte. También puedes añadir o eliminar tantas celdas como necesites. Nos centraremos en ejecutar la celda con la opción "Run". Como ves en el código de abajo, cualquier salida que produzca tu código aparece debajo cuando ejecutas la celda.
Un apunte rápido: si has usado varias celdas y has definido una variable en una pero intentas acceder a ella desde otra, tienes que ejecutar cada celda por separado o ejecutar todo el cuaderno (desde el botón "Run" en la esquina superior derecha del cuaderno).

Ahora que ya controlas lo básico de DataLab, empecemos con el desarrollo guiado por pruebas.
Desarrollo guiado por pruebas
El desarrollo guiado por pruebas consiste en escribir pruebas para tu código antes de escribir el código. Para explicar el TDD, empecemos con un ejemplo sencillo que implica escribir un script en Python para sumar números. Sin embargo, antes de escribir la función, escribiremos una prueba para comprobar si 1 + 1 es igual a 2. Puedes hacerlo con Python nativo, como se muestra abajo.
assert 1 + 1 == 2
La palabra clave assert en Python se usa para escribir casos de prueba y confirmar que las condiciones del programa se evalúan como True. Te permite validar el comportamiento y las salidas de tu código. Cuando una sentencia assert falla, lanza un AssertionError, señalando un problema en el código. En tu cuaderno de DataLab se vería así:

Ejemplo 1: probar una función simple
Empecemos con la función de prueba. Para empezar, abre un archivo de Python en DataLab. El desarrollo guiado por pruebas implica escribir primero una prueba que falle. Así que vamos a escribir una prueba fallida llamando a la función add(), que todavía no está definida.
assert add(1, 1) == 2
Esto dará lugar a un NameError, que indica que no existe implementación, conocido como el paso "rojo". Obtienes un NameError cuando intentas llamar a una función o variable que no se ha definido.

Ahora toca implementar la función. Podemos hacerlo definiéndola así:
def add(num1, num2):
return
Hemos definido nuestra función add, que recibe dos parámetros, num1 y num2. De momento, nuestra función no devuelve nada. ¡Veamos si nuestra implementación pasa las pruebas!

Ya no vemos un NameError. Sin embargo, al ejecutar la celda ¡sigue apareciendo un error! Esta vez es un AssertionError. ¡Así que la prueba sigue fallando! ¿Por qué puede estar ocurriendo? Porque hemos definido una función que aún no devuelve nada.
Al ejecutar la prueba, obtenemos un AssertionError porque 1 + 1 no es igual a 2 con nuestra implementación vacía. Por fin podemos hacer que pase implementando correctamente la lógica en la función.

Verás el punto verde en la esquina de la celda. Indica que tu código es válido y ha pasado al ejecutar la celda. Antes, verías el punto rojo con un error de ejecución y el tipo de error debajo de la celda. Esta función es muy útil para depurar tu código en DataLab.
Ya has escrito tu primera prueba en Python usando desarrollo guiado por pruebas. ¡Buen trabajo! Ahora pasaremos a ampliar nuestras pruebas y a pensar en cómo detectar posibles errores que hagan que la función falle o no produzca la salida esperada.
Ejemplo 2: múltiples casos de prueba
Probar con un solo valor de entrada suele no descubrir errores potenciales. Los bugs pueden esconderse con facilidad, sobre todo si tu función depende de entradas variables del usuario o de lógica externa. Entonces, ¿cómo probamos a fondo una función con múltiples valores?
Por ejemplo, ¿qué pasa si se pasa un tipo de dato incorrecto a la función? Podrías usar frameworks de pruebas de Python, pero vamos a usar Python básico. Primero, definiré una lista de diccionarios de entrada para simular distintos escenarios de uso:
test_cases = [
{"num1": 1, "num2": 3, "expected": 4},
{"num1": 1, "num2": "invalid", "expected": "Error: num2 must be a number"},
{"num1": [1,2,3], "num2": 2, "expected": "Error: num1 must be a number"},
{"num1": -1, "num2": 1, "expected": 0},
{"num1": 3.5, "num2": 2.5, "expected": 6.0},
{"num1": 100, "num2": 200, "expected": 300}
]
El código anterior muestra entradas para la función junto con las salidas esperadas. Sin embargo, debemos actualizar nuestra prueba para iterar por estos casos. Podemos validar cada diccionario de la lista anidando el assert dentro de un bucle for.
for test in test_cases:
assert add(test["num1"], test["num2"]) == test["expected"]
Dado que la función no ha cambiado, ¿esperamos que esta prueba pase o falle? ¿Y qué error podría producirse?

La prueba lanza un TypeError porque no hemos gestionado entradas que no sean números; ¿y si se pasa una cadena o un booleano en lugar de un int? ¡Podemos actualizar la función para capturar estos casos! Podemos devolver un mensaje personalizado en tipos no válidos comprobando que la variable de entrada sea un entero o un float.
def add(num1, num2):
if type(num1) is not int and type(num1) is not float:
return "Error: num1 must be a number"
elif type(num2) is not int and type(num2) is not float:
return "Error: num2 must be a number"
else:
return num1 + num2
Al volver a ejecutar las pruebas, ya no obtenemos errores, así que las pruebas han pasado. Ahora vemos el círculo verde que indica que hemos implementado pruebas que pasan. ¡Bien hecho!

Reflexiones finales
En este tutorial, hemos cubierto los fundamentos del desarrollo guiado por pruebas en Python usando DataLab. DataLab ofrece un IDE en la nube que te permite escribir y ejecutar código Python sin instalaciones locales. Las pruebas validan el comportamiento del código y detectan errores pronto. Las sentencias assert comprueban condiciones y lanzan excepciones cuando fallan.
¡Puedes explorar más casos de prueba y empezar a escribir tus propias pruebas en DataLab! Si quieres aprender más sobre pruebas en Python, echa un vistazo a nuestro curso de DataCamp - Introduction to Testing in Python.
Amina es becaria de desarrollo de contenidos en Datacamp. Con formación en Arquitectura y Educación, cambió de carrera para dedicarse al desarrollo de software, empezando con JavaScript; ahora está centrada en Python.


