Les proves unitàries són un component fonamental en el procés de desenvolupament de programari, ja que permeten verificar que cada unitat de codi funcioni correctament de manera independent. Aquest mòdul t'introduirà als conceptes bàsics de les proves unitàries, les seves millors pràctiques i com implementar-les efectivament.

Què són les Proves Unitàries?

Les proves unitàries són proves automatitzades que verifiquen el funcionament correcte d'una unitat de codi, com ara una funció o un mètode. Aquestes proves es realitzen per assegurar que cada part del codi compleixi amb les especificacions i funcioni com s'espera.

Objectius de les Proves Unitàries:

  • Verificació de Funcionalitat: Assegurar que cada unitat de codi compleixi amb els requisits funcionals.
  • Detecció Primerenca d'Errors: Identificar errors en fases inicials del desenvolupament, reduint el cost de correcció.
  • Facilitat de Manteniment: Proporcionar una base per a la refactorització segura del codi.
  • Documentació del Codi: Servir com a documentació viva que descriu el comportament esperat del codi.

Millors Pràctiques per a les Proves Unitàries

  1. Provar una Cosa a la Vez: Cada prova unitària ha de centrar-se en una única funcionalitat o cas d'ús.
  2. Independència de les Proves: Les proves han de ser independents entre si, de manera que el resultat d'una no afecti les altres.
  3. Execució Ràpida: Les proves unitàries han de ser ràpides d'executar per facilitar la seva execució freqüent.
  4. Nomenclatura Clara: Utilitzar noms descriptius per a les proves que indiquin clarament què estan provant.
  5. Cobertura de Codi: Assegurar una alta cobertura de codi, però sense obsessionar-se amb el 100%.

Exemple Pràctic

A continuació, es mostra un exemple de prova unitària utilitzant el llenguatge Python i el framework unittest.

Codi a Provar

def suma(a, b):
    return a + b

Prova Unitària

import unittest

class TestSuma(unittest.TestCase):
    
    def test_suma_positius(self):
        self.assertEqual(suma(1, 2), 3)
    
    def test_suma_negatius(self):
        self.assertEqual(suma(-1, -1), -2)
    
    def test_suma_zero(self):
        self.assertEqual(suma(0, 0), 0)

if __name__ == '__main__':
    unittest.main()

Explicació del Codi

  • unittest: És un framework de proves integrat en Python que proporciona eines per crear i executar proves unitàries.
  • TestSuma: És una classe que hereta de unittest.TestCase i conté els mètodes de prova.
  • test_suma_positius: Prova la funció suma amb nombres positius.
  • test_suma_negatius: Prova la funció suma amb nombres negatius.
  • test_suma_zero: Prova la funció suma amb zeros.
  • assertEqual: Comprova que el resultat de la funció suma sigui igual al valor esperat.

Exercicis Pràctics

  1. Exercici 1: Escriu una funció multiplica(a, b) i crea proves unitàries per verificar el seu funcionament amb nombres positius, negatius i zero.

  2. Exercici 2: Refactoritza la funció suma per manejar excepcions quan els arguments no siguin números i escriu proves unitàries per verificar aquest comportament.

Solucions

Solució Exercici 1

def multiplica(a, b):
    return a * b

class TestMultiplica(unittest.TestCase):
    
    def test_multiplica_positius(self):
        self.assertEqual(multiplica(2, 3), 6)
    
    def test_multiplica_negatius(self):
        self.assertEqual(multiplica(-2, -3), 6)
    
    def test_multiplica_zero(self):
        self.assertEqual(multiplica(0, 5), 0)

if __name__ == '__main__':
    unittest.main()

Solució Exercici 2

def suma(a, b):
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        raise ValueError("Els arguments han de ser números")
    return a + b

class TestSuma(unittest.TestCase):
    
    def test_suma_positius(self):
        self.assertEqual(suma(1, 2), 3)
    
    def test_suma_negatius(self):
        self.assertEqual(suma(-1, -1), -2)
    
    def test_suma_zero(self):
        self.assertEqual(suma(0, 0), 0)
    
    def test_suma_excepcio(self):
        with self.assertRaises(ValueError):
            suma("a", 1)

if __name__ == '__main__':
    unittest.main()

Conclusió

Les proves unitàries són essencials per garantir la qualitat del codi i facilitar el manteniment i l'evolució del programari. Implementar proves unitàries de manera efectiva pot ajudar a detectar errors en fases primerenques i assegurar que el codi compleixi amb els requisits funcionals. En el següent tema, explorarem les proves d'integració, que ens permetran verificar la interacció entre diferents unitats de codi.

Qualitat del Programari i Millors Pràctiques

Mòdul 1: Introducció a la Qualitat del Programari

Mòdul 2: Fonaments de les Proves de Programari

Mòdul 3: Qualitat del Codi i Millors Pràctiques

Mòdul 4: Proves Automatitzades

Mòdul 5: Tècniques Avançades de Proves

Mòdul 6: Processos d'Assegurament de la Qualitat

Mòdul 7: Millors Pràctiques en el Desenvolupament de Programari

Mòdul 8: Estudis de Cas i Aplicacions del Món Real

© Copyright 2024. Tots els drets reservats