Swift: Testando UI com SnapshotTesting
Testar interfaces de usuário (UI) em aplicativos iOS pode ser uma tarefa desafiadora. A ferramenta padrão fornecida pela Apple, XCTestUI, é focada principalmente em testes funcionais e interação com a UI a partir do ponto de vista do usuário. Isso significa que para verificar se os elementos da tela estão exatamente como esperado em termos visuais e layout, precisamos escrever um monte de código complexo.
Embora seja importante garantir que os componentes da interface do usuário respondam corretamente a interações e eventos, muitas vezes desejamos validar o aspecto visual completo da tela. Essa necessidade leva à criação de bibliotecas como o SnapshotTesting desenvolvida pela Point-Free.
O SnapshotTesting é uma ferramenta poderosa que facilita a captura e comparação de screenshots ou representações em JSON de suas interfaces do usuário. A principal vantagem é que, em vez de escrever testes detalhados para cada elemento individual da tela, você pode criar um único teste que valida toda a tela ao mesmo tempo.
assertSnapshot(of:as:)
O método central no SnapshotTesting é assertSnapshot(of:as:)
. Este método recebe dois parâmetros:
1. of:
: O objeto ou componente da UI que você deseja testar, geralmente um UIViewController.
2. as:
: O formato em que o snapshot deve ser gerado e armazenado.
Por exemplo, aqui está como poderíamos testar uma tela simples com SnapshotTesting:
Este código é bastante autoexplicativo. Ele cria uma instância do MainViewController
, chama o método assertSnapshot
passando este controller como parâmetro, e armazena o snapshot em formato de imagem para ser comparado na próxima execução.
⚠️ Atraso na Captura
Atualmente, a biblioteca SnapshotTesting (versão 1.18.3) apresenta um problema específico: não é possível capturar um screenshot após um certo período de tempo sem esperar que a interface do usuário se atualize completamente.
O método
assertSnapshot(of: viewController, as: .wait(for: 2, on: .image))
, por exemplo, deveria permitir que o teste esperasse 2 segundos antes de tirar o print da tela. No entanto, ele não funciona conforme o planejado.Este problema é reconhecido pela comunidade e há um pull request em andamento que busca resolver essa questão para a próxima versão da biblioteca.
Conclusão
A testagem da interface do usuário é fundamental para garantir que seu aplicativo esteja funcionando conforme o esperado tanto visualmente quanto funcionalmente. Ferramentas como o SnapshotTesting simplificam significativamente esta tarefa, tornando os testes mais eficientes e menos propensos a erros humanos.
Ao utilizar o SnapshotTesting, podemos verificar instantaneamente se uma tela foi alterada sem ter que inspecionar cada componente individualmente. Essa abordagem não apenas economiza tempo e esforço ao escrever testes, mas também melhora a confiabilidade e a consistência dos resultados de teste.
Portanto, apesar das limitações atuais relacionadas à sincronização do tempo para captura, o SnapshotTesting ainda é uma ferramenta valiosa que facilita significativamente a implementação de testes adequados para interfaces do usuário em aplicativos iOS.
Se quiser contribuir para que eu possa continuar produzindo mais conteúdos técnicos, sinta-se à vontade para me oferecer um café ☕️ através da plataforma Buy me a Coffee.
Seu apoio é fundamental para manter meu trabalho e contribuir com a comunidade de desenvolvimento.