Pytest: Guía completa de testing en Python
Introducción a Pytest
El testing es una parte fundamental del desarrollo de software. Sin pruebas de calidad, es difícil garantizar la fiabilidad del código y su funcionamiento estable al realizar cambios. Pytest es un framework moderno, potente y fácil de usar para pruebas automatizadas en Python, que simplifica enormemente el proceso de escribir y ejecutar tests.
Pytest ha ganado popularidad en la comunidad de desarrolladores gracias a su sintaxis concisa, sus amplias capacidades de extensión y su potente sistema de fixtures. Supera significativamente al módulo estándar unittest en facilidad de uso y velocidad de desarrollo de pruebas.
Instalación y configuración de Pytest
Instalación mediante pip
pip install pytest
Verificación de la instalación
pytest --version
Primer test sencillo
Crea un archivo test_example.py:
def test_addition():
assert 2 + 2 == 4
def test_string_operations():
text = "Hello, World!"
assert "Hello" in text
assert len(text) == 13
Ejecución de los tests
pytest
Pytest detectará automáticamente todos los archivos y funciones de prueba que sigan las convenciones de nomenclatura.
Estructura y organización de los tests
Convenciones de nomenclatura
Pytest utiliza las siguientes convenciones para la detección automática de pruebas:
- Archivos de test:
test_*.pyo*_test.py - Funciones de test:
def test_...() - Clases de test:
class Test...(sin método__init__) - Métodos de test en clases:
def test_...()
Organización de la estructura de tests
project/
├── src/
│ ├── calculator.py
│ └── utils.py
├── tests/
│ ├── test_calculator.py
│ ├── test_utils.py
│ └── conftest.py
└── pytest.ini
Ejecución de tests con diferentes parámetros
# Ejecutar todos los tests
pytest
# Ejecutar tests en un directorio específico
pytest tests/
# Ejecutar un archivo específico
pytest test_calculator.py
# Ejecutar un test concreto
pytest test_calculator.py::test_add
# Ejecutar tests de una clase
pytest test_calculator.py::TestCalculator
# Ejecutar un método específico de una clase
pytest test_calculator.py::TestCalculator::test_multiply
Fundamentos para escribir tests
Uso de assert para verificaciones
Pytest utiliza el operador estándar assert de Python para comprobar condiciones:
def test_basic_assertions():
# Verificar igualdad
assert 2 + 2 == 4
# Verificar desigualdad
assert 3 * 3 != 8
# Verificar pertenencia
assert "Python" in "Python testing"
# Verificar tipos
assert isinstance(42, int)
# Verificar verdadero
assert bool([1, 2, 3])
# Verificar falso
assert not bool([])
Testing de excepciones
import pytest
def divide(a, b):
if b == 0:
raise ValueError("No se permite la división por cero")
return a / b
def test_division_by_zero():
with pytest.raises(ValueError):
divide(10, 0)
def test_exception_message():
with pytest.raises(ValueError, match="división por cero"):
divide(10, 0)
def test_exception_type():
with pytest.raises(ZeroDivisionError):
1 / 0
Organización de tests en clases
class TestCalculator:
def test_addition(self):
assert 2 + 3 == 5
def test_subtraction(self):
assert 10 - 4 == 6