Tutorial PyTest: Instale, Escreva e Execute Testes Python com Confiança
O que é PyTest?
PyTest é um framework de testes poderoso e open-source que permite desenvolvedores escreverem casos de teste concisos e escaláveis para projetos Python — sejam testes unitários, de integração ou end-to-end de APIs. Suporta execução paralela, injeção de fixtures, parametrização e relatórios ricos out of the box.
Por que Escolher PyTest?
- Sintaxe simples e legível que reduz boilerplate
- Descoberta e execução automática de testes
- Execute testes específicos ou grupos com
-ke markers - Suporte embutido para execução paralela via
pytest-xdist - Extensível através de fixtures, hooks e plugins
- Gratuito e ativamente mantido pela comunidade
Instalando PyTest
Instale o último release estável com pip:
pip install pytest
Verifique a instalação:
pytest --version
Para controle de versão específico, você pode fixar em um release, ex: pip install pytest==7.4.0.
Primeiros Passos: Um Teste Básico
Crie um diretório de projeto e adicione um arquivo de teste chamado test_sample1.py:
import pytest
def test_file1_method1():
x = 5
y = 6
assert x + 1 == y, "Addition failed"
assert x == y, "Values should match"
def test_file1_method2():
x = 5
y = 6
assert x + 1 == y, "Addition failed"
Execute a suíte de testes:
pytest
Exemplo de saída:
==================== test session starts ====================
collected 2 items
test_sample1.py F. [100%]
=================================== FAILURES ===================================
...
Entendendo Assertions
Assertions do PyTest comportam-se como statements assert padrão do Python. Em falha, o teste para de executar e PyTest reporta a localização exata e mensagem:
assert "hello" == "Hai", "Mismatched greeting"
Regras de Descoberta de Testes
- Arquivos devem começar com
test_ou terminar com_test.py. - Funções de teste devem começar com
test_. - Outros arquivos ou funções são ignorados a menos que explicitamente especificados.
Executando Testes Específicos
Execute todos os testes em um diretório:
pytest
Execute um único arquivo:
pytest test_sample1.py
Filtre por substring:
pytest -k method1 -v
Execute por marker:
pytest -m set1
Execução Paralela
Instale o plugin xdist e inicie uma execução paralela com 4 workers:
pip install pytest-xdist pytest -n 4
Usando Fixtures
Defina lógica de setup reutilizável uma vez e injete-a nos testes:
import pytest
@pytest.fixture
def supply_data():
return [25, 35, 45]
def test_compare_with_first(supply_data):
assert supply_data[0] == 25
Coloque código de fixture em conftest.py para compartilhar entre múltiplos módulos de teste.
Testes Parametrizados
Execute um único teste com múltiplas entradas:
import pytest
@pytest.mark.parametrize("a, b, expected", [(5, 5, 10), (3, 5, 8)])
def test_add(a, b, expected):
assert a + b == expected
Pulando e Falhas Esperadas
Use markers para pular ou esperar falhas sem poluir resultados:
import pytest
@pytest.mark.skip(reason="Feature not yet available")
def test_future_feature():
pass
@pytest.mark.xfail(reason="Known bug")
def test_known_issue():
assert 1 == 2
Gerando Relatórios XML
Gere um arquivo XML compatível com JUnit para pipelines CI:
pytest -v --junitxml=result.xml
Exemplo Prático: Testando uma API Pública
Abaixo está um framework mínimo que exercita https://reqres.in/:
# conftest.py
import pytest
@pytest.fixture
def base_url():
return "https://reqres.in/api"
# test_list_user.py
import requests, json
import pytest
@pytest.mark.parametrize("user_id, first_name", [(1, "George"), (2, "Janet")])
def test_valid_user(base_url, user_id, first_name):
resp = requests.get(f"{base_url}/users/{user_id}")
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["data"]["id"] == user_id
assert data["data"]["first_name"] == first_name
def test_invalid_user(base_url):
resp = requests.get(f"{base_url}/users/50")
assert resp.status_code == 404
# test_login_user.py
import requests, json
import pytest
def test_login_success(base_url):
payload = {"email": "test@test.com", "password": "something"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 200
assert data["token"] == "QpwL5tke4Pnpja7X"
def test_login_missing_password(base_url):
payload = {"email": "test@test.com"}
resp = requests.post(f"{base_url}/login/", data=payload)
data = json.loads(resp.text)
assert resp.status_code == 400
assert data["error"] == "Missing password"
Conclusão
Este tutorial cobriu instalação do PyTest, escrita de testes claros, uso de fixtures e markers, execução de testes em paralelo, geração de relatórios XML e construção de uma suíte simples de testes de API. Com essas bases, você pode escalar suas práticas de teste Python com confiança.
python
- Como Instalar WordPress no Google Cloud: Guia Passo a Passo
- Framework de Automação de Testes Coded UI: Guia Completo para Iniciantes
- Descubra Sua Chave de Segurança de Rede: Passos Fáceis para Encontrar e Proteger Seu Wi‑Fi
- Chamada Wi-Fi Explicada: Como Funciona e Por Que Importa
- Explorando o 6G: O Futuro da Conectividade Ultra-Rápida
- Guia do Especialista: Instalação de Niveladores de Doca para Máxima Eficiência
- Entendendo Testes de Descarga Parcial: Protegendo Equipamentos de Alta Tensão
- Prevenindo Cavitação em Bombas: Causas, Sintomas e Como Evitar
- Brasagem de Cobre Explicada: Técnicas e Dicas para Conexões Fortes e Confiáveis
- Backlog de Manutenção Explicado: Estratégias para Resolvê-lo