"Dá para executar apenas um arquivo com testes?" — sim, e aqui está como fazer isso em Go
Você já ficou sentado diante do terminal, digitou go test ./... e observou com horror toda a base de código do seu projeto em Go começar a executar centenas de testes? E tudo que você precisava era verificar apenas um pequeno arquivo com casos de teste que acabou de escrever. Familiar? Se sim, você veio ao lugar certo.
Neste artigo, vamos abordar uma pergunta popular do Stack Overflow (que, aliás, tem milhares de visualizações): "How to run test cases in a specified file?". Vamos adaptar as respostas para a realidade do desenvolvedor Go e mostrar não apenas comandos básicos, mas também truques que economizarão horas de trabalho. Vamos lá!
Por que o simples go test nem sempre é adequado?
Em projetos grandes, os testes são divididos em unitários, de integração e end-to-end. Se você executar go test ./..., o Go percorre recursivamente todos os subpacotes e executa todos os testes encontrados. Isso pode levar minutos. E se você tiver testes que acessam bancos de dados ou APIs externas, eles podem falhar por motivos alheios ao seu controle. Portanto, saber executar casos de teste em um arquivo específico não é apenas uma conveniência, mas uma habilidade de um desenvolvedor profissional.
Comando básico: go test com o nome do arquivo
A maneira mais direta é especificar o arquivo de teste concreto. Mas aqui há um detalhe: o Go exige que você indique tanto o arquivo testado quanto o arquivo de teste juntos. Por quê? Porque o compilador precisa compilar todo o código do pacote.
Suponha que você tenha a seguinte estrutura de projeto:
myproject/├── main.go└── math_utils.go└── math_utils_test.goPara executar apenas os testes de math_utils_test.go, execute:
go test -v math_utils.go math_utils_test.goA flag -v (verbose) exibirá informações detalhadas sobre cada caso de teste. Sem ela, você verá apenas o resultado: PASS ou FAIL.
Exemplo de código real
Vamos criar um arquivo simples math_utils.go:
package main
func Sum(a, b int) int { return a + b}
func Multiply(a, b int) int { return a * b}E o arquivo de teste math_utils_test.go:
package main
import "testing"
func TestSum(t *testing.T) { result := Sum(2, 3) if result != 5 { t.Errorf("Sum(2, 3) = %d; want 5", result) }}
func TestMultiply(t *testing.T) { result := Multiply(3, 4) if result != 12 { t.Errorf("Multiply(3, 4) = %d; want 12", result) }}Agora executamos:
$ go test -v math_utils.go math_utils_test.go=== RUN TestSum--- PASS: TestSum (0.00s)=== RUN TestMultiply--- PASS: TestMultiply (0.00s)PASSok command-line-arguments 0.002sObserve a saída: ok command-line-arguments. Isso significa que o Go compilou um pacote temporário a partir dos arquivos especificados. Essa abordagem funciona, mas tem limitações.
Problema com vários arquivos no mesmo pacote
Se o seu pacote consiste em vários arquivos (por exemplo, math_utils.go e strings_utils.go), e o teste em math_utils_test.go chama uma função de strings_utils.go, o comando acima falhará com um erro de compilação. O Go reclamará que a função não está definida.
A solução é listar todos os arquivos dependentes. Mas isso é inconveniente. É melhor usar outra abordagem.
Maneira avançada: filtrar testes por nome (-run)
A flag -run permite executar apenas os casos de teste cujos nomes correspondem a uma expressão regular. Isso não está vinculado a um arquivo, mas se você nomeou seus testes de forma significativa, será fácil filtrar os desejados.
Exemplo: executar todos os testes que começam com TestSum:
go test -v -run T