🧪 Documentação da Suíte de Testes Automatizados
Este diretório contém a suíte completa de 247 testes automatizados com 100% de aprovação, cobrindo testes unitários, testes de integração de pipeline, testes de regressão, contratos de CLI, provas de sensibilidade por mutação e testes End-to-End (E2E) com chamadas reais ao vivo para modelos de linguagem (LLM).
📊 Inventário e Mapa de Cobertura das Suítes
| Arquivo de Teste | Qtd. Testes | Escopo / O que valida? |
|---|---|---|
test_classify_exhaustive_suite.py |
38 | Suíte Exaustiva (QA Sênior): Todos os caminhos felizes (canônico, aliases, repetição, grafo), infelizes (homônimos, domínio sem alvo, empate de negativas), limiares/ambiguidade (TANGENTIAL), fallback LLM (upgrades, confirmações, rejeições, erros 500, timeouts, parsing resiliente, clipping de confidence), contratos de CLI e matriz multilíngue de 6 idiomas. |
test_e2e_text_analysis_pipeline.py |
13 | Funil Ponta a Ponta: Validação completa do pipeline de texto (NLP determinístico \rightarrow Ambiguidade \rightarrow Fallback LLM \rightarrow Degradação Graciosa) e teste de integração ao vivo (test_funnel_live_api_execution_if_configured) contra a API real (OpenAI / Omniroute / Gemini). |
test_llm_fallback.py |
9 | Módulo LLMFallbackAdapter (Tier 3): Validação da engenharia de prompt (build_prompt), detecção de disponibilidade, parsing JSON (puro e em blocos json ... ), acionamento por limiar de confiança e resiliência a exceções. |
test_convert_article_to_markdown.py |
67 | Conversor JSON \rightarrow Markdown (Spec 005): 100% dos requisitos funcionais (FR-001 a FR-018), matriz de prioridade de 11 campos de metadados, isolamento estrito de extratores, conversão ATX, remoção de headers duplicados e gravação atômica transacional. |
test_select_article_extractor.py |
30 | Seletor Determinístico de Extrator (Spec 004): Cálculo de consenso F_1 n-gram, pontuação multi-critério (título, autor, data, corpo, imagens), isolamento de empates e enriquecimento com selected_extractor. |
test_extract_article_contents.py |
15 | Extrator Multimotor (Spec 003): Scraping simultâneo via Trafilatura, Newspaper4k e Readability, isolamento de falhas individuais e fallbacks intra-motor (markdown/html \rightarrow text). |
test_extract_google_news.py |
16 | Extrator Google News RSS (Spec 002): Parsing de feed RSS, motor anti-bot Foxcape headless, resolução paralela de URLs reais intermediárias e suporte a locales internacionais. |
test_benchmark_24.py |
24 | Matriz Canônica de Benchmark (Spec 001): 24 cenários controlados cobrindo 6 idiomas (pt, en, es, de, it, fr) \times 4 categorias de decisão (DIRECT_INHERENT, CONTEXTUAL_INHERENT, TANGENTIAL, NOT_RELATED). |
test_adversarial.py |
7 | Testes Adversariais e Edge Cases: Injeção de caracteres especiais, emojis, textos maciços, documentos sem quebra de linha, falsos cognatos e metáforas linguísticas. |
test_classifier.py |
5 | Núcleo de Regras Determinísticas: Asserções fundamentais do classificador Tier 1 sobre o ECP da Petrobras. |
test_cli.py |
5 | Interface CLI Básica: Contratos de argumentos (--ecp, --content, --output), saída padrão formatada e captura de erros em stderr. |
test_language.py |
8 | Módulo de Idioma e Normalização: Identificação de ISO language, remoção de diacríticos/acentos e tokenização consciente de limites de palavras (word boundaries). |
test_models.py |
7 | Modelos e Validações de Schema: Parsing de ECP Snapshot JSON, dataclasses de nós do grafo (RelatedEntity) e serialização de ClassificationResult. |
test_adapters.py |
3 | Interfaces de Adaptadores: Contratos base das classes BaseNLPAdapter, LocalEmbeddingsAdapter e LLMFallbackAdapter. |
| TOTAL | 247 | 100% de Aprovação (247/247 passing) |
🚀 Como Executar os Testes
1. Executar Toda a Suíte do Projeto (247 testes)
pytest -v
2. Executar por Módulo Específico
# Suíte Exaustiva de Classificação e Fallback (QA Sênior - 38 testes)
pytest tests/test_classify_exhaustive_suite.py -v
# Funil Ponta a Ponta e Integração Real com API (13 testes)
pytest tests/test_e2e_text_analysis_pipeline.py -v
# Testes do Adaptador de Fallback LLM Tier 3 (9 testes)
pytest tests/test_llm_fallback.py -v
# Conversor de Artigo para Markdown (67 testes)
pytest tests/test_convert_article_to_markdown.py -v
# Seletor Determinístico de Extrator (30 testes)
pytest tests/test_select_article_extractor.py -v
# Extrator de Conteúdo Multimotor (15 testes)
pytest tests/test_extract_article_contents.py -v
# Extrator de Manchetes Google News (16 testes)
pytest tests/test_extract_google_news.py -v
🔑 Configuração para Testes com LLM ao Vivo
Para que o teste test_funnel_live_api_execution_if_configured e a CLI classify.py --enable-llm executem chamadas reais na rede, configure o arquivo .env na raiz do projeto:
OPENAI_API_KEY="sk-..."
OPENAI_BASE_URL="https://omniroute.app.andreferraro.com/v1"
OPENAI_MODEL="cgpt-web/gpt-5.5"
(Ou utilize GEMINI_API_KEY="..." para utilizar a API do Google Gemini).
Se as chaves não estiverem configuradas, os testes unitários continuam executando 100% dos cenários através de mocks e stubs isolados sem quebrar o CI.