Saltar al contenido

Blog técnico | Fundamentos del desarrollo dirigido por pruebas

El desarrollo dirigido por pruebas (TDD) es una metodología que los programadores utilizan para producir código de mayor calidad. El procedimiento «típico» de codificación ha sido primero el código, segundo la prueba. El TDD cambia esta mentalidad centrándose en las pruebas antes de que se produzca la codificación real. Este artículo es un breve resumen de los fundamentos con un pequeño ejemplo de cómo funciona. Usaremos Python, y más específicamente el marco de pruebas unitarias proporcionado en la biblioteca estándar de Python. Aunque Python es el lenguaje utilizado en este ejemplo, el proceso de TDD es agnóstico a cualquier lenguaje.

El proceso

El diagrama muestra los pasos de alto nivel para la TDD. El objetivo es hacer la mínima cantidad de trabajo posible para que la prueba pase y evitar la sobrecomplicación del proceso. Usando un ejemplo, pasaremos por cada paso para mostrar cómo funcionaría. Si no estás familiarizado con el framework unittest de Python puedes consultar este tutorial para tener una visión general (o deberías ser capaz de captar gran parte de la funcionalidad a partir de los comentarios del código).

Blog técnico | Fundamentos del desarrollo dirigido por pruebas
Blog técnico | Fundamentos del desarrollo dirigido por pruebas

Resumen del ejemplo

Queremos crear un guión que formatee una lista de direcciones. Nuestro principal requisito es asegurarnos de que no haya decimales en ninguna dirección.

Paso 1: Prueba de escritura

Esta primera prueba comprobará si nuestras direcciones fueron cargadas con éxito en la lista.

# Archivo: "test.py "importunittest# Importar el marco unittest frameworkfrommy_code_blockimportformat_addresses# Importar la función desde nuestro archivo de script# Crear nuestra propia clase de caso de prueba que herede de la base TestCase classclassAddressTestCase(unittest.TestCase):# Hacer una configuración inicial para que las direcciones estén disponibles para todas las pruebasdefsetUp(self):self. addresses=[$0027634 Tomato Way$0027,$0027233 E. 500 S.$0027,$00271800 N. Python Lane$0027]deftest_address_in_list(self):# Esta afirmación comprueba que la primera dirección está en la lista viendo si es equalfirst_address=format_addresses(self.addresses)[0]self.assertEqual(first_address,$0027634 Tomato Way$0027)

Paso 2: Ejecutar y fallar la prueba

El resultado es que la prueba falló, lo cual es de esperar ya que no hemos escrito nada todavía.

Archivo $0027test.py$0027, línea 12, en test_address_in_list first_address= format_addresses(self.addresses)[0]NameError: name $0027format_addresses$0027 no está definido——————————————————————————Ran 1test en 0.000sFAILED (errors=1)

Paso 3: Escribir el código

Ahora podemos escribir el código para que tenga éxito.

# Archivo: "my_code_block.py "defformat_addresses(addresses):returnaddresses

Paso 4: Correr y pasar la prueba

Paso 5: Código del Refactor

En este punto no hay mucho código que refactorizar, ya que fue un ejemplo muy arbitrario, pero después de hacer cada ronda es bueno tomarse un segundo para ver qué piezas de código se pueden consolidar y hacer más eficientes.

¡Ahora repite!

Ahora aplicaremos los mismos principios para formatear las direcciones para no tener ningún decimal en ninguna de ellas.

Paso 1: Prueba de escritura

# Archivo: "test.py "importunittestfrommy_code_blockimportformat_addressesclassAddressTestCase(unittest.TestCase):# Haz una configuración inicial para que las direcciones estén disponibles para todas las pruebasdefsetUp(self):self. addresses=[$0027634 Tomato Way$0027,$0027233 E. 500 S.$0027,$00271800 N. Python Lane$0027]deftest_address_in_list(self):first_address=format_addresses(self.addresses)[0]self. assertEqual(first_address,$0027634 Tomato Way$0027)# *************** Añadido test de decimales ******************deftest_decimal(self):no_decimals=Trueformatted_addresses=format_addresses(self. addresses)forvalueinformatted_addresses:if$0027.$0027invalue:no_decimals=False# Ejecuta una afirmación sobre si había o no decimales en una de las direcciones.self.assertTrue(no_decimals)

Paso 2: Ejecutar y fallar la prueba

Archivo $0027test.py$0027, línea 23, en test_decimal self.assertTrue(no_decimales)AssertionError: Falso no es verdadero———————————————————————————————-Ran 2 pruebas en 0.001sFAILED (failures=1)

Paso 3: Escribir el código

# Archivo: "my_code_block.py "defformat_addresses(addresses):formatted_addresses=[]forvalueinaddresses:value=value.replace($0027.$0027,$0027$0027)formatted_addresses.append(value)returnnformatted_addresses

Paso 4: Correr y pasar la prueba

Paso 5: Código del Refactor

Entonces, comprueba las formas de mejorar tu código.

¡Repítelo!

Fue difícil para mí entender esto. Me pareció que mi naturaleza se echaba atrás para probar primero. Pero una vez que hice algunos proyectos usando este nuevo paradigma, sentí que mi código se volvió mucho más limpio. TDD te permite arreglar problemas antes de que existan.

Categorías: technicalTags: testing, python