El blog de QA en español de Redsauce

TDD: Desarrolla sin miedo, haciendo las pruebas primero

Artículo de Héctor Sisternas

TDD: Desarrolla sin miedo, haciendo las pruebas primero

¿Alguna vez has sentido que tus proyectos de desarrollo de software se vuelven caóticos y llenos de errores? ¿Quieres encontrar una forma efectiva de garantizar el QA de tu código desde el principio? Una posible solución es la metodología TDD (Test Driven Development), una doctrina que ha revolucionado la forma en que los desarrolladores elaboran su software.


En este post, explicaremos en detalle qué es el Test Driven Development, cómo funciona y por qué deberías considerar implementarlo en tus proyectos.

¿Qué es el TDD (Test Driven Development)?

El Test Driven Development, o Desarrollo Dirigido por Pruebas en español, es una metodología que se basa en escribir primero la prueba y después el código. El objetivo principal del TDD es garantizar que el software funcione correctamente y cumpla con los requisitos definidos.

¿Cómo funciona el TDD?

El TDD sigue un enfoque iterativo y se basa en el ciclo de "Rojo-Verde-Refactorizar":


Rojo: En esta etapa, se escribe una prueba automatizada que describa el comportamiento esperado del código que aún no se ha implementado. El test debe fallar inicialmente (rojo), ya que el código aún no existe.


Verde: En esta parte, se implementa el código mínimo necesario para que la prueba pase (verde). El objetivo aquí es escribir el código más simple y directo que cumpla con los requisitos de la prueba.


Refactorizar: Después de que la prueba pase, se realiza una mejora en el código existente sin cambiar su comportamiento. Esto implica limpiar y reorganizar el código para que sea más legible, mantenible y eficiente.


Este ciclo se repite continuamente, con la adición de nuevas pruebas y refactorización del código existente, a medida que se desarrolla el software.


image

Beneficios del TDD:

Mayor calidad del código: Al seguir el TDD y escribir pruebas antes de implementar el código, se garantiza una cobertura más amplia. Esto conduce a un código más confiable y menos propenso a errores, ya que cada cambio se valida automáticamente mediante los tests.


Detectar errores antes: El TDD permite identificar errores y problemas en las primeras etapas del desarrollo, lo que facilita su corrección antes de que se propaguen y se vuelvan más difíciles de solucionar. Además la ejecución de estos test es tremendamente rápida.


Mejor arquitectura de software: Al aplicar el ciclo de refactorización regularmente, el código se vuelve más limpio, modular y fácil de entender. Esto facilita el mantenimiento, actualizaciones y colaboración con el resto del equipo.


Mayor confianza en el código: Con el TDD, cada cambio realizado se valida mediante pruebas automatizadas. Esto brinda una mayor confianza en la estabilidad y funcionalidad del software, lo que permite una entrega más segura y frecuente.

Cómo escribir pruebas con la metodología TDD

Las pruebas en TDD, son las encargadas de garantizar que el código cumpla con los requisitos establecidos. Por ello es de vital importancia elaborar unos tests de software sólidos y confiables.


Aquí te mostramos unos sencillos pasos para escribir de forma efectiva utilizando la metodología TDD:

Ejemplo TDD: Conversor de divisas

  1. Identificar el requisito: Antes de comenzar a escribir un test, debes tener claro el comportamiento que deseas implementar. Esto te ayudará a enfocarte en un objetivo específico y evitar pruebas innecesarias.

Queremos validar con nuestra prueba la funcionalidad de conversión de monedas de USD a BTC.Necesitamos una clase CurrencyConverter que tenga un método convertUSDtoBTC().

  1. Escribir el test inicial: La primera prueba que escribirás es aquella que describe el comportamiento esperado pero que aún no ha sido implementado. Esta prueba debería fallar inicialmente, ya que aún no hay código que la haga pasar.

Comenzaremos por escribir el test para el conversor de monedas USD - BTC. Este podría ser un ejemplo utilizando un marco de pruebas como JUnit en Java:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class CurrencyConverterTest {

@Test
public void testConvertUSDtoBTC() {
CurrencyConverter converter = new CurrencyConverter();
double amountUSD = 100.0;
double expectedBTC = 0.01;
double actualBTC = converter.convertUSDtoBTC(amountUSD);
Assertions.assertEquals(expectedBTC, actualBTC, 0.0001);
}
}
  1. Ejecutar la prueba: Una vez que hayas escrito el test, debes ejecutarlo para verificar que efectivamente falla. Esto asegura que el test esté correctamente diseñado y que captura el comportamiento deseado.

  2. Escribir la cantidad mínima de código: Tu objetivo es sencillo, hacer que la prueba pase. La idea es escribir un código lo más simple posible, para conseguir superar el requisito establecido en el test.

Siguiendo con nuestro ejemplo:

public class CurrencyConverter {

public double convertUSDtoBTC(double amountUSD) {
return amountUSD * 0.0001; // Conversión básica para pasar la prueba
}
}
  1. Ejecutar la prueba y verificar el éxito: Una vez que hayas implementado el código, debes ejecutar el test nuevamente. Esta vez debería pasar correctamente, lo que indica que el código ha cumplido con el requisito.

  2. Refactorizar el código: Después de esto, es el momento de mejorar la estructura y diseño del código sin cambiar su comportamiento. La refactorización ayuda a eliminar duplicación, mejorar la legibilidad y garantizar una base sólida para futuros cambios.

public class CurrencyConverter {
private static final double USD_TO_BTC_RATE = 0.0001;

public double convertUSDtoBTC(double amountUSD) {
return amountUSD * USD_TO_BTC_RATE;
}
}

Esta refactorización proporciona una base sólida para futuros cambios, ya que si necesitamos modificar la tasa de conversión, solo necesitamos actualizar el valor de USD_TO_BTC_RATE en un solo lugar.


Recuerda que la refactorización no ha cambiado la funcionalidad existente, simplemente ha mejorado la calidad del código.


Por último deberemos repetir el proceso. Tras conseguir que tu código refactorizado pase la prueba, es momento de continuar. Identifica el siguiente requisito o comportamiento y escribe un nuevo test para él. Sigue iterando este ciclo hasta que hayas implementado todos los requisitos deseados.


Por último recuerda estos consejos para tus tests usando TDD:

  • En TDD tus pruebas deben ser específicas, cubrir diferentes casos y ser fáciles de entender.

  • Utiliza nombres descriptivos y asegúrate de que sean independientes entre sí, dado el gran número de pruebas en TDD

  • Recuerda que la base del TDD es que las pruebas deben ejecutarse de manera rápida y automatizada, para que facilite su integración en el flujo de desarrollo.

¿Qué herramientas se utilizan en el TDD?

Existen diversas herramientas y frameworks que pueden facilitar y agilizar el proceso de escritura y ejecución de pruebas automatizadas en TDD. Ten en cuenta que el uso de una u otra puede depender del lenguaje de programación utilizado


Aquí te dejamos algunas de las más populares:

JUnit:

Es un framework de pruebas unitarias para el lenguaje de programación en Java. Es ampliamente utilizado en su comunidad y ofrece una sintaxis sencilla para escribir pruebas unitarias. JUnit proporciona una serie de anotaciones y aserciones que permiten definir casos de prueba y verificar el comportamiento esperado del código.

NUnit:

Es una herramienta similar a JUnit, pero diseñada para el lenguaje de programación C#. Al igual que JUnit, proporciona un conjunto de atributos y aserciones para escribir pruebas unitarias. NUnit es muy utilizado en la comunidad de desarrollo de software .NET y se integra fácilmente con entornos de desarrollo como Visual Studio.

RSpec:

Framework de pruebas desarrollado para Ruby. Se basa en el lenguaje natural y utiliza una sintaxis legible para escribir especificaciones y casos de prueba. RSpec permite describir el comportamiento esperado del código de manera clara y concisa, lo que facilita la comprensión de las pruebas incluso para personas no técnicas.

PHPUnit:

Es el framework de pruebas unitarias estándar para PHP. Ofrece una amplia gama de funcionalidades para escribir y ejecutar pruebas unitarias en proyectos PHP. PHPUnit permite realizar aserciones, definir casos de prueba y generar informes detallados sobre el resultado de las pruebas.

TDD: ¿Quién, cómo, cuándo y dónde?

Cuando hablamos de TDD, el equipo de desarrollo es el verdadero protagonista en el diseño y ejecución de las pruebas. Son ellos quienes asumen la responsabilidad de garantizar la calidad y funcionalidad del código que están produciendo. Por ello es extremadamente importante hacer cursos de qa tester al equipo de desarrollo


Las pruebas, al ser extremadamente rápidas de ejecutar, pueden lanzarse en cualquier momento. Hablamos de un tiempo de ejecución que puede rondar apenas un segundo. Sin embargo, para aprovechar al máximo las ventajas del TDD, es fundamental establecer una ejecución automatizada de las pruebas.


La clave está en asegurarse de que se ejecuten justo después de la instalación del código en un entorno y, lo que es aún más importante, tras cada commit realizado. Esto garantiza que cualquier cambio o adición al código sea validado de inmediato. ¡Además sale gratis!


Es aquí donde entra en juego el servidor de integración continua. Ya sea Jenkins, Github, AzureDevops u otro similar, el servidor debe estar configurado con los triggers necesarios para que las pruebas se ejecuten en los momentos adecuados. La idea es que cada vez que se realice una instalación o se realice un commit en el repositorio, el servidor se encargue de ejecutar automáticamente las pruebas correspondientes. Puedes visitar a Redsauce en Google Maps y te ayudaremos a implementar TDD en tu equipo de desarrollo.

¿A qué esperas para empezar con TDD?

El Test Driven Development ofrece una forma efectiva y disciplinada de desarrollar software de calidad. Al escribir tests automatizados antes de implementar el código, se garantiza un mayor nivel de confianza en la estabilidad y funcionamiento del software.


Adoptar el TDD te permitirá detectar errores temprano, mejorar la estructura del código y entregar un producto confiable y de calidad.


Este y otros muchos consejos más están en nuestro ebook gratuito. Descárgalo ahora y evoluciona tu desarrollo:

image

Sobre nosotros

Has llegado al blog de Redsauce, un equipo de expertos en QA y desarrollo de software. Aquí hablaremos sobre testing ágil, automatización, programación, ciberseguridad… ¡Bienvenido!