Introducción al testing con unittest
El testing es una parte fundamental del desarrollo de software, ya que garantiza la fiabilidad y calidad del código. En el ecosistema de Python, el módulo unittest se presenta como la solución estándar para crear y ejecutar pruebas automatizadas.
UnitTest es una biblioteca integrada de Python, basada en la arquitectura xUnit, que ofrece a los desarrolladores un conjunto completo de herramientas para crear pruebas unitarias, verificar la lógica de negocio y controlar el funcionamiento de funciones y clases. Su principal ventaja es que forma parte de la biblioteca estándar de Python, por lo que no requiere instalaciones adicionales.
¿Qué es unittest y para qué sirve?
Unittest es un framework para escribir y ejecutar pruebas en Python que sigue los principios del desarrollo guiado por pruebas (TDD). Permite crear pruebas repetibles, aisladas y automatizadas que ayudan a:
- Detectar errores en etapas tempranas del desarrollo
- Garantizar la estabilidad del código durante refactorizaciones
- Documentar el comportamiento esperado de las funciones
- Aumentar la confianza en la calidad del producto final
Fundamentos de unittest
Estructura básica de una prueba
Para empezar a usar unittest, primero debes importar el módulo y crear una clase de prueba:
import unittest
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(2 + 3, 5)
def test_multiply(self):
self.assertEqual(4 * 5, 20)
if __name__ == '__main__':
unittest.main()
Principios clave de la estructura
Cada clase de prueba debe heredar de unittest.TestCase. Todos los métodos de prueba comienzan con el prefijo test_, lo que permite al framework detectarlos y ejecutarlos automáticamente. El método unittest.main() ejecuta todas las pruebas encontradas en el módulo actual.
Ciclo de vida de las pruebas y fixtures
Métodos de configuración y limpieza
Unittest proporciona métodos especiales para preparar y limpiar el entorno de pruebas:
class TestDatabase(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""Se ejecuta una vez antes de todas las pruebas de la clase"""
cls.db_connection = create_test_database()
@classmethod
def tearDownClass(cls):
"""Se ejecuta una vez después de todas las pruebas de la clase"""
cls.db_connection.close()
def setUp(self):
"""Se ejecuta antes de cada prueba"""
self.test_data = ["item1", "item2", "item3"]
def tearDown(self):
"""Se ejecuta después de cada prueba"""
self.test_data.clear()
Niveles de fixtures
Las fixtures en unittest funcionan en diferentes niveles:
setUp()ytearDown()- para cada prueba individualsetUpClass()ytearDownClass()- para toda la clase de pruebasetUpModule()ytearDownModule()- para todo el módulo
Métodos de aserción (Assertions)
Métodos de verificación principales
Unittest ofrece un amplio conjunto de métodos para diferentes tipos de comprobaciones:
| Método | Descripción | Ejemplo de uso |
|---|---|---|
assertEqual(a, b) |
Verifica que a y b sean iguales | self.assertEqual(2+2, 4) |
assertNotEqual(a, b) |
Verifica que a y b no sean iguales | self.assertNotEqual(2+2, 5) |
assertTrue(x) |
Verifica que x sea verdadero | self.assertTrue(5 > 3) |
assertFalse(x) |
Verifica que x sea falso | self.assertFalse(5 < 3) |