Las pruebas unitarias son una parte fundamental del desarrollo de software, ya que permiten verificar que las unidades individuales de código (por ejemplo, funciones o métodos) funcionan como se espera. En Python, el módulo unittest proporciona un marco de trabajo robusto para escribir y ejecutar pruebas unitarias.
Contenido
- Introducción a unittest
- Creación de Pruebas Unitarias
- Ejecución de Pruebas
- Asserts Comunes
- Organización de Pruebas
- Ejercicios Prácticos
- Introducción a unittest
El módulo unittest es parte de la biblioteca estándar de Python y se inspira en el marco de trabajo JUnit de Java. Proporciona una manera estructurada de escribir pruebas, agruparlas y ejecutarlas.
Para usar unittest, primero debes importarlo:
- Creación de Pruebas Unitarias
Para crear una prueba unitaria, debes seguir estos pasos:
- Crear una clase que herede de unittest.TestCase.
- Definir métodos dentro de esta clase que comiencen con test_.
Ejemplo Básico
import unittest
def suma(a, b):
    return a + b
class TestSuma(unittest.TestCase):
    
    def test_suma_positivos(self):
        self.assertEqual(suma(1, 2), 3)
    
    def test_suma_negativos(self):
        self.assertEqual(suma(-1, -1), -2)
    
    def test_suma_positivo_negativo(self):
        self.assertEqual(suma(1, -1), 0)
if __name__ == '__main__':
    unittest.main()Explicación del Código
- Definición de la Función: La función sumatoma dos argumentos y devuelve su suma.
- Clase de Prueba: TestSumahereda deunittest.TestCase.
- Métodos de Prueba: Cada método de prueba comienza con test_y usaself.assertEqualpara verificar que la salida de la funciónsumaes la esperada.
- Ejecución de Pruebas
Para ejecutar las pruebas, simplemente ejecuta el script de Python. Si todas las pruebas pasan, verás una salida similar a esta:
Si alguna prueba falla, unittest proporcionará un informe detallado de la falla.
- Asserts Comunes
unittest proporciona varios métodos de aserción para verificar diferentes condiciones:
| Método | Descripción | 
|---|---|
| assertEqual(a, b) | Verifica que aes igual ab. | 
| assertNotEqual(a, b) | Verifica que ano es igual ab. | 
| assertTrue(x) | Verifica que xesTrue. | 
| assertFalse(x) | Verifica que xesFalse. | 
| assertIs(a, b) | Verifica que aesb(mismo objeto). | 
| assertIsNot(a, b) | Verifica que ano esb(diferente objeto). | 
| assertIsNone(x) | Verifica que xesNone. | 
| assertIsNotNone(x) | Verifica que xno esNone. | 
| assertIn(a, b) | Verifica que aestá enb. | 
| assertNotIn(a, b) | Verifica que ano está enb. | 
| assertIsInstance(a, b) | Verifica que aes instancia deb. | 
| assertRaises(exc, fun) | Verifica que funlanza la excepciónexc. | 
- Organización de Pruebas
Para mantener el código limpio y organizado, es una buena práctica estructurar las pruebas en módulos y paquetes. Por ejemplo:
En test_my_module.py, puedes importar el módulo que deseas probar y definir tus clases de prueba.
- Ejercicios Prácticos
Ejercicio 1: Prueba de una Función de Multiplicación
Escribe una función multiplica(a, b) que devuelva el producto de a y b. Luego, escribe una clase de prueba para verificar su funcionamiento.
# Implementación de la función
def multiplica(a, b):
    return a * b
# Clase de prueba
class TestMultiplica(unittest.TestCase):
    
    def test_multiplica_positivos(self):
        self.assertEqual(multiplica(2, 3), 6)
    
    def test_multiplica_negativos(self):
        self.assertEqual(multiplica(-2, -3), 6)
    
    def test_multiplica_positivo_negativo(self):
        self.assertEqual(multiplica(2, -3), -6)
    
    def test_multiplica_por_cero(self):
        self.assertEqual(multiplica(2, 0), 0)
if __name__ == '__main__':
    unittest.main()Ejercicio 2: Prueba de una Función de División
Escribe una función divide(a, b) que devuelva el cociente de a y b. Asegúrate de manejar la división por cero lanzando una excepción ZeroDivisionError. Luego, escribe una clase de prueba para verificar su funcionamiento.
# Implementación de la función
def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("División por cero no permitida")
    return a / b
# Clase de prueba
class TestDivide(unittest.TestCase):
    
    def test_divide_positivos(self):
        self.assertEqual(divide(6, 3), 2)
    
    def test_divide_negativos(self):
        self.assertEqual(divide(-6, -3), 2)
    
    def test_divide_positivo_negativo(self):
        self.assertEqual(divide(6, -3), -2)
    
    def test_divide_por_cero(self):
        with self.assertRaises(ZeroDivisionError):
            divide(6, 0)
if __name__ == '__main__':
    unittest.main()Conclusión
En esta sección, hemos aprendido cómo usar el módulo unittest para escribir y ejecutar pruebas unitarias en Python. Hemos cubierto los conceptos básicos, desde la creación de pruebas hasta su ejecución y organización. Además, hemos practicado con ejercicios que refuerzan estos conceptos. En el siguiente tema, exploraremos técnicas avanzadas de depuración para mejorar aún más la calidad de nuestro código.
Curso de Programación en Python
Módulo 1: Introducción a Python
- Introducción a Python
- Configuración del Entorno de Desarrollo
- Sintaxis de Python y Tipos de Datos Básicos
- Variables y Constantes
- Entrada y Salida Básica
Módulo 2: Estructuras de Control
- Sentencias Condicionales
- Bucles: for y while
- Herramientas de Control de Flujo
- Comprensiones de Listas
Módulo 3: Funciones y Módulos
- Definición de Funciones
- Argumentos de Función
- Funciones Lambda
- Módulos y Paquetes
- Visión General de la Biblioteca Estándar
Módulo 4: Estructuras de Datos
Módulo 5: Programación Orientada a Objetos
Módulo 6: Manejo de Archivos
- Lectura y Escritura de Archivos
- Trabajo con Archivos CSV
- Manejo de Datos JSON
- Operaciones de Archivos y Directorios
Módulo 7: Manejo de Errores y Excepciones
- Introducción a las Excepciones
- Manejo de Excepciones
- Lanzamiento de Excepciones
- Excepciones Personalizadas
Módulo 8: Temas Avanzados
- Decoradores
- Generadores
- Administradores de Contexto
- Concurrencia: Hilos y Procesos
- Asyncio para Programación Asíncrona
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con unittest
- Desarrollo Guiado por Pruebas
- Técnicas de Depuración
- Uso de pdb para Depuración
Módulo 10: Desarrollo Web con Python
- Introducción al Desarrollo Web
- Fundamentos del Framework Flask
- Construcción de APIs REST con Flask
- Introducción a Django
- Construcción de Aplicaciones Web con Django
Módulo 11: Ciencia de Datos con Python
- Introducción a la Ciencia de Datos
- NumPy para Computación Numérica
- Pandas para Manipulación de Datos
- Matplotlib para Visualización de Datos
- Introducción al Aprendizaje Automático con scikit-learn
