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.
- 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.
- 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.
- Escriure Proves Unitàries amb DUnitX
Instal·lació de DUnitX
- Descarregar DUnitX: Pots descarregar DUnitX des del seu repositori oficial a GitHub.
- 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.
- 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:
- Escriure una Prova: Crear una prova que falli perquè la funcionalitat encara no està implementada.
- Escriure el Codi: Escriure el codi mínim necessari per passar la prova.
- 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
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;
- 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ó.
- 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;
- 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
- Introducció a Delphi i Object Pascal
- Configuració de l'Entorn de Desenvolupament
- Primera Aplicació Delphi
- Sintaxi i Estructura Bàsiques
- Variables i Tipus de Dades
Mòdul 2: Estructures de Control i Procediments
- Declaracions Condicionals
- Bucles i Iteració
- Procediments i Funcions
- Abast i Durada de les Variables
- Gestió d'Errors i Depuració
Mòdul 3: Treballant amb Dades
- Arrays i Cadenes
- Registres i Conjunts
- Tipus Enumerats i Subrang
- Gestió d'Arxius
- Accés a Bases de Dades
Mòdul 4: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Herència i Polimorfisme
- Interfícies i Classes Abstractes
- Gestió d'Excepcions en POO
Mòdul 5: Funcions Avançades de Delphi
- Generics i Col·leccions
- Multifil i Programació Paral·lela
- Desenvolupament Basat en Components
- Biblioteca d'Execució de Delphi (RTL)
- Tècniques Avançades de Depuració
Mòdul 6: Desenvolupament d'Interfícies Gràfiques amb VCL i FMX
- Introducció a VCL
- Creació de Formularis i Controls
- Programació Basada en Esdeveniments
- Introducció a FireMonkey (FMX)
- Desenvolupament Multiplataforma amb FMX
Mòdul 7: Desenvolupament Web i Mòbil
- Desenvolupament Web amb Delphi
- Serveis RESTful
- Desenvolupament Mòbil amb Delphi
- Desplegament d'Aplicacions Mòbils
- Integració amb Serveis Web
Mòdul 8: Millors Pràctiques i Patrons de Disseny
- Organització del Codi i Documentació
- Patrons de Disseny en Delphi
- Tècniques de Refactorització
- Proves Unitàries i Desenvolupament Basat en Proves
- Optimització del Rendiment