Este documento detalha o design, a implementação e as decisões da etapa de Testes e Ajustes Finais (Epic 8) do projeto BrasilnaCopaAI.
Nesta etapa, focamos na estabilidade, cobertura de testes e qualidade geral do projeto. Desenvolvemos novos testes funcionais de interface do usuário, criamos uma bateria de testes de métricas de qualidade (precisão, latência e segurança contra alucinações do RAG) e resolvemos todos os avisos de depreciação do Python detectados no console de execução.
As implementações foram estruturadas nas seguintes frentes:
- Usamos a biblioteca de testes nativa do Streamlit (
streamlit.testing.v1.AppTest) para simular a compilação e a renderização do frontend sem abrir o navegador. - Isolamento de API: Como o frontend depende do backend para monitoramento de saúde (
/health), mockamos a chamada do módulorequests.getpara retornar uma resposta fictícia instantânea. Isso tornou o teste da UI determinístico, rápido e livre de conexões externas. - O teste valida o estado inicial da página, a existência do controle de Top-K no sidebar e o botão para limpar a conversa.
- Precisão do Retriever: Valida se a busca semântica pelo termo "Pelé" traz trechos relevantes com conteúdo associado a "Pelé", "Copa", "Brasil", etc.
- Medição de Latência:
- Mede o tempo de busca local no ChromaDB (garantindo que seja
< 1.5segundo). Para isolar a latência da busca vetorial local dos atrasos da rede, o LLM de expansão de consultas é mockado no teste de latência. - Mede e exibe a latência da chamada externa à API do Gemini. Para evitar que variações de conexão com os servidores do Google causem falhas intermitentes no CI, o tempo da LLM é impresso no console sem gerar falhas rígidas (evitando testes flaky).
- Mede o tempo de busca local no ChromaDB (garantindo que seja
- Proteção contra Alucinações (Perguntas Fora do Escopo): Testa o envio de perguntas não correlacionadas com a Seleção nas Copas (ex: "Como cozinhar uma lasanha de berinjela?"). O teste valida se o pipeline ativa a resposta literal de fallback especificada nas diretrizes do prompt.
- Identificamos avisos de depreciação causados pelo uso do método
datetime.utcnow(). - Substituímos o uso do método legado por
datetime.now(timezone.utc)nos seguintes módulos de processamento de dados e endpoints:app/main.pyapp/ingestion/collector.pyapp/ingestion/processor.py
Você pode rodar toda a suíte de testes (agora com 29 testes ativos) utilizando:
.\.venv\Scripts\python.exe -m pytest -v -sO parâmetro -s permite visualizar os tempos de latência e as saídas das métricas impressas no terminal.