Execução e análise de testes automatizados
Ativar quando:
# pytest (preferido)
pytest -v --tb=short
# unittest
python -m unittest discover
# Com cobertura
pytest --cov=src --cov-report=term-missing
# Jest
npm test
# Vitest
npx vitest run
# Com cobertura
npm test -- --coverage
go test ./... -v
go test ./... -cover
| Flag | Uso |
|---|---|
-v |
Verbose |
-x |
Para no primeiro erro |
--lf |
Roda últimos falhando |
-k "nome" |
Filtra por nome |
--cov=src |
Cobertura |
--tb=short |
Traceback curto |
-n auto |
Paralelo (pytest-xdist) |
| Flag | Uso |
|---|---|
--verbose |
Detalhado |
--coverage |
Cobertura |
--watch |
Watch mode |
-t "nome" |
Filtra por nome |
--bail |
Para no primeiro erro |
## Test Report
### Sumário
| Métrica | Valor |
|---------|-------|
| Total | 42 |
| Passou | 40 ✅ |
| Falhou | 2 ❌ |
| Skipped | 0 ⏭️ |
| Cobertura | 78% |
### Testes Falhando
#### `test_user_creation`
**Arquivo:** `tests/test_user.py:45`
AssertionError: Expected 201, got 400
**Causa provável:** Validação de email falhando
---
### Cobertura por Arquivo
| Arquivo | Cobertura |
|---------|-----------|
| `src/auth.py` | 95% |
| `src/user.py` | 82% |
| `src/utils.py` | 45% ⚠️ |
### Arquivos Sem Cobertura
- `src/legacy.py`
- `src/migrations/`
### Recomendações
1. Adicionar testes para `src/utils.py`
2. Investigar `test_user_creation`
# Esperado vs Obtido
assert result == expected
# Verificar: lógica, dados de teste, estado
# Módulo não encontrado
# Verificar: PYTHONPATH, venv, dependências
# Teste demorou demais
# Verificar: mocks, I/O, loops infinitos
# Setup/teardown falhou
# Verificar: database, arquivos, conexões
# pytest com cobertura detalhada por arquivo
pytest --cov=src --cov-report=term-missing --cov-report=html
# Verificar arquivos abaixo de 90%
pytest --cov=src --cov-report=term-missing | grep -E "TOTAL|^\w+.*\s+\d+%" | awk '$NF < 90'
def test_should_do_something():
# Arrange
data = setup_data()
# Act
result = function_under_test(data)
# Assert
assert result == expected
# Bom
test_user_creation_with_valid_email_returns_201
test_login_with_wrong_password_returns_401
# Ruim
test_1
test_user
Usar pytest para todos os testes:
A estrutura dos testes deve espelhar a estrutura da aplicação:
app/
├── users/
│ ├── controllers/
│ │ └── user_controller.py
│ └── models/
│ └── user.py
tests/
├── users/
│ ├── controllers/
│ │ └── test_user_controller.py
│ └── models/
│ └── test_user.py
Regra: Quando procurar um teste de um arquivo, ele deve estar na mesma estrutura relativa.
Todos os acessos externos devem ser mockados:
Banco de dados:
Sistema de fila (Redis, RabbitMQ, etc.):
Cache (Redis, Memcached, etc.):
APIs externas:
responses ou httpx para mockar requisições HTTPSistema de arquivos:
tempfile ou mockar operações de arquivoArquivos de teste:
test_*.py ou *_test.pytest_user_controller.pyFunções de teste:
test_*test_create_user_success()Descritivo:
test_create_user_with_valid_data_success()test_create_user_with_invalid_email_fails()Cada teste deve ter:
Exemplo:
def test_create_user_success():
# arrange
user_data = {"email": "test@example.com", "name": "Test User"}
# act
result = create_user(user_data)
# assert
assert result.email == "test@example.com"
assert result.id is not None
Usar fixtures para setup comum:
conftest.pyExemplo:
@pytest.fixture
def user_data():
return {"email": "test@example.com", "name": "Test User"}
@pytest.fixture
def mock_redis(monkeypatch):
mock_redis = Mock()
monkeypatch.setattr("app.utils.cache_system.CacheSystem", mock_redis)
return mock_redis
Templates obrigatórios:
core/templates/django/pytest.inicore/templates/django/conftest.pyUsar sempre os templates como base.
Testes unitários:
Testes de integração:
Priorizar testes unitários (maioria).
conftest.py para setup comum