En aquest tema, explorarem les proves unitàries i el desenvolupament basat en proves (TDD) en Delphi/Object Pascal. Les proves unitàries són una tècnica fonamental per assegurar la qualitat del codi, mentre que el TDD és una metodologia que integra les proves en el procés de desenvolupament.

  1. Introducció a les Proves Unitàries

Què són les Proves Unitàries?

Les proves unitàries són tests automàtics que verifiquen el funcionament correcte de petites unitats de codi, com ara funcions o mètodes. L'objectiu és assegurar que cada unitat funcioni correctament de manera aïllada.

Beneficis de les Proves Unitàries

  • Detecció Primerenca d'Errors: Identifiquen errors en fases inicials del desenvolupament.
  • Facilitat de Refactorització: Permeten canviar el codi amb confiança, sabent que els tests validaran els canvis.
  • Documentació del Codi: Els tests serveixen com a documentació viva del comportament esperat del codi.

  1. Eines per a Proves Unitàries en Delphi

DUnit

DUnit és una de les biblioteques més populars per a proves unitàries en Delphi. Proporciona una estructura per escriure i executar tests.

DUnitX

DUnitX és una versió més moderna i avançada de DUnit, amb suport per a noves funcionalitats i millores en la usabilitat.

  1. Escriure Proves Unitàries amb DUnitX

Instal·lació de DUnitX

  1. Descarregar DUnitX: Pots descarregar DUnitX des del seu repositori oficial a GitHub.
  2. Afegir a Delphi: Afegeix les unitats de DUnitX al teu projecte Delphi.

Exemple de Prova Unitària

unit MyUnitTests;

interface

uses
  DUnitX.TestFramework;

type
  [TestFixture]
  TMyUnitTests = class(TObject)
  public
    [Test]
    procedure TestAddition;
  end;

implementation

procedure TMyUnitTests.TestAddition;
var
  a, b, result: Integer;
begin
  a := 2;
  b := 3;
  result := a + b;
  Assert.AreEqual(5, result, 'La suma de 2 i 3 ha de ser 5');
end;

initialization
  TDUnitX.RegisterTestFixture(TMyUnitTests);

end.

Explicació del Codi

  • [TestFixture]: Indica que la classe conté proves.
  • [Test]: Marca un mètode com a prova.
  • Assert.AreEqual: Comprova que el resultat esperat és igual al resultat obtingut.

  1. Desenvolupament Basat en Proves (TDD)

Què és el TDD?

El TDD és una metodologia de desenvolupament on les proves es creen abans del codi funcional. El procés típic de TDD segueix aquests passos:

  1. Escriure una Prova: Crear una prova que falli perquè la funcionalitat encara no està implementada.
  2. Escriure el Codi: Escriure el codi mínim necessari per passar la prova.
  3. Refactoritzar: Millorar el codi mantenint les proves passant.

Beneficis del TDD

  • Codi més Net i Modular: El TDD fomenta la creació de codi més net i fàcil de mantenir.
  • Menys Errors: Redueix la quantitat d'errors en el codi final.
  • Millor Disseny: Ajuda a pensar en el disseny del codi abans d'implementar-lo.

Exemple de TDD

Pas 1: Escriure una Prova que Falli

procedure TMyUnitTests.TestSubtraction;
var
  a, b, result: Integer;
begin
  a := 5;
  b := 3;
  result := a - b;
  Assert.AreEqual(2, result, 'La resta de 5 i 3 ha de ser 2');
end;

Pas 2: Escriure el Codi per Passar la Prova

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

Pas 3: Refactoritzar

procedure TMyUnitTests.TestSubtraction;
var
  result: Integer;
begin
  result := Subtract(5, 3);
  Assert.AreEqual(2, result, 'La resta de 5 i 3 ha de ser 2');
end;

  1. Exercicis Pràctics

Exercici 1: Escriure una Prova Unitària

Escriu una prova unitària per a una funció que multiplica dos nombres.

Exercici 2: Implementar TDD

Utilitza TDD per implementar una funció que divideix dos nombres i comprova que la divisió per zero genera una excepció.

  1. Solucions als Exercicis

Solució a l'Exercici 1

procedure TMyUnitTests.TestMultiplication;
var
  a, b, result: Integer;
begin
  a := 4;
  b := 5;
  result := a * b;
  Assert.AreEqual(20, result, 'La multiplicació de 4 i 5 ha de ser 20');
end;

Solució a l'Exercici 2

Pas 1: Escriure una Prova que Falli

procedure TMyUnitTests.TestDivision;
var
  result: Double;
begin
  result := Divide(10, 2);
  Assert.AreEqual(5.0, result, 'La divisió de 10 per 2 ha de ser 5');
end;

procedure TMyUnitTests.TestDivisionByZero;
begin
  Assert.WillRaise(
    procedure
    begin
      Divide(10, 0);
    end,
    EDivByZero,
    'La divisió per zero ha de generar una excepció'
  );
end;

Pas 2: Escriure el Codi per Passar la Prova

function Divide(a, b: Double): Double;
begin
  if b = 0 then
    raise EDivByZero.Create('Divisió per zero');
  Result := a / b;
end;

Pas 3: Refactoritzar

procedure TMyUnitTests.TestDivision;
var
  result: Double;
begin
  result := Divide(10, 2);
  Assert.AreEqual(5.0, result, 'La divisió de 10 per 2 ha de ser 5');
end;

procedure TMyUnitTests.TestDivisionByZero;
begin
  Assert.WillRaise(
    procedure
    begin
      Divide(10, 0);
    end,
    EDivByZero,
    'La divisió per zero ha de generar una excepció'
  );
end;

  1. Resum

En aquesta secció, hem après sobre les proves unitàries i el desenvolupament basat en proves (TDD) en Delphi/Object Pascal. Hem explorat com utilitzar DUnitX per escriure proves unitàries i com aplicar la metodologia TDD per desenvolupar codi de qualitat. Les proves unitàries i el TDD són eines poderoses que ajuden a assegurar la robustesa i mantenibilitat del codi.

Curs de Programació Delphi/Object Pascal

Mòdul 1: Introducció a Delphi/Object Pascal

Mòdul 2: Estructures de Control i Procediments

Mòdul 3: Treballant amb Dades

Mòdul 4: Programació Orientada a Objectes

Mòdul 5: Funcions Avançades de Delphi

Mòdul 6: Desenvolupament d'Interfícies Gràfiques amb VCL i FMX

Mòdul 7: Desenvolupament Web i Mòbil

Mòdul 8: Millors Pràctiques i Patrons de Disseny

Mòdul 9: Projecte Final

© Copyright 2024. Tots els drets reservats