Intro al Desarrollo de Software con Test-Driven Development

by Javier Treviño Saldaña

Test-driven development (TDD) o “desarrollo guiado por pruebas”, es una técnica que ayuda a crear software confiable, legible y simple de mantener. Aunque estas son sus características deseadas, no significa que sean una garantía, pues dependen del nivel de entendimiento que se tenga y la habilidad de cada quien. Por ello en este blog te daremos una introducción a TDD, lo más cercano que conozco a una “silver bullet” para lograr un excelente desarrollo.

TDD es una técnica de ingeniería de software

Consiste en codificar pruebas durante el desarrollo de una aplicación, antes de cada funcionalidad que deseas agregar.

Beneficios de aplicarlo

  • Se atrapan bugs durante el desarrollo (y no tus usuarios)
  • Se implementan sólo las funciones que requiera el proyecto
  • Produce software modular, reutilizable y adaptable a cambios futuros

En Dynamic.Tech somos una empresa de desarrollo de software que utiliza esta técnica para hacer más rentables los proyectos de nuestros clientes, además de tener mejores tiempos de respuesta ante problemas que solucionar sin comprometer tiempo y dinero en las siguientes etapas de desarrollo.

Si aún no estás familiarizado con la programación, te recomendamos visitar nuestro artículo “¿Cómo empezar una app desde cero? Primeros pasos” para que definas tu punto de partida como software developer.

Ejemplo de TDD con la función “Reverse”

Supongamos que vamos a crear una función “reverse” que acepta una lista como input, y regresa como output la misma lista pero con sus elementos en reversa.

list = [1, 2, 3, 4, 5]
reverse(list)
# => [5, 4, 3, 2, 1]

Con este objetivo en mente, y empezando de cero, podemos implementar la función gradualmente aplicando Test Driven Development. Nuestra primera prueba debe ser simple, por ejemplo:

test "reversing an empty list" do
  assert reverse([]) == []
end

Esta primera prueba sencilla de desarrollo de software es útil para asegurarnos de que nuestro ambiente de correr pruebas está configurado correctamente. Al ejecutar la prueba esperamos ver un error útil, no un error de compilación. Además esta primera prueba nos ayuda a preguntarnos cómo queremos llamar esta función desde el resto de nuestro sistema (“reverse”), y los parámetros que nos gustaría que acepte (una lista).

Sin hacer nada más, al ejecutar esta prueba en nuestra terminal esperamos que falle, pues no hemos definido la función reverse.

$ test
Running 1 test...

FAILURE

Exception: "reverse" is not defined

Implementemos lo mínimo necesario para pasar la prueba, y volvemos a correrla:

function reverse(list) do
  return []
end
$ test
Running 1 test...
OK

Ya hemos hecho un progreso importante: tenemos una prueba que garantiza que un caso válido de nuestra función “reverse” funciona. Sigamos con un caso ligeramente más complicado al anterior (esperando provocar una falla):

test "reversing a list with one element" do
  assert reverse([7]) == [7]
end
$ test
Running 2 tests...

1 OK, 1 FAILURE

Expected "reverse([7])" to equal "[7]", but got "[]"

En esta prueba especificamos que el resultado de “reverse” para una lista de un elemento, debe ser la misma lista ([7]), pero obtuvimos una lísta vacía.

Hagamos los cambios necesarios para pasar la prueba:

 function reverse(list) do
-  return []
+  return list
 end
$ test
Running 2 tests...
OK

De esta manera podemos agregar casos cada vez más complejos, y dar pasos firmes sabiendo que mientras las pruebas pasen, nuestro código funciona.

Eventualmente cuando hagamos un cambio que afecte a una parte anterior del código, nuestras pruebas nos alertan si dimos un mal paso o estropeamos una función, y así podremos corregir.

Una vez que terminemos de implementar nuestras funcionalidades, tendremos una suite de pruebas de software que:

  • Garantiza que nuestro código “funciona”
  • Plasma nuestras expectativas, es decir, nuestra definición de “funciona”
  • Protege contra cambios futuros, al alertar si un cambio rompe nuestras expectativas
  • Sirve como documentación, y siempre se mantiene actualizada si la función cambia
Pruebas de Software con TDD

Las pruebas de software cambian el paradigma y metodología tradicional para optar por especificaciones concretas, con datos realistas, y no basado en tareas que crees que se hacen, sino en parámetros de entrada y salida e interacciones reales, que validan los resultados que se esperan. Al hacerlo correctamente se obtiene una lista muy completa de ejemplos de funcionalidad que demuestra su aceptabilidad.

Llegar a dominar esta técnica es un camino largo, pero no tienes que recorrerlo solo. En Dynamic.Tech somos una empresa de desarrollo de software con más de 15 años de experiencia en la industria que ponemos a tu disposición. Hemos colaborado con empresas que van desde pequeñas y privadas hasta grandes organizaciones públicas de renombre mundial que requieran programacion de software.

Nuestro equipo puede apoyarte con asesoría, entrenamiento, e incluso construyendo la aplicación contigo y tu equipo. Da click aquí y nos pondremos en contacto contigo.

Dynamic.Tech - Desarrollo de Software