Testar um aplicativo Flutter fica confuso quando todos os tipos de teste aparecem na mesma conversa. Unitário, widget, golden e integração parecem nomes de uma prova que você precisa passar antes de escrever a primeira linha. Na prática, cada um olha para uma parte diferente do app. O melhor caminho é começar pelo que roda rápido e só aumentar o custo quando a dúvida exigir.
A documentação oficial do Flutter separa os testes por escopo. Um teste unitário verifica uma função, um método ou uma classe sem depender da interface. O teste de widget monta um pedaço da tela e confere como ele reage. O teste de integração observa o aplicativo inteiro, normalmente em um dispositivo ou emulador. O golden test compara uma imagem atual com uma imagem de referência.

Imagem: Flutter Documentation.
Comece pela lógica que pode quebrar escondida
Imagine um aplicativo de lista de compras. Antes de testar botão, cor e animação, existe uma parte menos vistosa: calcular o total, marcar um item como comprado, ordenar a lista e rejeitar um produto sem nome. Essas regras podem ser testadas sem abrir uma tela. É aí que o teste unitário costuma pagar a conta.
Um teste desse tipo deve receber uma entrada conhecida e verificar o resultado. Se uma função soma três produtos e retorna o valor errado, o teste aponta o problema sem depender de fonte, tamanho de tela ou tempo de carregamento. Como ele não precisa construir a árvore de widgets, tende a ser rápido o bastante para rodar a cada alteração.
O ganho não está em testar cada getter por obrigação. O ponto é proteger decisões que têm consequência: cálculo, validação, conversão de dados e regras de estado. Uma função trivial não precisa de uma cerimônia. Uma regra que pode cobrar o cliente errado merece um teste pequeno e direto.
Widget test: a tela no tamanho certo
Quando a dúvida envolve a interface, o teste de widget entra em cena. Você pode montar um botão, um formulário ou uma tela com dados falsos e verificar o que aparece. Também dá para tocar no botão, preencher um campo e conferir se o estado mudou.
Esse teste é útil porque pega erros que o teste unitário não enxerga. Um texto pode estar correto na lógica e ausente da tela. Um botão pode chamar o callback errado. Um indicador de carregamento pode continuar visível depois que a resposta chega. O teste roda em ambiente controlado, sem exigir que alguém repita a mesma sequência manualmente.
Não tente reproduzir o aplicativo inteiro logo no primeiro widget test. Escolha uma tela com uma regra clara. Um formulário que mostra uma mensagem quando o e-mail é inválido já oferece um bom começo. Use dependências falsas quando necessário, porque o objetivo é testar a reação da tela, não a disponibilidade de uma API externa.

Imagem: Flutter Documentation.
Golden tests e integração têm outro preço
O golden test guarda uma imagem esperada e compara a próxima renderização com ela. Ele é interessante para componentes visuais que não podem mudar sem uma revisão: cartões, temas, ícones e telas com muitos estados. Se uma alteração mexe no espaçamento ou troca uma cor, a diferença aparece como uma falha visual.
Há uma armadilha: a imagem de referência também precisa de revisão. Uma falha não significa automaticamente que o código está errado. Pode ser uma mudança intencional no design, uma fonte diferente no ambiente de teste ou uma variação de plataforma. O golden ajuda a enxergar a mudança; a decisão continua sendo humana.
O teste de integração fica mais perto do uso real. Ele pode abrir o app, navegar entre telas, preencher dados e verificar o resultado final. Por isso, é mais lento e costuma exigir um dispositivo ou emulador. Vale reservá-lo para caminhos que atravessam várias partes do sistema, como criar uma conta, concluir uma compra ou salvar uma configuração importante.
Uma ordem prática para um app pequeno
Para um projeto começando agora, eu seguiria uma ordem simples. Primeiro, cubra as regras de negócio com testes unitários. Depois, escolha as telas mais importantes e escreva testes de widget para os estados que o usuário realmente encontra. Só então adicione golden tests para componentes visuais estáveis e testes de integração para os fluxos que cruzam o aplicativo.
Essa ordem reduz o tempo de espera e facilita descobrir a origem da falha. Se um teste unitário quebra, a suspeita fica perto da regra. Se o unitário passa e o widget falha, olhe para a montagem da tela ou para o estado. Se ambos passam e a integração quebra, investigue a ligação entre as partes. Não é uma divisão perfeita, mas é melhor do que depender apenas de um teste gigante.
Também vale colocar os testes no mesmo ciclo do desenvolvimento. Rode os unitários e os widgets localmente, antes de abrir um pull request. Deixe golden e integração em uma etapa própria quando o projeto crescer, principalmente se o ambiente exigir emuladores. A velocidade do retorno importa: um teste que ninguém consegue rodar vira decoração no repositório.
A documentação do Flutter mantém exemplos para testes unitários, de widget, golden e integração. O material oficial é o melhor ponto para conferir APIs e detalhes que mudam com a versão do SDK. Para começar, escolha uma regra pequena do seu aplicativo, escreva uma entrada e um resultado esperado e só depois avance para a tela. O primeiro teste não precisa provar que o app inteiro é seguro; ele precisa tornar uma dúvida concreta mais fácil de responder.
Fonte: documentação oficial de testes do Flutter. Consulte também o guia de teste unitário.


