Sitemap

Swift: Testando UI com SnapshotTesting

3 min readApr 15, 2025

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.

--

--

Brenno de Moura
Brenno de Moura

Written by Brenno de Moura

Software engineer with a passion for technology and a focus on declarative programming, experience in challenging projects and multidisciplinary teams

No responses yet