Introducción

Las pruebas unitarias y el desarrollo basado en pruebas (TDD, por sus siglas en inglés) son prácticas esenciales en el desarrollo de software moderno. Estas técnicas no solo ayudan a garantizar que el código funcione correctamente, sino que también mejoran la calidad del software y facilitan el mantenimiento a largo plazo.

Objetivos de esta sección:

  1. Comprender qué son las pruebas unitarias y su importancia.
  2. Aprender a escribir pruebas unitarias en Delphi.
  3. Introducir el concepto de Desarrollo Basado en Pruebas (TDD).
  4. Implementar TDD en proyectos de Delphi.

¿Qué son las Pruebas Unitarias?

Las pruebas unitarias son pruebas automatizadas que verifican el comportamiento de una pequeña parte del código, típicamente una función o un procedimiento. El objetivo es asegurarse de que cada unidad de código funcione correctamente de manera aislada.

Beneficios de las Pruebas Unitarias:

  • Detección temprana de errores: Permiten identificar problemas en el código de manera temprana.
  • Facilitan el refactorizado: Al tener pruebas que verifican el comportamiento del código, es más seguro realizar cambios.
  • Documentación viva: Las pruebas unitarias actúan como una forma de documentación que describe cómo debería comportarse el código.

Escribiendo Pruebas Unitarias en Delphi

En Delphi, las pruebas unitarias se pueden escribir utilizando el framework DUnit, que es una adaptación del popular framework JUnit para Java.

Configuración de DUnit

  1. Instalación de DUnit:

    • DUnit viene incluido con Delphi, por lo que no es necesario instalarlo por separado.
  2. Creación de un Proyecto de Pruebas:

    • En Delphi, crea un nuevo proyecto de tipo "DUnit Test Project".

Ejemplo Práctico

Supongamos que tenemos una función que suma dos números:

unit MathUtils;

interface

function Add(a, b: Integer): Integer;

implementation

function Add(a, b: Integer): Integer;
begin
  Result := a + b;
end;

end.

Ahora, escribiremos una prueba unitaria para esta función.

  1. Crear el Módulo de Pruebas:
unit TestMathUtils;

interface

uses
  TestFramework, MathUtils;

type
  TestTMathUtils = class(TTestCase)
  published
    procedure TestAdd;
  end;

implementation

procedure TestTMathUtils.TestAdd;
begin
  CheckEquals(5, Add(2, 3), '2 + 3 should equal 5');
  CheckEquals(0, Add(-1, 1), '-1 + 1 should equal 0');
  CheckEquals(-3, Add(-1, -2), '-1 + -2 should equal -3');
end;

initialization
  RegisterTest(TestTMathUtils.Suite);

end.
  1. Ejecutar las Pruebas:
    • Compila y ejecuta el proyecto de pruebas. Deberías ver un informe indicando si las pruebas pasaron o fallaron.

Desarrollo Basado en Pruebas (TDD)

El Desarrollo Basado en Pruebas es una metodología de desarrollo en la que las pruebas se escriben antes del código de producción. El ciclo de TDD se puede resumir en tres pasos:

  1. Escribir una prueba que falle: Define una prueba para una nueva funcionalidad que aún no está implementada.
  2. Escribir el código mínimo para pasar la prueba: Implementa la funcionalidad de manera que la prueba pase.
  3. Refactorizar el código: Mejora el código manteniendo todas las pruebas pasando.

Ejemplo de TDD

Supongamos que queremos implementar una función que multiplique dos números.

  1. Escribir una prueba que falle:
procedure TestTMathUtils.TestMultiply;
begin
  CheckEquals(6, Multiply(2, 3), '2 * 3 should equal 6');
  CheckEquals(0, Multiply(0, 5), '0 * 5 should equal 0');
  CheckEquals(-6, Multiply(-2, 3), '-2 * 3 should equal -6');
end;
  1. Escribir el código mínimo para pasar la prueba:
function Multiply(a, b: Integer): Integer;
begin
  Result := a * b;
end;
  1. Refactorizar el código:
    • En este caso, el código es simple y no requiere refactorización adicional.

Ejercicios Prácticos

Ejercicio 1: Pruebas Unitarias Básicas

  1. Descripción:

    • Escribe una función Subtract que reste dos números y crea pruebas unitarias para verificar su correcto funcionamiento.
  2. Solución:

unit MathUtils;

interface

function Subtract(a, b: Integer): Integer;

implementation

function Subtract(a, b: Integer): Integer;
begin
  Result := a - b;
end;

end.
unit TestMathUtils;

interface

uses
  TestFramework, MathUtils;

type
  TestTMathUtils = class(TTestCase)
  published
    procedure TestSubtract;
  end;

implementation

procedure TestTMathUtils.TestSubtract;
begin
  CheckEquals(1, Subtract(3, 2), '3 - 2 should equal 1');
  CheckEquals(-1, Subtract(2, 3), '2 - 3 should equal -1');
  CheckEquals(0, Subtract(5, 5), '5 - 5 should equal 0');
end;

initialization
  RegisterTest(TestTMathUtils.Suite);

end.

Ejercicio 2: Implementación de TDD

  1. Descripción:

    • Implementa una función Divide que divida dos números y utiliza TDD para su desarrollo.
  2. Solución:

procedure TestTMathUtils.TestDivide;
begin
  CheckEquals(2, Divide(6, 3), '6 / 3 should equal 2');
  CheckEquals(0, Divide(0, 5), '0 / 5 should equal 0');
  CheckEquals(-2, Divide(-6, 3), '-6 / 3 should equal -2');
end;
function Divide(a, b: Integer): Integer;
begin
  if b = 0 then
    raise Exception.Create('Division by zero');
  Result := a div b;
end;

Conclusión

En esta sección, hemos aprendido sobre la importancia de las pruebas unitarias y cómo escribirlas en Delphi utilizando DUnit. También hemos introducido el concepto de Desarrollo Basado en Pruebas (TDD) y cómo implementarlo en nuestros proyectos. Estas prácticas son fundamentales para mejorar la calidad del software y facilitar su mantenimiento a largo plazo.

Próximos Pasos:

  • Practica escribiendo más pruebas unitarias para diferentes funciones y procedimientos.
  • Intenta aplicar TDD en un pequeño proyecto para familiarizarte con el ciclo de desarrollo.
  • Explora herramientas adicionales de pruebas y automatización para mejorar aún más tu flujo de trabajo.

Curso de Programación en Delphi/Object Pascal

Módulo 1: Introducción a Delphi/Object Pascal

Módulo 2: Estructuras de Control y Procedimientos

Módulo 3: Trabajando con Datos

Módulo 4: Programación Orientada a Objetos

Módulo 5: Características Avanzadas de Delphi

Módulo 6: Desarrollo de GUI con VCL y FMX

Módulo 7: Desarrollo Web y Móvil

Módulo 8: Mejores Prácticas y Patrones de Diseño

Módulo 9: Proyecto Final

© Copyright 2024. Todos los derechos reservados