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