Les proves unitàries són una part fonamental del desenvolupament de programari, ja que permeten verificar que les diferents parts del codi funcionen correctament de manera independent. En Python, el mòdul unittest proporciona una infraestructura robusta per crear i executar proves unitàries.

Continguts

Introducció a unittest

El mòdul unittest és una biblioteca estàndard de Python que proporciona eines per crear i executar proves unitàries. Aquest mòdul està inspirat en el framework de proves JUnit per a Java i és compatible amb altres frameworks de proves unitàries.

Característiques Principals

  • Organització de proves en classes: Les proves es poden organitzar en classes que hereten de unittest.TestCase.
  • Mètodes d'assert: Proporciona una varietat de mètodes per verificar condicions.
  • Configuració i desconfiguració: Permet definir mètodes que s'executen abans i després de cada prova.

Creació d'una Prova Unitària

Per crear una prova unitària, segueix aquests passos:

  1. Importa el mòdul unittest.
  2. Crea una classe de prova que hereti de unittest.TestCase.
  3. Defineix mètodes de prova dins de la classe. Els noms dels mètodes de prova han de començar amb test.

Exemple

import unittest

def suma(a, b):
    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)

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

Explicació del Codi

  • Importació: import unittest importa el mòdul unittest.
  • Funció a provar: suma(a, b) és la funció que volem provar.
  • Classe de prova: TestSuma hereta de unittest.TestCase.
  • Mètodes de prova: test_suma_positius i test_suma_negatius són mètodes de prova que utilitzen self.assertEqual per verificar que la funció suma retorna els resultats esperats.

Execució de Proves

Les proves es poden executar de diverses maneres:

  • Directament des del fitxer: Si el fitxer de prova es pot executar com a script, unittest.main() s'encarregarà d'executar totes les proves.
  • Utilitzant la línia de comandes: Pots executar les proves amb python -m unittest nom_del_fitxer.py.
  • Integració amb IDEs: Molts entorns de desenvolupament integrats (IDEs) com PyCharm o Visual Studio Code tenen suport integrat per executar proves unitàries.

Assert Methods

unittest proporciona una varietat de mètodes d'assert per verificar diferents condicions:

Mètode Descripció
assertEqual(a, b) Verifica que a és igual a b.
assertNotEqual(a, b) Verifica que a no és igual a b.
assertTrue(x) Verifica que x és True.
assertFalse(x) Verifica que x és False.
assertIs(a, b) Verifica que a és b (identitat).
assertIsNot(a, b) Verifica que a no és b (identitat).
assertIsNone(x) Verifica que x és None.
assertIsNotNone(x) Verifica que x no és None.
assertIn(a, b) Verifica que a està en b.
assertNotIn(a, b) Verifica que a no està en b.
assertIsInstance(a, b) Verifica que a és instància de b.
assertNotIsInstance(a, b) Verifica que a no és instància de b.

Exemple d'ús

def es_parell(num):
    return num % 2 == 0

class TestEsParell(unittest.TestCase):

    def test_parell(self):
        self.assertTrue(es_parell(4))

    def test_imparell(self):
        self.assertFalse(es_parell(5))

Configuració i Desconfiguració

unittest permet definir mètodes que s'executen abans i després de cada prova, així com abans i després de totes les proves de la classe.

Mètodes Principals

  • setUp: S'executa abans de cada prova.
  • tearDown: S'executa després de cada prova.
  • setUpClass: S'executa una vegada abans de totes les proves de la classe.
  • tearDownClass: S'executa una vegada després de totes les proves de la classe.

Exemple

class TestAmbConfiguracio(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        print("Configuració inicial de la classe")

    @classmethod
    def tearDownClass(cls):
        print("Desconfiguració final de la classe")

    def setUp(self):
        print("Configuració abans de cada prova")

    def tearDown(self):
        print("Desconfiguració després de cada prova")

    def test_exemple(self):
        self.assertTrue(True)

Exercicis Pràctics

Exercici 1: Provar una Funció de Multiplicació

Crea una funció multiplica(a, b) i escriu proves unitàries per verificar que la funció funciona correctament amb nombres positius, negatius i zero.

Solució

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)

Exercici 2: Provar una Funció de Divisió

Crea una funció divideix(a, b) que retorni la divisió de a per b. Escriu proves unitàries per verificar que la funció funciona correctament i gestiona l'error de divisió per zero.

Solució

def divideix(a, b):
    if b == 0:
        raise ValueError("No es pot dividir per zero")
    return a / b

class TestDivideix(unittest.TestCase):

    def test_divideix_positius(self):
        self.assertEqual(divideix(10, 2), 5)

    def test_divideix_negatius(self):
        self.assertEqual(divideix(-10, -2), 5)

    def test_divideix_zero(self):
        with self.assertRaises(ValueError):
            divideix(10, 0)

Conclusió

Les proves unitàries són una eina essencial per garantir la qualitat del codi. El mòdul unittest de Python proporciona una infraestructura completa per crear i executar proves unitàries de manera eficient. Amb les eines i els conceptes presentats en aquesta secció, estaràs preparat per començar a escriure les teves pròpies proves unitàries i assegurar-te que el teu codi funcioni correctament en tot moment.

Curs de Programació en Python

Mòdul 1: Introducció a Python

Mòdul 2: Estructures de Control

Mòdul 3: Funcions i Mòduls

Mòdul 4: Estructures de Dades

Mòdul 5: Programació Orientada a Objectes

Mòdul 6: Gestió de Fitxers

Mòdul 7: Gestió d'Errors i Excepcions

Mòdul 8: Temes Avançats

Mòdul 9: Proves i Depuració

Mòdul 10: Desenvolupament Web amb Python

Mòdul 11: Ciència de Dades amb Python

Mòdul 12: Projecte Final

© Copyright 2024. Tots els drets reservats