El Desenvolupament Guiat per Proves (TDD, per les seves sigles en anglès) és una metodologia de desenvolupament de programari que es basa en escriure primer les proves abans de desenvolupar el codi funcional. Aquesta tècnica ajuda a assegurar que el codi compleix els requisits especificats i facilita la detecció d'errors des de les primeres etapes del desenvolupament.
Objectius del TDD
- Millorar la qualitat del codi: Escriure proves abans del codi funcional ajuda a identificar errors i problemes de disseny des del principi.
- Facilitar el manteniment: Les proves automatitzades permeten fer canvis en el codi amb confiança, ja que es poden executar per verificar que tot segueix funcionant correctament.
- Documentació viva: Les proves serveixen com a documentació del comportament esperat del codi.
Procés del TDD
El procés del TDD es pot resumir en tres passos principals, coneguts com a cicle "Red-Green-Refactor":
- Red: Escriure una prova que falli.
- Green: Escriure el codi mínim necessari per passar la prova.
- Refactor: Refactoritzar el codi per millorar-ne l'estructura i la qualitat, assegurant-se que les proves continuïn passant.
Exemple Pràctic
Suposem que volem implementar una funció sumar(a, b)
que sumi dos nombres. Seguint el procés TDD, primer escriurem una prova per aquesta funció.
Pas 1: Escriure una Prova que Falli
import unittest class TestSumar(unittest.TestCase): def test_sumar(self): self.assertEqual(sumar(2, 3), 5) if __name__ == '__main__': unittest.main()
En aquest punt, si executem la prova, fallarà perquè la funció sumar
encara no està definida.
Pas 2: Escriure el Codi Mínim per Passar la Prova
Ara definim la funció sumar
perquè la prova passi.
Si tornem a executar la prova, aquesta hauria de passar.
Pas 3: Refactoritzar
En aquest cas, el codi és prou senzill i no necessita refactorització. Però en projectes més complexos, aquest pas és crucial per mantenir el codi net i mantenible.
Exercicis Pràctics
Exercici 1: Implementar una Funció de Resta
- Escriu una prova per una funció
restar(a, b)
que resti dos nombres. - Implementa la funció
restar
perquè passi la prova. - Refactoritza el codi si és necessari.
Solució
import unittest class TestRestar(unittest.TestCase): def test_restar(self): self.assertEqual(restar(5, 3), 2) def restar(a, b): return a - b if __name__ == '__main__': unittest.main()
Exercici 2: Implementar una Funció de Multiplicació
- Escriu una prova per una funció
multiplicar(a, b)
que multipliqui dos nombres. - Implementa la funció
multiplicar
perquè passi la prova. - Refactoritza el codi si és necessari.
Solució
import unittest class TestMultiplicar(unittest.TestCase): def test_multiplicar(self): self.assertEqual(multiplicar(2, 3), 6) def multiplicar(a, b): return a * b if __name__ == '__main__': unittest.main()
Errors Comuns i Consells
- No escriure proves suficients: És important cobrir tots els casos possibles, incloent-hi els casos límit i els errors esperats.
- Refactoritzar sense proves: Sempre assegura't que les proves passen abans i després de refactoritzar el codi.
- Proves massa complexes: Les proves han de ser simples i fàcils de comprendre. Si una prova és massa complexa, pot ser un senyal que el codi funcional també necessita simplificació.
Conclusió
El Desenvolupament Guiat per Proves és una metodologia poderosa que ajuda a millorar la qualitat del codi i facilita el manteniment del programari. Seguint el cicle "Red-Green-Refactor", els desenvolupadors poden assegurar-se que el seu codi compleix els requisits especificats i és fàcil de mantenir. Practicar TDD requereix disciplina, però els beneficis a llarg termini són significatius.
Curs de Programació en Python
Mòdul 1: Introducció a Python
- Introducció a Python
- Configuració de l'Entorn de Desenvolupament
- Sintaxi de Python i Tipus de Dades Bàsics
- Variables i Constants
- Entrada i Sortida Bàsiques
Mòdul 2: Estructures de Control
Mòdul 3: Funcions i Mòduls
- Definició de Funcions
- Arguments de Funció
- Funcions Lambda
- Mòduls i Paquets
- Visió General de la Biblioteca Estàndard
Mòdul 4: Estructures de Dades
Mòdul 5: Programació Orientada a Objectes
Mòdul 6: Gestió de Fitxers
- Lectura i Escriptura de Fitxers
- Treballant amb Fitxers CSV
- Gestió de Dades JSON
- Operacions amb Fitxers i Directoris
Mòdul 7: Gestió d'Errors i Excepcions
Mòdul 8: Temes Avançats
- Decoradors
- Generadors
- Gestors de Context
- Concurrència: Fils i Processos
- Asyncio per a Programació Asíncrona
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb unittest
- Desenvolupament Guiat per Proves
- Tècniques de Depuració
- Ús de pdb per a la Depuració
Mòdul 10: Desenvolupament Web amb Python
- Introducció al Desenvolupament Web
- Conceptes Bàsics del Framework Flask
- Construcció d'APIs REST amb Flask
- Introducció a Django
- Construcció d'Aplicacions Web amb Django
Mòdul 11: Ciència de Dades amb Python
- Introducció a la Ciència de Dades
- NumPy per al Càlcul Numèric
- Pandas per a la Manipulació de Dades
- Matplotlib per a la Visualització de Dades
- Introducció al Machine Learning amb scikit-learn