Cobertura de testes unitários em Go

Testes unitários são incrivelmente importantes, mesmo para uma linguagem compilada como Golang eles são fundamentais.

Felizmente, hoje em dia, a maioria das linguagens de programação tem uma bela variedade de ferramentas para teste unitário. Go vem com algumas ferramentas surpreendentes, não apenas para fazer os testes mas também para analisar o código em busca de falhas na cobertura, etc.

Uma forma visual e rápida para analisar a cobertura de testes é fazer um script com go tool cover que pode ser colocado na carga do zsh ou no bash e torna muito simples fazer essa inspeção do código.

Abaixo temos um exemplo da função gocover para você colocar no seu shell favorito.

gocover () {
	t="/tmp/go-cover.$$.tmp"
	go test -coverprofile=$t $@ && \
	go tool cover -html=$t && \
    rm $t
}

Quando executada essa função gera um relatório da cobertura de testes em formato HTML e automaticamente exibe no navegador padrão da sua maquina. O que estiver em vermelho não esta coberto e o que parecer em verde esta coberto. Visualmente fica bem fácil saber onde estão as falhas de cobertura.

Eu uso gocover como nome para esse script mas idealmente deveria ser um comando com duas letras no máximo, rápido de digitar para que você use a todo momento.

Alem de analisar meu próprio código esse pequeno script ajuda muito no code review, para dar uma passada de olhos e ver o que esta com e sem cobertura.

Claro em uma linguagem como Golang você não precisa de 100% de cobertura de testes, o compilador já garante que seu código no mínimo compila.

O importante mesmo não é garantir que todas as funcionalidades estão cobertas. Tem muito código mentiroso que esta com 100% de cobertura de testes mas não testa as funcionalidades nem os casos de erro, a cobertura de testes mostra apenas que o sistema passou por ali quando estava fazendo os testes e por isso mesmo essa porcentagem não é um bom referencial da qualidade do código, serve apenas como um guia, uma dica do que esta acontecendo.

Também é importante lembrar que testes unitários é a forma mais barata validar seu código, vale a pena abusar um pouco e fazer todos os testes que você conseguir imaginar mesmo que pareçam redundantes ou improváveis.

Trabalhando apenas no terminal

Depois que migrei meu ambiente de desenvolvimento para a nuvem não tem mais como gocover abrir o navegador da maquina local porque tudo esta acontecendo no servidor. Para resolver esse problema eu fiz uma nova versão da função que salva o HTML com o relatório de cobertura em um diretório no meu servidor web e dai só tenho que acessar a URL para ver o que esta acontecendo. E para remover o relatório é só pressionar enter.

function gocover() {
    echo "Testing..."
    w="cloud.crg.eti.br"       # dominio servidor web
    f="cover-$$.html"          # arquivo cover html
    t="/tmp/go-cover.$$.tmp"
    root=~/web/root            # root do servidor web
    go test ./... -coverprofile=$t && \
        go tool cover -html=$t -o $root/$f && \ 
        rm -f $t || \
        return 1
    echo "Open https://$w/$f"
    echo "Press enter to stop"
    read
    rm -f $root/$f
}

Automatizando ainda mais com zsh

Se você usa zsh como shell tem uma forma muito boa de automatizar esse e muitos outros comandos, você pode usar o comando bindkey e criar uma combinação de teclas de atalho

bindkey -s '^X^G' 'gocover\n'

Dessa forma basta pressionar ^x^g (control x seguido de control g) para gocover ser executado para você.

Cesar Gimenes