Configuração do behave / pytest-bdd
behave e pytest-bdd conectam arquivos de funcionalidade Gherkin a definições de passos em Python. pytest-bdd integra-se a suítes pytest existentes; behave é um executor BDD independente.
Receita
# pytest-bdd (recomendado com pytest)
uv add --group dev pytest-bdd
# behave (independente)
uv add --group dev behaveproject/
├── features/
│ ├── invoice.feature
│ └── steps/
│ └── invoice_steps.py
└── tests/
└── test_bdd.py
Quando usar isso:
- Adicionando BDD a um projeto pytest existente (pytest-bdd)
- BDD Greenfield com executor dedicado (behave)
- Conectando arquivos de funcionalidade a clientes de teste FastAPI/Django
Exemplo de Trabalho
# 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("a API está em execução")
def api_running():
_context["client"] = client
@when(parsers.parse("I POST /invoices com amount {amount:f}"))
def post_invoice(amount):
_context["response"] = _context["client"].post(
"/invoices", json={"amount": amount, "currency": "USD"}
)
@then(parsers.parse("o status da resposta é {status:d}"))
def check_status(status):
assert _context["response"].status_code == statusuv run pytest features/steps/invoice_steps.py -vO que isso demonstra:
- Arquivo de funcionalidade no diretório
features/ scenarios()vincula a funcionalidade ao módulo de passos- Decoradores
@given/@when/@thenmapeiam Gherkin para Python parsers.parseextrai parâmetros do texto do passo
Mergulho Profundo
pytest-bdd vs behave
| Aspecto | pytest-bdd | behave |
|---|---|---|
| Executor | pytest | CLI do behave |
| Fixtures | Fixtures pytest em passos | Objeto de contexto do behave |
| Integração | Mesma suíte que testes unitários | Executor separado em features/ |
| Analisador | @given(parsers.parse(...)) | Formato de análise @when('{amount:f}') |
Configuração do behave
features/
├── environment.py # hooks: before_all, after_scenario
├── invoice.feature
└── steps/
└── invoice_steps.py
uv run behave features/Armadilhas
- Dicionário de contexto global - estado vaza entre cenários. Correção: use fixtures pytest ou
contextdo behave por cenário. - Caminho de
scenarios()incorreto - nenhum teste coletado. Correção: caminho relativo ao arquivo de passos. - Incompatibilidade de texto do passo - erro de passo não encontrado. Correção: o texto Gherkin deve corresponder exatamente ao decorador (ou usar parsers).
- Executando funcionalidades sem arquivos de passos - 0 testes. Correção: garanta a importação de
scenarios()em um módulo de teste coletado. - Mistura de behave e pytest-bdd - dois executores, passos duplicados. Correção: escolha uma ferramenta por projeto.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| pytest puro | Sem especificações legíveis por stakeholders | Processo BDD adotado |
| Robot Framework | Orientado a palavras-chave, autores não desenvolvedores | Passos nativos Python preferidos |
FAQs
pytest-bdd ou behave?
pytest-bdd se já estiver usando pytest. behave para projetos BDD independentes.
Onde vão os arquivos de funcionalidade?
features/ na raiz do projeto é a convenção para ambas as ferramentas.
Posso usar fixtures pytest em passos?
Sim com pytest-bdd. Solicite fixtures como parâmetros de função de passo.
Como executo uma funcionalidade?
pytest-bdd: pytest -k nome_do_cenario. behave: behave features/invoice.feature.
Como compartilho passos entre funcionalidades?
Importe módulos de passos ou coloque passos comuns em features/steps/common_steps.py.
O pytest-bdd suporta Scenario Outline?
Sim. A tabela de exemplos mapeia para cenários parametrizados automaticamente.
Como configuro hooks de ambiente do behave?
features/environment.py com before_scenario, after_all, etc.
Posso testar Django com BDD?
Sim. Use o cliente de teste do Django nas definições de passos com pytest-django.
Como marco cenários?
@smoke acima do Scenario. Filtrar: behave --tags=smoke ou marcadores pytest.
Como depuro passos que falham?
pytest --pdb ou adicione logging nas definições de passos. behave: --no-capture.
Relacionado
- Sintaxe Gherkin - escrevendo funcionalidades
- Definições de Passos - padrões de passos
- Gherkin para Pipeline de CI - integração de CI
- Configuração do pytest - configuração do pytest
Versões da Pilha: Esta página foi escrita 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+, e uv 0.6+.