Configuración de behave / pytest-bdd
behave y pytest-bdd conectan archivos de características Gherkin con definiciones de pasos en Python. pytest-bdd se integra con suites pytest existentes; behave es un ejecutor BDD independiente.
Receta
# pytest-bdd (recomendado con pytest)
uv add --group dev pytest-bdd
# behave (independiente)
uv add --group dev behaveproject/
├── features/
│ ├── invoice.feature
│ └── steps/
│ └── invoice_steps.py
└── tests/
└── test_bdd.py
Cuándo recurrir a esto:
- Añadir BDD a un proyecto pytest existente (pytest-bdd)
- BDD desde cero con un ejecutor dedicado (behave)
- Conectar archivos de características con clientes de prueba de FastAPI/Django
Ejemplo de trabajo
# features/invoice.feature
Feature: Invoice API
Scenario: Create draft invoice
Given the API is running
When I POST /invoices with amount 100.00
Then the response status is 201# features/steps/invoice_steps.py (pytest-bdd)
from pytest_bdd import scenarios, given, when, then, parsers
from fastapi.testclient import TestClient
from myapp.main import app
scenarios("../invoice.feature")
client = TestClient(app)
_context = {}
@given("la API está en ejecución")
def api_running():
_context["client"] = client
@when(parsers.parse("POST /invoices con amount {amount:f}"))
def post_invoice(amount):
_context["response"] = _context["client"].post(
"/invoices", json={"amount": amount, "currency": "USD"}
)
@then(parsers.parse("el estado de la respuesta es {status:d}"))
def check_status(status):
assert _context["response"].status_code == statusuv run pytest features/steps/invoice_steps.py -vLo que esto demuestra:
- Archivo de características en el directorio
features/ scenarios()enlaza la característica con el módulo de pasos- Los decoradores
@given/@when/@thenmapean Gherkin a Python parsers.parseextrae parámetros del texto del paso
Inmersión Profunda
pytest-bdd vs behave
| Aspecto | pytest-bdd | behave |
|---|---|---|
| Ejecutor | pytest | CLI de behave |
| Fixtures | Fixtures de pytest en los pasos | Objeto de contexto de behave |
| Integración | Misma suite que las pruebas unitarias | Ejecutor features/ separado |
| Analizador | @given(parsers.parse(...)) | Formato de análisis de @when('{amount:f}') |
Configuración de behave
features/
├── environment.py # hooks: before_all, after_scenario
├── invoice.feature
└── steps/
└── invoice_steps.py
uv run behave features/Errores comunes
- Diccionario de contexto global - el estado se filtra entre escenarios. Solución: usar fixtures de pytest o el
contextde behave por escenario. - Ruta de
scenarios()incorrecta - no se recopilan pruebas. Solución: la ruta es relativa al archivo de pasos. - Incompatibilidad del texto del paso - error de paso no encontrado. Solución: el texto de Gherkin debe coincidir exactamente con el decorador (o usar analizadores).
- Ejecución de características sin archivos de pasos - 0 pruebas. Solución: asegurar la importación de
scenarios()en un módulo de prueba recopilado. - Mezcla de behave y pytest-bdd - dos ejecutores, pasos duplicados. Solución: elegir una herramienta por proyecto.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| pytest simple | No hay especificaciones legibles por el stakeholder | Se ha adoptado el proceso BDD |
| Robot Framework | Basado en palabras clave, autores no desarrolladores | Se prefieren pasos nativos de Python |
Preguntas frecuentes
¿pytest-bdd o behave?
pytest-bdd si ya se usa pytest. behave para proyectos BDD independientes.
¿Dónde van los archivos de características?
La convención para ambas herramientas es features/ en la raíz del proyecto.
¿Puedo usar fixtures de pytest en los pasos?
Sí, con pytest-bdd. Solicite fixtures como parámetros de la función de paso.
¿Cómo ejecuto una sola característica?
pytest-bdd: pytest -k nombre_del_escenario. behave: behave features/invoice.feature.
¿Cómo comparto pasos entre características?
Importe módulos de pasos o coloque pasos comunes en features/steps/common_steps.py.
¿Soporta pytest-bdd Scenario Outline?
Sí. La tabla de ejemplos se mapea automáticamente a escenarios parametrizados.
¿Cómo configuro los hooks del entorno de behave?
features/environment.py con before_scenario, after_all, etc.
¿Puedo probar Django con BDD?
Sí. Use el cliente de prueba de Django en las definiciones de pasos con pytest-django.
¿Cómo etiqueto escenarios?
@smoke encima de Scenario. Filtrar: behave --tags=smoke o marcadores de pytest.
¿Cómo depuro pasos fallidos?
pytest --pdb o agregue registro en las definiciones de pasos. behave: --no-capture.
Relacionado
- Sintaxis Gherkin - escritura de características
- Definiciones de pasos - patrones de pasos
- Gherkin a la canalización de CI - integración de CI
- Configuración de pytest - configuración de pytest
Versiones de la pila: Esta página se escribió para Python 3.14.0, FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.