Testar na track de Go

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

Testes com o detetor de corridas de dados

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

Correr benchmarks

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.

Exemplos testáveis

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.

Go fmt

Corre o go fmt no teu código antes de o submeteres.

Dicas e sugestões

Programar o exercício

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.

Corrigir

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.

Limpar o teu código

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.

Testes bónus

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.