Automatización de pruebas de API en Python - Uso detallado del framework unittest

Test Suite (Conjunto de pruebas)

Un test suite representa un conjunto de pruebas que agrupa múltiples casos de prueba o incluso otros subconjuntos de pruebas. Cuando se ejecuta un suite, se ejecutan automáticamente todos los casos de prueba contenidos en él.

Test Runner (Ejecutor de pruebas)

El test runner es el componente responsable de ejecutar las pruebas y mostrar los resultados obtenidos.

Uso básico de TestSuite y TextTestRunner

Definición de clase de pruebas

# Definición de clase de pruebas heredando de unittest.TestCase
class PruebasAPI(unittest.TestCase):

    # Método de prueba
    def test_verificar_usuario(self):
        print("verificando usuario")

    def test_crear_producto(self):
        print("creando producto")

    def test_actualizar_inventario(self):
        print("actualizando inventario")

    def test_eliminar_registro(self):
        print("eliminando registro")

Punto de entrada principle

if __name__ == '__main__':
    # Crear instancia del conjunto de pruebas principal
    suite_principal = unittest.TestSuite()
    # Crear instancia de un segundo conjunto de pruebas
    suite_secundaria = unittest.TestSuite()
    
    # Agregar casos de prueba - Método 1
    suite_principal.addTest(PruebasAPI('test_crear_producto'))
    suite_principal.addTest(PruebasAPI('test_verificar_usuario'))
    suite_secundaria.addTest(PruebasAPI('test_crear_producto'))
    suite_secundaria.addTest(PruebasAPI('test_verificar_usuario'))
    
    # Agregar casos de prueba - Método 2
    casos_prueba = (PruebasAPI('test_eliminar_registro'), PruebasAPI('test_actualizar_inventario'))
    suite_principal.addTests(casos_prueba)
    
    # Agregar un suite dentro de otro suite
    suite_principal.addTest(suite_secundaria)
    
    # Crear instancia de TextTestRunner
    ejecutor = unittest.TextTestRunner()
    
    # Ejecutar el conjunto de pruebas
    ejecutor.run(suite_principal)

Resultado de ejecución

creando producto
verificando usuario
eliminando registro
actualizando inventario
creando producto
verificando usuario
......
----------------------------------------------------------------------
Ran 6 tests in 0.000s

OK

Puntos importantes

  • Al utilizar TestSuite, el orden de ejecución de las pruebas es personalizable según el orden de inserción
  • Existen dos métodos para agregar casos de prueba; se recomienda el método 2 por ser más conciso
  • El parámetro tests puede ser una lista, tupla o conjunto
  • El formato para agregar pruebas es: NombreClasePrueba('nombre_metodo')
  • Pasos para ejecutar: instanciar TestSuite → agregar pruebas → instanciar TextTestRunner → ejecutar suite
  • Un TestSuite puede contener otros TestSuite

Ejecución masiva de casos de prueba

Archivos de clases de prueba

Supongamos que tenemos tres archivos con clases de pruebas y un cuarto archivo dedicado a ejectuar todas las pruebas.

Ejemplo de archivo de clase de prueba:

# Definición de clase de pruebas
class PruebasModuloClientes(unittest.TestCase):

    # Métodos de prueba
    def test_consultar_cliente(self):
        print("PruebasModuloClientes - consultar")

    def test_listar_clientes(self):
        print("PruebasModuloClientes - listar")

    def test_modificar_cliente(self):
        print("PruebasModuloClientes - modificar")

Archivo ejecutor de pruebas

Método 1: Carga explícita de pruebas

import unittest
from pruebas.modulo_clientes import PruebasModuloClientes
from pruebas.modulo_productos import PruebasModuloProductos

if __name__ == '__main__':
    # Cargar pruebas desde módulo
    casos_clientes = unittest.TestLoader().loadTestsFromModule(PruebasModuloClientes)
    # Cargar pruebas desde clase de prueba
    casos_productos = unittest.TestLoader().loadTestsFromTestCase(PruebasModuloProductos)
    # Cargar pruebas usando ruta de módulo como string
    casos_pedidos = unittest.TestLoader().loadTestsFromName('pruebas.modulo_pedidos')
    
    # Agrupar en lista
    conjunto_pruebas = [casos_clientes, casos_productos, casos_pedidos]
    
    # Crear suite
    suite = unittest.TestSuite(conjunto_pruebas)
    
    # Ejecutar suite
    unittest.TextTestRunner(verbosity=2).run(suite)

Puntos importentes del Método 1

  • loadTestsFromTestCase: Recibe una clase de prueba, requiere import previo
  • loadTestsFromModule: Recibe el módulo que contiene las clases de prueba, también requiere import
  • loadTestsFromName: Recibe un string con formato: modulo.clase.metodo, puede especificarse hasta nivel de clase
  • verbosity: Controla el nivel de detalle del resultado:
    • 0 (modo silencioso): Solo totales (ej: 100 pruebas, 20 fallidas, 80 exitosas)
    • 1 (modo normal): Muestra indicador de éxito (.) o falla (F)
    • 2 (modo detallado): Muestra información completa de cada prueba

Método 2: Descubrimiento automático (Recomendado)

import unittest

if __name__ == '__main__':
    # Directorio donde buscar archivos de prueba
    directorio_pruebas = './'
    
    # Crear descubridor automático de pruebas
    descubridor = unittest.defaultTestLoader.discover(
        start_dir=directorio_pruebas, 
        pattern="prueba_*.py"
    )
    
    # Ejecutar pruebas descubiertas
    unittest.TextTestRunner().run(descubridor)

Ventajas del Método 2

  • Solo tres líneas de código
  • Mayor rapidez en implementación
  • Exploración automática del directorio especificado

Parámetros importantes

  • start_dir: Directorio raíz donde buscar archivos de prueba
  • pattern: Patrón de coincidencia para archivos (por defecto: test*.py), personalizable según convenciones de nomenclatura

Resultado de ejecución masiva

PruebasModuloClientes listar
PruebasModuloClientes consultar
PruebasModuloClientes modificar
PruebasModuloProductos listar
PruebasModuloProductos consultar
PruebasModuloProductos actualizar
........
----------------------------------------------------------------------
Ran 9 tests in 0.000s

OK

Etiquetas: Python Unittest testing-automation api-testing test-suite

Publicado el 6-18 23:25