Aprende a testar os teus exercícios de Go no Exercism
Podes correr os exercícios de Go dentro do diretório do teu projeto exercism se mudares para o diretório do exercício e correres go test.
cd exercism/project/directory/go/leap
go test
Além de correres go test, alguns exercícios devem ser corridos com uma flag para o detetor de corridas de dados, para verificar que a tua solução não introduz erros de corrida de dados.
Nos exercícios relevantes, vais encontrar um lembrete para correres os testes com a flag -race do detetor de corridas de dados.
Corre go test -race para verificares se há corridas de dados.
Por exemplo:
cd exercism/project/directory/go/bank-account
go test -race
A maioria dos exercícios contém benchmarks, que podes usar para determinar como as alterações à tua solução afetam o seu desempenho.
Para correres os benchmarks de um exercício, usa o comando go test -v --bench . --benchmem dentro do diretório do exercício.
Repara nesta saída.
BenchmarkReverse-16 403594 2537 ns/op 176 B/op 34 allocs/op
Isto significa que o benchmark precisou de 403594 iterações para ser cronometrado de forma fiável. A velocidade média foi de 2537 ns por ciclo. Ocorreram 34 alocações de memória por operação, com uma média de 176 bytes.
Os testes de exemplo são usados em alguns exercícios e são corridos a par dos testes normais do exercício. Estes exemplos servem para documentar e verificar a API do exercício e podem ser úteis para perceberes qual é a API esperada do exercício.
Corre o go fmt no teu código antes de o submeteres.
O README.md de cada exercício dá uma descrição geral, mas o programa de testes de Go é bastante específico.
Abre o programa de testes e dá-lhe uma vista de olhos rápida. Mesmo que te pareça batota, fá-lo na mesma.
Procura comentários úteis, dados de teste e apenas os nomes das funções de teste.
Experimenta correr go test antes de teres escrito seja o que for e vê se as mensagens de erro te dão uma ideia de por onde começar.
O teu primeiro objetivo é conseguir que algo compile, mesmo que falhe os testes.
Para isso, deves criar "stubs" das funções.
Ou seja, deixa o corpo vazio, exceto aquilo que a função tiver de devolver.
Escreve return 0 ou return "" ou o que for preciso só para que compile.
Às vezes, para perceberes as assinaturas das funções, tens de voltar ao programa de testes e lê-lo com mais atenção.
Depois de perceberes todas as assinaturas de funções necessárias, o programa de testes vai queixar-se de que 0 é a resposta errada.
Agora começa a preencher os corpos das funções.
Muitas vezes, os testes param no primeiro erro.
Corrige esse e repete até não haver erros.
O go test tem opções úteis.
O go test -v dá uma saída mais detalhada. O go test -run <regexp> corre apenas os testes cujos nomes correspondem a <regexp>.
Os panics produzem muita saída. Pode parecer assustador ao início, mas tem coragem. Olha para o topo da saída do panic para encontrares a mensagem do panic. Isso deve dar-te uma descrição geral do problema. Depois lê o resto à procura da primeira referência ao teu código. Muitas vezes, isso aponta diretamente para o problema.
Para encontrares problemas em programas concorrentes, experimenta go test -race.
Vamos repetir: corre o go fmt.
O Golint pode informar-te sobre problemas de estilo no teu código que o go fmt não deteta.
Também podes dar uma olhadela ao go vet, que te avisa sobre potenciais problemas no teu código.
Lê e tem em conta os comentários frequentes das revisões de código.
Num exercício que envolva concorrência, experimenta go test -race mesmo que passe nos testes.
Tem em conta a legibilidade, mesmo que otimizes para o desempenho nos benchmarks.
Às vezes, a otimização pode ajudar-te a descobrir soluções concisas e legíveis, mas pode haver a tentação de abandonar a legibilidade em busca do desempenho.
Alguns exercícios têm testes bónus que não correm apenas com go test.
Se estiveres a resolver o exercício bónus para além do exercício normal, tens de escrever go test -tags bonus, ou um comando semelhante indicado na documentação do programa de testes.