Generación de Informes HTML con unittest y HTMLTestRunner en Python

Este tutorial muestra cómo crear pruebas unitarias en Python utilizando el framwork unittest y generar informes en formato HTML con HTMLTestRunner. Se presentan ejemplos progresivos desde una cnofiguración básica hasta la generación de reportes completos.

Configuración básica de unittest

El siguiente ejemplo demuestra la estructura fundamental de una clase de pruebas con métodos de preparación y limpieza:

import unittest

class PruebaBaseDatos(unittest.TestCase):
    def setUp(self):
        print('Inicializando conexión a la base de datos')
    
    def tearDown(self):
        print('Cerrando conexión a la base de datos')
    
    def test_insertar_registro(self):
        print('Ejecutando prueba de inserción')
    
    def test_eliminar_registro(self):
        print('Ejecutando prueba de eliminación')

if __name__ == '__main__':
    unittest.main()

Ejecución de una sola clase de pruebas

Para ejecutar únicamente los casos de prueba de una clase específica, se puede utilizar TestLoader:

import unittest
import HTMLTestRunner

class PruebaAutenticacion(unittest.TestCase):
    def setUp(self):
        print('Configurando entorno de autenticación')
    
    def tearDown(self):
        print('Limpiando datos de sesión')
    
    def test_login_exitoso(self):
        print('Probando acceso con credenciales válidas')
    
    def test_login_fallido(self):
        print('Probando acceso con credenciales inválidas')

class PruebaPermisos(unittest.TestCase):
    def setUp(self):
        print('Estableciendo contexto de permisos')
    
    def tearDown(self):
        print('Restableciendo permisos por defecto')
    
    def test_acceso_admin(self):
        print('Verificando acceso de administrador')
    
    def test_acceso_restringido(self):
        print('Verificando acceso restringido')

if __name__ == '__main__':
    conjunto_pruebas = unittest.TestLoader().loadTestsFromTestCase(PruebaAutenticacion)
    unittest.TextTestRunner(verbosity=2).run(conjunto_pruebas)

Ejecución de múltiples clases de pruebas

Para combinar pruebas de diferentes clases en un solo ejecución, se pueden agrupar los conjuntos de pruebas:

import unittest
import HTMLTestRunner

class PruebaAutenticacion(unittest.TestCase):
    def setUp(self):
        print('Configurando entorno de autenticación')
    
    def tearDown(self):
        print('Limpiando datos de sesión')
    
    def test_login_exitoso(self):
        print('Probando acceso con credenciales válidas')
    
    def test_login_fallido(self):
        print('Probando acceso con credenciales inválidas')

class PruebaPermisos(unittest.TestCase):
    def setUp(self):
        print('Estableciendo contexto de permisos')
    
    def tearDown(self):
        print('Restableciendo permisos por defecto')
    
    def test_acceso_admin(self):
        print('Verificando acceso de administrador')
    
    def test_acceso_restringido(self):
        print('Verificando acceso restringido')

if __name__ == '__main__':
    conjunto1 = unittest.TestLoader().loadTestsFromTestCase(PruebaAutenticacion)
    conjunto2 = unittest.TestLoader().loadTestsFromTestCase(PruebaPermisos)
    suite_total = unittest.TestSuite([conjunto1, conjunto2])
    unittest.TextTestRunner(verbosity=2).run(suite_total)

Generación de informes HTML

HTMLTestRunner permite crear reportes detallados en formato HTML. A continuación se muestra un ejemplo completo:

import HTMLTestRunner
import unittest

class PruebaOperacionesMatematicas(unittest.TestCase):
    def setUp(self):
        print('Preparando operandos para cálculo')
    
    def tearDown(self):
        print('Finalizando operación matemática')
    
    def test_suma_dos_numeros(self):
        resultado = 2 + 3
        self.assertEqual(resultado, 5)
    
    def test_producto_dos_numeros(self):
        resultado = 4 * 5
        self.assertEqual(resultado, 20)
    
    def test_division_entera(self):
        resultado = 10 // 3
        self.assertEqual(resultado, 3)
    
    def test_resto_division(self):
        resultado = 10 % 3
        self.assertEqual(resultado, 1)

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(PruebaOperacionesMatematicas('test_suma_dos_numeros'))
    suite.addTest(PruebaOperacionesMatematicas('test_producto_dos_numeros'))
    
    archivo_reporte = open('reporte_pruebas.html', 'wb')
    ejecutor = HTMLTestRunner.HTMLTestRunner(
        stream=archivo_reporte,
        title='Reporte de Pruebas Matemáticas',
        description='Resultados de pruebas de operaciones básicas'
    )
    ejecutor.run(suite)

Informes para múltiples clases

Para generar un informe consolidado con pruebas de diefrentes clases, se pueden combinar múltiples conjuntos de pruebas:

import unittest
import HTMLTestRunner

class PruebaAutenticacion(unittest.TestCase):
    def setUp(self):
        print('Configurando entorno de autenticación')
    
    def tearDown(self):
        print('Limpiando datos de sesión')
    
    def test_login_exitoso(self):
        print('Probando acceso con credenciales válidas')
    
    def test_login_fallido(self):
        print('Probando acceso con credenciales inválidas')

class PruebaPermisos(unittest.TestCase):
    def setUp(self):
        print('Estableciendo contexto de permisos')
    
    def tearDown(self):
        print('Restableciendo permisos por defecto')
    
    def test_acceso_admin(self):
        print('Verificando acceso de administrador')
    
    def test_acceso_restringido(self):
        print('Verificando acceso restringido')

if __name__ == '__main__':
    conjunto_auth = unittest.TestLoader().loadTestsFromTestCase(PruebaAutenticacion)
    conjunto_permisos = unittest.TestLoader().loadTestsFromTestCase(PruebaPermisos)
    suite_completa = unittest.TestSuite([conjunto_auth, conjunto_permisos])
    
    with open('reporte_completo.html', 'wb') as archivo_html:
        runner = HTMLTestRunner.HTMLTestRunner(
            stream=archivo_html,
            title='Informe Consolidado de Pruebas',
            description='Pruebas de autenticación y permisos del sistema'
        )
        runner.run(suite_completa)

Etiquetas: Python Unittest HTMLTestRunner pruebas automatizadas informes HTML

Publicado el 6-29 01:10