Skip to content

Latest commit

 

History

History
913 lines (668 loc) · 23.1 KB

File metadata and controls

913 lines (668 loc) · 23.1 KB

🧪 Guia de Testes Automatizados - Frontend NutriMind

📋 Índice


🎯 Visão Geral

Este projeto Vue 3 + TypeScript utiliza Vitest e Vue Test Utils para testes automatizados, garantindo a qualidade e confiabilidade do sistema NutriMind Frontend.

Tecnologias Utilizadas

  • Vitest: Framework de testes rápido e moderno
  • @vue/test-utils: Utilitários para testar componentes Vue
  • jsdom: Ambiente DOM para testes
  • TypeScript: Tipagem estática

⚙️ Configuração

Dependências Instaladas

{
  "devDependencies": {
    "@vue/test-utils": "^2.4.6",
    "@vitest/ui": "^2.1.8",
    "jsdom": "^25.0.1",
    "vitest": "^2.1.8"
  }
}

Scripts Disponíveis

# Executar testes em modo watch
npm run test

# Executar testes com interface gráfica
npm run test:ui

# Executar testes com relatório de cobertura
npm run test:coverage

📁 Estrutura de Testes

src/
├── tests/
│   ├── setup.ts                               # Configuração global dos testes
│   ├── components/
│   │   ├── NotificationToast.spec.ts         ✅ 16 testes
│   │   ├── ModalChangePassword.spec.ts       ✅ 13 testes
│   │   ├── ModalForgotPassword.spec.ts       ✅ 14 testes
│   │   └── Sidebar.spec.ts                   ✅ 13 testes
│   ├── views/
│   │   ├── SignIn.spec.ts                    ✅ 17 testes
│   │   ├── SignUp.spec.ts                    ✅ 20 testes
│   │   └── ChatView.spec.ts                  ✅ 21 testes

🚀 Como Executar

1️⃣ Instalar Dependências

npm install

2️⃣ Executar Todos os Testes

npm run test

3️⃣ Executar Testes Específicos

# Testar apenas useAuth
npm run test useAuth

# Testar apenas useNotifications
npm run test useNotifications

4️⃣ Executar com Interface Gráfica

npm run test:ui

Abrirá uma interface web em http://localhost:51204 com visualização interativa dos testes.

5️⃣ Executar com Cobertura

npm run test:coverage

Gera relatório em coverage/index.html


✅ Testes Implementados

🎨 NotificationToast Component (16 testes)

Funcionalidades Testadas:

✅ Renderização (2 testes)

  • Renderiza o componente corretamente
  • Não exibe notificações quando lista vazia

✅ Tipos de Notificações (4 testes)

  • Notificação de sucesso
  • Notificação de erro
  • Notificação de aviso
  • Notificação de informação

✅ Múltiplas Notificações (1 teste)

  • Exibe múltiplas notificações simultâneas

✅ Título (2 testes)

  • Exibe título quando fornecido
  • Não exibe título quando não fornecido

✅ Interação (2 testes)

  • Exibe botão de fechar para notificações dismissíveis
  • Remove notificação ao clicar no botão de fechar

✅ Classes e Ícones (2 testes)

  • Aplica classe correta para cada tipo
  • Exibe ícone correto para cada tipo

✅ Comportamento Avançado (3 testes)

  • Suporta notificações não dismissíveis
  • Auto-remove notificações após duração
  • Mantém notificações sem duração especificada

⚠️ Correções Implementadas:

  • Ajustado para usar document.body.querySelector() devido ao Teleport to="body"
  • Adicionado attachTo: document.body em todos os testes
  • Adicionado wrapper.unmount() para limpeza adequada

🔐 ModalChangePassword Component (13 testes)

Funcionalidades Testadas:

✅ Renderização (3 testes)

  • Renderiza modal quando modelValue é true
  • Não renderiza quando modelValue é false
  • Exibe campos de senha atual, nova senha e confirmação

✅ Visibilidade (1 teste)

  • Alterna visibilidade da senha atual

✅ Validação de Senha (3 testes)

  • Valida senha nova com requisitos mínimos
  • Valida confirmação de senha
  • Rejeita senha com sequência numérica

✅ Fechamento (2 testes)

  • Fecha modal ao clicar em cancelar
  • Limpa campos ao fechar

✅ Requisições (3 testes)

  • Envia requisição de alteração com sucesso
  • Exibe erro quando requisição falha
  • Não envia requisição se validação falhar

✅ Autenticação (1 teste)

  • Redireciona para login se não houver token

📧 ModalForgotPassword Component (14 testes)

Funcionalidades Testadas:

✅ Renderização (3 testes)

  • Renderiza modal quando modelValue é true
  • Não renderiza quando modelValue é false
  • Exibe campo de email

✅ Validação de Email (3 testes)

  • Valida email em branco
  • Valida formato de email inválido
  • Aceita email válido

✅ Fechamento (2 testes)

  • Fecha modal ao clicar em cancelar
  • Limpa campos ao fechar

✅ Loading (3 testes)

  • Exibe loading ao enviar email
  • Desabilita botões durante loading
  • Exibe spinner durante loading

✅ Requisições (3 testes)

  • Envia requisição de recuperação com sucesso
  • Exibe erro quando requisição falha
  • Não envia requisição se validação falhar

⚠️ Correções Implementadas:

  • Adicionado defineExpose para expor propriedades internas
  • Corrigido texto esperado com pontuação correta
  • Exposto: email, emailError, loading

🔐 SignIn View (17 testes) ✅

Funcionalidades Testadas:

✅ Renderização (3 testes)

  • Renderiza componente corretamente
  • Exibe campos de email e senha
  • Exibe imagens e elementos visuais

✅ Navegação (1 teste)

  • Exibe link para página de cadastro

✅ Visibilidade de Senha (1 teste)

  • Alterna visibilidade da senha

✅ Validação de Email (3 testes)

  • Valida email em branco
  • Valida formato de email inválido
  • Aceita email válido

✅ Validação de Formulário (1 teste)

  • Exibe erro quando campos não estão preenchidos

✅ Login (5 testes)

  • Realiza login com credenciais válidas
  • Exibe erro de autenticação com credenciais inválidas
  • Exibe erro de servidor quando ocorre erro 500
  • Exibe erro de rede quando não há conexão
  • Exibe erro quando token não é recebido
  • Exibe erro quando login falha no processamento do token

✅ Modal Esqueci Senha (1 teste)

  • Abre modal de esqueci senha ao clicar no botão

✅ Elementos Visuais (2 testes)

  • Exibe imagens e elementos visuais
  • Exibe ícones corretos

📝 SignUp View (20 testes) ✅

Funcionalidades Testadas:

✅ Renderização (2 testes)

  • Renderiza componente corretamente
  • Exibe todos os campos necessários

✅ Navegação (1 teste)

  • Exibe link para página de login

✅ Visibilidade de Senha (2 testes)

  • Alterna visibilidade da senha
  • Alterna visibilidade da confirmação de senha

✅ Validação de Email (2 testes)

  • Valida email em branco
  • Valida formato de email

✅ Validação de Nome (1 teste)

  • Valida nome em branco

✅ Validação de Senha (3 testes)

  • Valida senha com requisitos mínimos
  • Rejeita senha com sequência numérica
  • Valida confirmação de senha

✅ Validação de Formulário (1 teste)

  • Exibe erro quando campos não estão preenchidos

✅ Cadastro (4 testes)

  • Realiza cadastro com dados válidos
  • Exibe erro quando email já está cadastrado
  • Exibe erro de validação quando dados são inválidos
  • Exibe erro de servidor quando ocorre erro 500

✅ Erros de Rede (1 teste)

  • Exibe erro de rede quando não há conexão

✅ Login Automático (1 teste)

  • Realiza login automático após cadastro bem-sucedido

✅ Elementos Visuais (2 testes)

  • Exibe imagens e elementos visuais
  • Exibe ícones corretos

💬 ChatView (21 testes unitários) ✅

Funcionalidades Testadas:

✅ Renderização (6 testes)

  • Renderiza componente corretamente
  • Exibe título NutriMind no header
  • Exibe mensagem inicial do assistente
  • Exibe avatar do assistente
  • Exibe campo de input para mensagens
  • Exibe botão de enviar

✅ Interação com Botão (2 testes)

  • Desabilita botão quando input vazio
  • Habilita botão quando há texto

✅ Envio de Mensagens (5 testes)

  • Envia mensagem ao clicar no botão
  • Envia mensagem ao pressionar Enter
  • Não envia mensagem ao pressionar Shift+Enter
  • Adiciona mensagem do usuário ao enviar
  • Limpa input após enviar mensagem

✅ Estado e Carregamento (1 teste)

  • Exibe indicador de digitação durante carregamento

✅ Funcionalidades Extras (4 testes)

  • Alterna tema ao clicar no botão
  • Formata mensagens com quebras de linha
  • Gera IDs únicos para mensagens
  • Ajusta altura do textarea automaticamente

✅ Sessões (2 testes)

  • Carrega mensagens de sessão existente
  • Exibe estado inicial ao criar nova sessão

✅ Validação (1 teste)

  • Não envia mensagem vazia

✅ Correções Implementadas:

  • Adicionado defineExpose para expor propriedades internas
  • Exposto: draft, messages, isNewSession, formatMessage, generateId, autosize
  • Removidos testes não determinísticos (conteúdo variável de mensagens)

👤 UserProfileHeader Component (10 testes) ✅

Funcionalidades Testadas:

✅ Renderização (3 testes)

  • Renderiza componente com dados do usuário
  • Renderiza imagem de perfil
  • Exibe nome e email do usuário

✅ Botão Alterar Senha (2 testes)

  • Renderiza botão alterar senha
  • Abre modal ao clicar no botão

✅ Estado de Erro (1 teste)

  • Renderiza mensagem de erro quando houver erro

✅ Modal Change Password (1 teste)

  • Inclui o componente ModalChangePassword

✅ Estrutura do Componente (1 teste)

  • Tem userId como prop obrigatória

✅ Imagem de Perfil (2 testes)

  • Tem atributo alt na imagem
  • Tem src na imagem de perfil

📋 UserProfileDetails Component (3 testes) ✅

Funcionalidades Testadas:

✅ Renderização (3 testes)

  • Renderiza o componente corretamente
  • Renderiza título "Detalhes Adicionais"
  • Renderiza mensagem de carregamento quando não há dados

📄 ProfileView (13 testes) ✅

Funcionalidades Testadas:

✅ Renderização (4 testes)

  • Renderiza o componente corretamente
  • Renderiza o card de perfil
  • Renderiza UserProfileHeader quando userId está presente
  • Renderiza UserProfileDetails quando userId está presente

✅ Separador (1 teste)

  • Renderiza linha divisória (hr) entre os componentes

✅ Estado de Carregamento (2 testes)

  • Exibe mensagem de carregamento quando userId não está disponível
  • Não renderiza componentes de perfil durante carregamento

✅ Estado de Erro (1 teste)

  • Não renderiza componentes quando há erro

✅ Props dos Componentes Filhos (2 testes)

  • Passa userId para UserProfileHeader
  • Passa userId para UserProfileDetails

✅ Estrutura do Layout (2 testes)

  • Tem a classe perfil-view no elemento raiz
  • Tem a estrutura correta quando carregado

✅ Estados Condicionais (1 teste)

  • Prioriza exibição de dados sobre mensagem de carregamento

🍽️ MealPlanView (24 testes) ✅

Funcionalidades Testadas:

✅ Renderização (4 testes)

  • Renderiza o componente corretamente
  • Renderiza o Sidebar
  • Renderiza o main com classe meal-plan-main
  • Renderiza o header com título

✅ Header e Ações (3 testes)

  • Renderiza botão de alternar tema
  • Renderiza botão de logout
  • Tem título nos botões do header

✅ Estado de Loading (2 testes)

  • Exibe indicador de loading quando loading é true
  • Exibe ícone de loading com animação

✅ Empty State (3 testes)

  • Exibe empty state quando não há planos
  • Exibe mensagem de empty state correta
  • Exibe botão para criar novo plano

✅ Exibição de Plano Alimentar (2 testes)

  • Exibe container de plano quando há dados
  • Exibe informações do plano

✅ Carrossel de Planos (4 testes)

  • Exibe carrossel quando há múltiplos planos
  • Não exibe carrossel quando há apenas um plano
  • Tem botões de navegação no carrossel
  • Desabilita botão anterior quando no primeiro plano

✅ Grid de Refeições (2 testes)

  • Renderiza grid de refeições quando há refeições
  • Exibe informações de cada refeição

✅ Resumo Nutricional (2 testes)

  • Renderiza seção de resumo nutricional
  • Exibe métricas do resumo nutricional

✅ Estado de Erro (1 teste)

  • Exibe botão para tentar novamente no erro

✅ Subtítulo (1 teste)

  • Renderiza subtítulo

📊 Estatísticas

Números baseados na suíte atual de testes Vitest.

Categoria Testes Status
Componentes 69
NotificationToast 16
ModalChangePassword 13
ModalForgotPassword 14
Sidebar 13
UserProfileHeader 10
UserProfileDetails 3
Views 95
SignIn 17
SignUp 20
ChatView 21
ProfileView 13
MealPlanView 24
TOTAL 164 ✅ 100%

Taxa de Sucesso Atual: 100% ✅


💡 Boas Práticas

1. Nomenclatura de Testes

// ✅ BOM: Descritivo e claro
it('deve fazer login com token válido', () => { })

// ❌ RUIM: Vago
it('test1', () => { })

2. Estrutura AAA (Arrange, Act, Assert)

it('deve adicionar notificação de sucesso', () => {
  // Arrange (Preparar)
  const { notifications, showSuccess } = useNotifications()
  
  // Act (Agir)
  showSuccess('Mensagem de teste')
  
  // Assert (Verificar)
  expect(notifications.value).toHaveLength(1)
  expect(notifications.value[0].type).toBe('success')
})

3. Limpar Estado Entre Testes

beforeEach(() => {
  localStorage.clear()
  const { clearAll } = useNotifications()
  clearAll()
})

4. Usar Mocks Adequadamente

// Mock de timer para testes de duração
vi.useFakeTimers()
vi.advanceTimersByTime(5000)
vi.restoreAllMocks()

5. Testes Isolados

Cada teste deve ser independente e não depender de outros testes.


🔧 Configuração Avançada

Setup Global (src/tests/setup.ts)

// Mock do localStorage
global.localStorage = localStorageMock

// Mock do window.matchMedia
Object.defineProperty(window, 'matchMedia', { ... })

// Stubs globais do Vue
config.global.stubs = {
  Teleport: true,
  Transition: true,
  TransitionGroup: true,
}

Configuração do Vitest (vite.config.ts)

test: {
  globals: true,
  environment: 'jsdom',
  setupFiles: ['./src/tests/setup.ts'],
  coverage: {
    provider: 'v8',
    reporter: ['text', 'json', 'html'],
  },
}

❗ Troubleshooting

Problema 1: "localStorage is not defined"

Solução: Já resolvido no setup.ts com mock global.

Problema 2: "window.matchMedia is not a function"

Solução: Já resolvido no setup.ts com mock do matchMedia.

Problema 3: Teste de timer não funciona

Solução: Usar vi.useFakeTimers() e vi.advanceTimersByTime().

vi.useFakeTimers()
// ... seu código de teste
vi.advanceTimersByTime(5000)
vi.restoreAllMocks()

Problema 4: Erro com Teleport

Solução: Já configurado no setup.ts para stub de Teleport.

Problema 5: Testes lentos

Solução: Usar test.concurrent para testes paralelos:

describe.concurrent('Testes rápidos', () => {
  it.concurrent('teste 1', async () => { ... })
  it.concurrent('teste 2', async () => { ... })
})

📈 Relatórios

Visualizar Cobertura

npm run test:coverage

Abre coverage/index.html no navegador com relatório detalhado.

Interface Gráfica

npm run test:ui

Fornece:

  • ✅ Visualização de todos os testes
  • ✅ Filtros por arquivo/status
  • ✅ Reexecução automática
  • ✅ Visualização de cobertura

🔄 Integração com GitLab CI

Este repositório está preparado para rodar testes automaticamente no GitLab CI usando o arquivo .gitlab-ci.yml.

  • Job principal: frontend_tests
  • Comandos executados no CI:
npm ci
npm run test

Fluxo ao criar Merge Request

  1. Criar um MR da sua branch para o branch de destino (por exemplo, dev ou main).
  2. A pipeline será executada automaticamente e o job frontend_tests rodará os testes do Vitest.
  3. Somente faça merge se a pipeline estiver verde (Pipeline passed).

Se a pipeline falhar

  1. Abrir o job com erro no GitLab e verificar o log do frontend_tests.
  2. Rodar localmente os mesmos comandos:
npm install        # ou npm ci, conforme seu fluxo
npm run test
  1. Corrigir o código ou os testes até que tudo passe localmente.
  2. Fazer git commit das correções e git push para a mesma branch.
  3. A pipeline será reexecutada automaticamente; aguarde ficar verde antes de fazer o merge.

🎓 Exemplos Práticos

Testar Componente Vue

import { mount } from '@vue/test-utils'
import NotificationToast from '@/components/NotificationToast.vue'

it('deve renderizar notificação', () => {
  const wrapper = mount(NotificationToast)
  
  expect(wrapper.find('.toast').exists()).toBe(true)
})

📞 Comandos Úteis

# Desenvolvimento
npm run dev

# Testes
npm run test                  # Modo watch
npm run test:ui               # Interface gráfica
npm run test:coverage         # Com cobertura

# Build
npm run build
npm run preview

# Qualidade de código
npm run lint
npm run format
npm run type-check

🎯 Objetivo de Cobertura

  • Composables: 90%+ ✅ (100% alcançado)
  • Components: 80%+ ✅ (100% dos testados)
  • Views: 70%+ ✅ (100% dos testes determinísticos)

🏆 Resultados Atuais

✅ Conquistas

  • 243 testes implementados
  • 243 testes passando (100%) ✅
  • 46 testes de composables (100%)
  • 94 testes de componentes (100%)
  • 103 testes de views (100%)
  • Infraestrutura robusta de testes
  • Documentação completa
  • Apenas testes determinísticos e verificáveis

📋 Testes Manuais

Esta seção documenta os testes manuais que devem ser realizados para validar a experiência do usuário e funcionalidades visuais.

2.1 Testes de Interface e Navegação

Menu de Navegação Acessível

Cenário: Verificar acessibilidade e funcionamento do menu
Pré-condição: Usuário acessa o site
Passos:

  1. Abrir o site em diferentes dispositivos (desktop, tablet, mobile)
  2. Verificar se o menu está visível e acessível
  3. Clicar em cada opção do menu
  4. Verificar se todas as opções funcionam corretamente
  5. Verificar se o menu é responsivo em telas menores

Resultado Esperado: Menu acessível e funcional em todos os dispositivos


Visualizar Perfil

Cenário: Acessar e visualizar dados do perfil
Pré-condição: Usuário autenticado
Passos:

  1. Navegar para a página de perfil
  2. Verificar se as informações são exibidas corretamente
  3. Verificar se foto de perfil é exibida
  4. Verificar se nome e email estão corretos
  5. Verificar se dados adicionais estão organizados

Resultado Esperado: Perfil exibido corretamente com todas as informações


Visualizar Plano Alimentar

Cenário: Acessar plano alimentar solicitado
Pré-condição: Usuário possui plano alimentar
Passos:

  1. Navegar para a tela de planos alimentares
  2. Verificar se o plano é exibido corretamente
  3. Verificar se as refeições estão organizadas
  4. Verificar se o resumo nutricional é exibido
  5. Verificar se as informações de calorias estão corretas

Resultado Esperado: Plano exibido com todas as informações nutricionais


Solicitar Plano Alimentar e Receitas

Cenário: Solicitar novo plano e receitas
Pré-condição: Usuário autenticado
Passos:

  1. Solicitar plano alimentar via chat
  2. Aguardar resposta da IA
  3. Verificar se o plano é exibido na página de planos
  4. Solicitar receita via chat
  5. Verificar se a receita é exibida no chat

Resultado Esperado: Plano exibido na página de planos e receita exibida no chat


Upload de Foto de Refeição

Cenário: Enviar foto para análise
Pré-condição: Usuário autenticado
Passos:

  1. Acessar o chat
  2. Clicar em botão de upload de imagem
  3. Selecionar foto de refeição
  4. Enviar foto
  5. Aguardar análise da IA
  6. Verificar se o resultado aparece no frontend

Resultado Esperado: Análise da refeição exibida corretamente


Visualizar Chat com Respostas Humanizadas

Cenário: Interagir com o chat da IA
Pré-condição: Usuário autenticado
Passos:

  1. Acessar o chat
  2. Enviar mensagem
  3. Aguardar resposta
  4. Verificar se a resposta é exibida
  5. Verificar se o tom é humanizado e natural
  6. Verificar se há formatação adequada (quebras de linha, listas, etc.)

Resultado Esperado: Respostas exibidas de forma clara e humanizada


Página de FAQ e Responsividade

Cenário: Navegar pelo FAQ em diferentes dispositivos
Pré-condição: Usuário acessa o site
Passos:

  1. Acessar página de FAQ em desktop
  2. Navegar entre as categorias
  3. Verificar se as informações são exibidas
  4. Acessar página de FAQ em mobile
  5. Verificar responsividade do layout
  6. Verificar se acordeões funcionam corretamente

Resultado Esperado: FAQ acessível e responsivo em todos os dispositivos


Indicador de Loading do Chat

Cenário: Verificar feedback visual durante processamento
Pré-condição: Usuário autenticado
Passos:

  1. Enviar mensagem no chat
  2. Observar durante processamento
  3. Verificar se indicador de loading é visível
  4. Verificar se há animação adequada
  5. Verificar se indicador desaparece após resposta

Resultado Esperado: Indicador de loading visível durante processamento


2.2 Testes de Performance e Limites

Carregamento Rápido das Páginas

Cenário: Medir tempo de carregamento
Pré-condição: Usuário acessa o site
Passos:

  1. Abrir cada página do site
  2. Medir tempo de carregamento usando DevTools
  3. Verificar se o tempo é menor que 5 segundos
  4. Testar em diferentes velocidades de conexão
  5. Verificar se há lazy loading de imagens

Resultado Esperado: Páginas carregam em menos de 5 segundos


Upload de Imagens Grandes

Cenário: Testar limite de upload
Pré-condição: Usuário autenticado
Passos:

  1. Selecionar imagem de grande tamanho (>5MB)
  2. Tentar fazer upload
  3. Verificar se há mensagem de erro adequada ou compressão automática
  4. Verificar se não ocorre travamento
  5. Verificar se há feedback visual durante upload

Resultado Esperado: Sistema lida adequadamente com imagens grandes


Inputs Inválidos nos Formulários

Cenário: Validar tratamento de erros
Pré-condição: Usuário acessa formulários
Passos:

  1. Preencher formulário de cadastro com dados incorretos
  2. Tentar enviar formulário
  3. Verificar se mensagens de erro são exibidas
  4. Verificar se mensagens são claras e específicas
  5. Testar com email inválido, senha fraca, campos vazios, etc.

Resultado Esperado: Mensagens de erro adequadas para cada tipo de validação


Última atualização: Novembro 2025
Status: ✅