O LogoRRR usa o TestFX para executar testes de integração na interface de usuário JavaFX. Esses testes garantem que os fluxos principais sobrevivam a novas funcionalidades, refatorações e atualizações de dependências — e detectam regressões que os testes unitários simplesmente não conseguem ver.
Por que agora
Após mais de 20 lançamentos, o LogoRRR havia crescido o suficiente para que os testes manuais sozinhos não fossem mais suficientes. A base de código precisava de uma rede de segurança. O TestFX torna possível controlar a janela real da aplicação — clicar em botões, abrir arquivos, inspecionar o estado da interface — a partir de métodos de teste JUnit.
A decisão de quando investir em testes de ponta a ponta é sempre uma troca. No início de um projeto, as interfaces mudam rápido demais para que os testes acompanhem. Mas quando os fluxos principais se estabilizam, os testes se tornam um acelerador em vez de um fardo. Esse ponto de inflexão chegou com a versão 24.3.0.
Implementação
A sintaxe concisa do Scala presta-se naturalmente à construção de uma pequena DSL de testes. Cada ação atômica — abrir um arquivo, clicar no botão fechar, verificar que o painel de abas está vazio — torna-se um bloco de construção legível:
@Test def openAndCloseTab(): Unit = {
checkForEmptyTabPane()
openFile(path)
checkForNonEmptyTabPane()
clickOn(lookup(UiNodes.LogFileHeaderTabs).query[StackPane](), MouseButton.SECONDARY)
waitAndClickVisibleItem(CloseTabMenuItem.uiNode(fileId))
checkForEmptyTabPane()
}
Escrever testes de frontend forçou melhorias no código de produção também. Uma nova camada de Service foi adicionada para abstrair operações de I/O de arquivos e chamadas a processos externos — mudanças que melhoraram a arquitetura independentemente de qualquer benefício de teste.
O que os testes encontraram
- Comportamento no encerramento da aplicação — recursos que nunca foram limpos corretamente tornaram-se evidentes sob teste
- Isolamento de testes — cada teste deve configurar e desfazer seu próprio estado, o que expôs várias suposições sutis sobre estado compartilhado na interface
- Linha de base de desempenho — monitorar o tempo de execução dos testes evita o acúmulo gradual de testes lentos
Foto do cabeçalho por Sora Shimazaki no Pexels.
