En el mundo del desarrollo de software, asegurar la calidad y la fiabilidad del código es fundamental. Una de las prácticas más efectivas para lograr esto son las pruebas unitarias. En este artículo, exploraremos cómo realizar pruebas unitarias en Python utilizando pytest, un framework potente y flexible que simplifica el proceso de testing.

Aprenderás desde la importancia de las pruebas unitarias y cómo instalarlas, hasta la creación de tests y fixtures, culminando con un ejemplo completo que incluye la cobertura del código. Prepárate para llevar tus habilidades de desarrollo en Python al siguiente nivel, escribiendo código más robusto y mantenible.

Importancia de las Pruebas Unitarias

Las pruebas unitarias son una técnica de testing que consiste en probar individualmente las unidades más pequeñas de código, como funciones o métodos. Su importancia radica en varios aspectos clave:

Detección Temprana de Errores: Las pruebas unitarias permiten identificar errores en las primeras etapas del desarrollo, lo que facilita su corrección y reduce el costo de solucionarlos más adelante.

Refactorización Segura: Al contar con pruebas unitarias, puedes refactorizar tu código con la confianza de que, si algo se rompe, las pruebas te alertarán de inmediato.

Documentación Viva: Las pruebas unitarias sirven como documentación del comportamiento esperado de cada unidad de código. Al leer las pruebas, otros desarrolladores pueden comprender cómo se supone que debe funcionar el código.

Diseño Mejorado: Escribir pruebas unitarias te obliga a pensar en el diseño de tu código desde una perspectiva diferente, lo que puede llevar a un diseño más modular y fácil de mantener.

Reducción de la Dependencia: Las pruebas unitarias reducen la dependencia en el entorno de desarrollo, lo que permite probar el código en diferentes plataformas y configuraciones.

En resumen, las pruebas unitarias son una inversión que vale la pena realizar, ya que contribuyen a mejorar la calidad, la fiabilidad y la mantenibilidad del código.

Instalación y Uso de pytest

pytest es un framework de testing para Python que destaca por su sencillez, flexibilidad y potencia. A continuación, te guiaré a través de los pasos para instalarlo y comenzar a utilizarlo:

Instalación: Para instalar pytest, simplemente utiliza pip, el gestor de paquetes de Python:

pip install pytest

Uso Básico: Una vez instalado, puedes ejecutar pytest desde la línea de comandos. pytest buscará automáticamente archivos que comiencen con test_ o terminen con _test.py, y ejecutará las funciones de prueba que encuentre.

Por ejemplo, si tienes un archivo llamado test_ejemplo.py con el siguiente contenido:

def sumar(a, b):
 return a + b

def test_sumar():
 assert sumar(2, 3) == 5
 assert sumar(-1, 1) == 0
 assert sumar(0, 0) == 0

Para ejecutar la prueba, simplemente navega hasta el directorio donde se encuentra el archivo y ejecuta:

pytest

pytest te mostrará un informe detallado de los resultados de las pruebas, indicando si pasaron o fallaron.

Opciones Comunes: pytest ofrece una amplia gama de opciones para personalizar la ejecución de las pruebas. Algunas de las más comunes son:

  • -v: Aumenta la verbosidad de la salida, mostrando más detalles sobre las pruebas que se están ejecutando.
  • -k <expresión>: Permite ejecutar solo las pruebas que coincidan con una expresión dada.
  • --pdb: Abre un depurador interactivo cuando una prueba falla, lo que te permite inspeccionar el estado del programa en el momento del fallo.

Creación de Tests y Fixtures

pytest facilita la creación de tests y fixtures de manera intuitiva. Aquí te mostraré cómo hacerlo:

Creación de Tests: Para crear un test, simplemente define una función cuyo nombre comience con test_. Dentro de la función, utiliza la sentencia assert para verificar que el resultado de la operación que estás probando sea el esperado.

Por ejemplo:

def dividir(a, b):
 return a / b

def test_dividir():
 assert dividir(10, 2) == 5
 assert dividir(6, 3) == 2
 # Prueba para división por cero
 with pytest.raises(ZeroDivisionError):
 dividir(5, 0)

En este ejemplo, hemos creado una función test_dividir que prueba la función dividir. Además, hemos utilizado pytest.raises para verificar que se lanza una excepción ZeroDivisionError cuando intentamos dividir por cero.

Fixtures: Las fixtures son funciones que se ejecutan antes de cada test y que se utilizan para preparar el entorno de prueba. Pueden servir para crear objetos, establecer conexiones a bases de datos, o cualquier otra tarea de inicialización necesaria.

Para definir una fixture, utiliza el decorador @pytest.fixture:

import pytest

@pytest.fixture
def lista_numeros():
 return [1, 2, 3, 4, 5]

def test_sumar_lista(lista_numeros):
 assert sum(lista_numeros) == 15

En este ejemplo, hemos definido una fixture llamada lista_numeros que devuelve una lista de números. La función test_sumar_lista recibe la fixture como argumento y la utiliza para realizar la prueba.

Las fixtures son una herramienta poderosa para organizar y reutilizar el código de prueba, lo que facilita la creación de tests más limpios y mantenibles.

Ejemplo Completo con Cobertura de Código

Para consolidar lo aprendido, vamos a crear un ejemplo completo que incluye la cobertura del código. Supongamos que tenemos el siguiente módulo llamado calculadora.py:

def sumar(a, b):
 return a + b

def restar(a, b):
 return a - b

def multiplicar(a, b):
 return a * b

def dividir(a, b):
 if b == 0:
 raise ZeroDivisionError("No se puede dividir por cero")
 return a / b

Ahora, vamos a crear un archivo llamado test_calculadora.py con las pruebas unitarias correspondientes:

import pytest
from calculadora import sumar, restar, multiplicar, dividir

def test_sumar():
 assert sumar(2, 3) == 5
 assert sumar(-1, 1) == 0
 assert sumar(0, 0) == 0

def test_restar():
 assert restar(5, 2) == 3
 assert restar(0, 0) == 0
 assert restar(-1, 1) == -2

def test_multiplicar():
 assert multiplicar(2, 3) == 6
 assert multiplicar(-1, 1) == -1
 assert multiplicar(0, 5) == 0

def test_dividir():
 assert dividir(10, 2) == 5
 assert dividir(6, 3) == 2
 with pytest.raises(ZeroDivisionError):
 dividir(5, 0)

Para ejecutar las pruebas con cobertura de código, primero debes instalar el plugin pytest-cov:

pip install pytest-cov

Luego, ejecuta pytest con la opción --cov:

pytest --cov=calculadora

pytest te mostrará un informe de cobertura que indica qué porcentaje del código ha sido cubierto por las pruebas. El objetivo es alcanzar una cobertura lo más alta posible, idealmente cercana al 100%, para asegurar que todas las partes del código están siendo probadas.

Puedes generar un informe HTML de la cobertura ejecutando:

pytest --cov=calculadora --cov-report html

Esto creará un directorio llamado htmlcov con un archivo index.html que puedes abrir en tu navegador para ver un informe detallado de la cobertura.

 

En este artículo, hemos explorado cómo realizar pruebas unitarias en Python con pytest. Hemos visto la importancia de las pruebas unitarias, cómo instalar y usar pytest, cómo crear tests y fixtures, y cómo generar informes de cobertura de código.

Las pruebas unitarias son una herramienta esencial para el desarrollo de software de calidad. Al invertir tiempo en escribir pruebas unitarias, puedes mejorar la fiabilidad, la mantenibilidad y la robustez de tu código.

Te animo a que pongas en práctica lo aprendido en este artículo y comiences a escribir pruebas unitarias para tus proyectos en Python. ¡Verás cómo mejora la calidad de tu código y tu confianza como desarrollador!

Ads Blocker Image Powered by Code Help Pro

Por favor, permite que se muestren anuncios en nuestro sitio web

Querido lector,

Esperamos que estés disfrutando de nuestro contenido. Entendemos la importancia de la experiencia sin interrupciones, pero también queremos asegurarnos de que podamos seguir brindándote contenido de alta calidad de forma gratuita. Desactivar tu bloqueador de anuncios en nuestro sitio nos ayuda enormemente a lograrlo.

¡Gracias por tu comprensión y apoyo!