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:
- Importa el mòdul unittest.
- Crea una classe de prova que hereti de
unittest.TestCase
. - 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òdulunittest
. - Funció a provar:
suma(a, b)
és la funció que volem provar. - Classe de prova:
TestSuma
hereta deunittest.TestCase
. - Mètodes de prova:
test_suma_positius
itest_suma_negatius
són mètodes de prova que utilitzenself.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
- 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