Testes na trilha de Go

Aprenda a testar seus exercícios de Go no Exercism


Você pode rodar os exercícios de Go no diretório do seu projeto do Exercism entrando no diretório do exercício e rodando go test.

cd exercism/project/directory/go/leap
go test

Testes com o detector de corrida de dados

Além de rodar go test, alguns exercícios devem ser rodados com a flag do detector de corrida de dados para verificar se a sua solução não introduz bugs de corrida de dados. Você vai encontrar um lembrete para rodar os testes com a flag -race do detector de corrida de dados nos exercícios relevantes. Rode go test -race para verificar se há corrida de dados. Por exemplo:

cd exercism/project/directory/go/bank-account
go test -race

Rodando benchmarks

A maioria dos exercícios contém benchmarks, que você pode usar para determinar como as mudanças na sua solução afetam o desempenho dela. Para rodar os benchmarks de um exercício, use o comando go test -v --bench . --benchmem dentro do diretório do exercício.

Considere esta saída.

BenchmarkReverse-16       403594              2537 ns/op             176 B/op         34 allocs/op

Isso significa que o benchmark precisou de 403594 iterações para ser cronometrado de forma confiável. A velocidade média foi de 2537 ns por laço. Aconteceram 34 alocações de memória por operação, com uma média de 176 bytes.

Exemplos testáveis

Os testes de exemplo são usados em alguns exercícios e rodam junto com os testes padrão do exercício. Esses exemplos servem para documentar e verificar a API do exercício e podem ser úteis para descobrir qual é a API esperada do exercício.

Go fmt

Rode o go fmt no seu código antes de enviá-lo.

Dicas e sugestões

Escrevendo o código do exercício

O README.md de cada exercício dá uma descrição geral, mas o programa de testes de Go é bem específico. Abra o programa de testes e dê uma olhada rápida nele. Mesmo que pareça trapaça, faça isso mesmo. Procure comentários úteis, dados de teste e até só os nomes das funções de teste. Experimente rodar go test antes de ter escrito qualquer coisa e veja se as mensagens de erro dão uma ideia de por onde começar.

Seu primeiro objetivo é fazer algo compilar, mesmo que não passe nos testes. Para isso, você deve criar "stubs" de funções. Isso significa deixar o corpo vazio, exceto pelo que ela precisar retornar. Escreva return 0 ou return "" ou qualquer coisa só para fazer compilar. Às vezes, para descobrir as assinaturas das funções, você vai ter que voltar ao programa de testes e ler com mais atenção. Depois de descobrir todas as assinaturas de função necessárias, o programa de testes vai reclamar que 0 é a resposta errada. Agora comece a preencher os corpos das funções.

Corrigindo

Muitas vezes os testes param no primeiro erro. Corrija esse, repita até não haver mais erros. O go test tem opções úteis. go test -v dá uma saída mais detalhada. go test -run <regexp> roda só os testes cujos nomes correspondem a <regexp>.

Os panics geram muita saída. Pode parecer assustador no começo, mas tenha coragem. Olhe bem no topo da saída do panic para encontrar a mensagem do panic. Ela deve dar uma descrição geral do problema. Depois leia o resto procurando a primeira referência ao seu código. Muitas vezes isso aponta direto para o problema.

Para encontrar problemas em programas concorrentes, experimente go test -race.

Deixando o seu código em ordem

Vamos repetir: rode go fmt. O Golint pode informar problemas de estilo no seu código que o go fmt não pega. Você também pode olhar o go vet, que avisa sobre possíveis problemas no seu código. Leia e siga os comentários frequentes de revisões de código. Para um exercício que envolve concorrência, experimente go test -race mesmo que ele passe nos testes. Mantenha a legibilidade em mente mesmo que você otimize para o desempenho nos benchmarks. Às vezes a otimização ajuda a descobrir soluções concisas e legíveis, mas existe a tentação de abandonar a legibilidade em busca de desempenho.

Testes bônus

Alguns exercícios têm testes bônus que não rodam só com go test. Se você estiver resolvendo o exercício bônus além do exercício normal, vai ter que digitar go test -tags bonus, ou algum comando parecido, conforme indicado na documentação do programa de testes.