Testes Automatizados - ime-usp-br/laravel_11_starter_kit GitHub Wiki

Testes Automatizados

O Projeto Base USP vem configurado com ferramentas e exemplos para facilitar a escrita e execução de testes automatizados, garantindo a qualidade e a confiabilidade da aplicação.

Ferramentas Utilizadas

  • PHPUnit: O framework padrão de testes unitários e de features para PHP e Laravel. Usado para testar unidades de código isoladas (Unit tests) e para testar funcionalidades completas através de requisições HTTP simuladas (Feature tests).
  • Laravel Dusk: Um pacote oficial do Laravel para testes de navegador (End-to-End). Ele utiliza um driver ChromeDriver real (ou compatível) para interagir com a aplicação como um usuário faria, testando interfaces e fluxos JavaScript.
  • Faker: Biblioteca para gerar dados falsos (nomes, emails, etc.) usada nas Factories para popular o banco de dados em testes.

Configuração do Ambiente de Teste

Ao executar os testes (php artisan test ou php artisan dusk), o Laravel automaticamente utiliza as configurações definidas no arquivo .env.testing (ou .env.dusk.local para Dusk, que por sua vez carrega .env.testing). Estas configurações são otimizadas para velocidade e isolamento:

  • Banco de Dados: SQLite em memória (DB_CONNECTION=sqlite, DB_DATABASE=:memory:) é o padrão para PHPUnit. Isso cria um banco zerado a cada execução de teste (quando se usa o trait RefreshDatabase), garantindo isolamento e rapidez. Para Dusk, um arquivo SQLite (database/database.dusk.sqlite) é usado por padrão para persistir o estado entre as requisições do navegador.
  • Cache: Driver array (em memória).
  • Sessão: Driver array (em memória).
  • Filas: Driver sync (tarefas são executadas imediatamente, sem um worker separado).
  • Hashing: BCRYPT_ROUNDS=4 (mais rápido que o padrão de produção).
  • Email: MAIL_MAILER=array (emails são capturados em memória para que se possa fazer asserções sobre eles, em vez de serem enviados).
  • Serviços Externos: Credenciais para Senha Única e Replicado são definidas com valores dummy. Testes NUNCA DEVEM depender de serviços externos reais. Use Mocks ou Fakes para simular essas interações.

Execução dos Testes

  • Todos os Testes PHPUnit (Feature e Unit):
    php artisan test
    
  • Testes de Navegador (Laravel Dusk):
    1. Certifique-se de ter o ChromeDriver apropriado instalado ou use o Laravel Sail. Veja a documentação do Dusk para detalhes da instalação do driver.
    2. Execute o comando:
      php artisan dusk
      
      Nota: Pode ser necessário rodar php artisan dusk:chrome-driver --detect na primeira vez ou ao atualizar o Chrome.

Testes Incluídos no Projeto Base

O projeto já vem com um conjunto inicial de testes cobrindo as funcionalidades principais:

  • Testes de Feature (tests/Feature):
    • Auth/: Testam os fluxos de Autenticação (login local, registro USP/Externo), Reset de Senha, Confirmação de Senha, Verificação de Email, Senha Local USP.
    • Admin/: Testam o acesso e as funcionalidades da Área Administrativa (listar usuários, validação dos formulários de criação).
    • Profile/: Testam a exibição e atualização da página de perfil, incluindo a exclusão da conta.
    • Middleware/: Testa o comportamento do middleware EnsureEmailIsVerifiedGlobally.
    • Database/: Testa se o RolesAndPermissionsSeeder funciona corretamente.
    • ExampleTest.php: Teste básico que verifica se a página inicial carrega.
  • Testes de Unit (tests/Unit):
    • Notifications/: Testam o conteúdo e a correta geração das URLs nas notificações customizadas (VerifyUserEmail, SendResetPasswordLink, SendLocalPasswordLink).
    • ExampleTest.php: Teste unitário básico.
  • Testes de Browser (tests/Browser):
    • Admin/: Testam o acesso e as funcionalidades básicas da área administrativa via navegador (Dusk).
    • Testam os fluxos de Autenticação, Registro, Verificação de Email, Senha Local USP, Reset de Senha e Perfil via navegador (Dusk).
    • ExampleTest.php: Teste Dusk básico que visita a página inicial.
    • Pages/: Contém classes Page Object Model (POM) para abstrair seletores e ações em páginas comuns (ex: HomePage).

Nota sobre Testes Dusk: O DuskTestCase.php foi customizado para incluir um método captureBrowserHtml que, em caso de falha, tenta extrair e imprimir o HTML da seção principal da página (#content ou div de erro) e a localização da falha no arquivo de teste, facilitando a depuração.

Adicionando Novos Testes

  • Criar Teste de Feature ou Unit:

    # Feature Test
    php artisan make:test NomeDoMeuFeatureTest
    
    # Unit Test
    php artisan make:test NomeDoMeuUnitTest --unit
    

    Coloque os arquivos gerados em tests/Feature ou tests/Unit, respectivamente.

  • Criar Teste de Browser (Dusk):

    php artisan dusk:make NomeDoMeuBrowserTest
    

    Coloque o arquivo gerado em tests/Browser.

Siga os padrões de escrita de testes do Laravel, utilizando os métodos de asserção disponíveis, factories para criar dados e mocks/fakes para isolar dependências externas. Consulte a documentação de testes do Laravel e a documentação do Dusk.