Guia Prático de Testes Automatizados¶
Este guia ensina como escrever testes unitários para a classe Article, medir cobertura de código e automatizar testes de forma prática usando Python e pytest.
1. Por que testar¶
Testes automatizados garantem que o código funciona corretamente e ajudam a prevenir bugs. Eles facilitam a refatoração do código e servem como documentação viva, mostrando como cada função ou classe deve se comportar. Para serem eficazes, os testes devem ser rápidos, isolados, repetíveis e auto-validados, ou seja, devem informar se passaram ou falharam sem intervenção manual.
2. Tipos de testes¶
Existem três tipos principais de testes que podem ser aplicados a um projeto:
-
Testes Unitários: Testam funções ou métodos isolados, sem depender de outras partes do sistema. Mocks podem ser usados para simular dependências externas, como APIs ou banco de dados. São rápidos, baratos e fáceis de manter.
-
Testes de Integração: Verificam se diferentes módulos do sistema funcionam bem juntos, por exemplo, se a API consegue se comunicar com o banco de dados ou com outra API externa.
-
Testes End-to-End (E2E): Simulam o fluxo completo do usuário, desde a interface até o banco de dados e de volta. São mais lentos e frágeis, então devem ser usados apenas para os fluxos mais críticos.
3. Estrutura do projeto¶
Uma organização mínima para o projeto seria:
-
app/models/article.py: classeArticle. -
tests/test_article.py: testes unitários doArticle. -
pytest.ini: configuração do pytest.
Exemplo de arquivo pytest.ini:
[pytest]
pythonpath = .
testpaths = tests
python_files = test_*.py
4. Instalação das dependências¶
Para instalar pytest e o plugin de cobertura, execute:
python -m pip install pytest pytest-cov
5. Criando testes unitários para Article¶
Você pode criar testes que validem a criação de objetos Article e seus atributos. Use o recurso de parametrização do pytest para testar múltiplos casos automaticamente.
Exemplo:
import pytest
from app.models.article import Article
test_articles = [
{"title": "Python", "author": "Alice", "url": "https://exemplo.com/python", "content": "Linguagem poderosa."},
{"title": "Notícia", "author": "Bob", "url": "https://exemplo.com/news", "content": ""},
]
@pytest.mark.parametrize("data", test_articles)
def test_article_creation(data):
article = Article(**data)
assert article.title == data["title"]
assert article.author == data["author"]
assert article.url.startswith("https://")
assert isinstance(article.content, str)
Não é necessário usar artigos reais. Dados fictícios já permitem testar se a criação do objeto funciona corretamente.
6. Rodando os testes e cobrindo o código¶
Para executar os testes e medir a cobertura:
python -m pytest -v --cov=app.models.article --cov-report=term-missing
-
-vmostra detalhes dos testes. -
--covcalcula a cobertura. -
--cov-report=term-missingmostra as linhas do código que não foram testadas.
7. Automatizando os testes com GitHub Actions¶
Você pode configurar o GitHub Actions para rodar os testes automaticamente a cada push ou pull request. Um workflow mínimo seria:
name: Run Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: '3.10'
- run: python -m pip install --upgrade pip
- run: pip install pytest pytest-cov
- run: python -m pytest -v --cov=app.models.article --cov-report=term-missing
Dessa forma, todos os testes são executados automaticamente e qualquer erro ou redução de cobertura será detectado imediatamente.
8. Resumo prático¶
-
Escreva testes unitários usando pytest e dados fictícios.
-
Use
@pytest.mark.parametrizepara testar múltiplos casos de forma automática. -
Meça a cobertura de código com pytest-cov.
-
Configure CI/CD com GitHub Actions para automatizar os testes em cada push.