Testes em Go
TDC 2016 - São Paulo
Eduardo Bonet
$ whoami
Eduardo Bonet / Bonet
Engenheiro de Controle e Automação
Full Stack / Mobile / Data Geek
Mestrando em Ciência de Computação
ebonet.me
Agenda
Objetivos
A biblioteca Testing
TableTesting
Mocking
Testando http
Outras bibliotecas
Objetivos
Apresentar as bases para testes eficazes em Go com enfoque na biblioteca
padrão, junto com algumas alternativas.
Por que testar?
Melhora foco no desenvolvimento.
Evitar quebrar código que já está funcionando.
Verificar se máquinas estão funcionando corretamente
…….
go test
go test // testando o pacote local
go test some/pkg // testa o pacote
go test -v some/pkg -run ^TestSum$ // roda somente os testes especificados
go test --cover // Faz análise de cobertura
https://golang.org/src/cmd/go/test.go
Testes em go
Testes ficam localizados em arquivos que terminam com "_test.go"
Uma função de teste começa com Test* e tem apenas *testing.T como parâmetro
Suporte dos Plugins para testes
Suporte dos Plugins para testes
Atom (go-plus) Vim (vim-go) IntelliJ
Rodar Suites
Rodar teste específco
Cobertura de Código
Outros Keybindings para troca
rápida, macros
inteligentes para testes
Vim-go
Cobertura
Resultados de Testes
vim-go
Cobertura
IntelliJ
Resultados de Testes
IntelliJ
Exemplos: Blackjack
Black Jack
Cartas do baralho.
Cartas de 2 a 9 valem o valor da carta
Figuras (Rei, Dama ou Valete) valem 10 pontos.
Ás vale 11
Com um Ás e uma Figura temos Blackjack
Se as cartas somarem mais que 21 é um "Burst".
Implementando Testes - Cálculo do Score
Uma mão é representada por uma string, cada char é uma carta.
[master] blackjack_test.go
[master] blackjack_test.go
M
UITA
REPETIÇÃO
[master] blackjack_test.go
Table Testing
Usar structs anônimas para representar casos de testes
[master] blackjack_test.go
[master] blackjack_test.go
[master] blackjack_test.go
[master] blackjack_test.go
Funções auxiliares
Testando Floats
[master] main_test.go
Funções auxiliares
Testando Floats
[master] main_test.go
PRECISÃO
NUM
ÉRICA
Funções auxiliares
Testando Floats corretamente
[master] main_test.go
Funções auxiliares
valor, existe := mapa["key"]
[master] main_test.go
Testando HTTP - BlackJack
Queremos criar uma API para o nosso app:
GET /blackjack
● Parâmetros
○ hand [string] : String representando a mão do jogador
● Retornos
○ [422], se 'hand' não estiver presente
○ [422], se 'hand' for inválida
○ [200, resultado] se a mão for válida
Testando HTTP - BlackJack
[master] blackjack.go
Testando HTTP - BlackJack
https://golang.org/pkg/net/http/httptest/
Pacote utilitário para testar chamadas http.
Em especial, provê a struct *ResponseRecorder, que implementa a interface
*ResponseWriter
Testando HTTP - BlackJack
[master] blackjack_test.go
Testando HTTP - BlackJack
[master] blackjack_test.go
Outras Bibliotecas
Ginkgo
http://onsi.github.io/ginkgo/ (1075 )
BDD
Funciona com go test, mas possui implementação própria
Usa Gomega para assertion
Auto-run
ginkgo
Testando Scoring [code]
ginkgo
Table Testing [code]
Ginkgo - Resultados
GoConvey
http://goconvey.co/ (2334 )
BDD
Interface com o browser
Auto run
"DSL" própria
goconvey
Testando Scoring [code]
goconvey
Table Testing [code]
goconvey
Resultados
goconvey
Resultados
Testify
https://github.com/stretchr/testify (2025 )
Roda como se fosse testes normais pelo go test
Conjunto de funcionalidades extras
Facilita mocking
Conclusão
Testar em GO não é difícil
Para microserviços, a biblioteca padrão é mais que suficiente
Para aplicações maiores, GoConvey ou Ginkgo podem trazer mais benefícios, ao
custo de perder integrações com as IDEs
Obrigado!
Duvidas e Sugestões?
Slides em ebonet.me/talks
Código em github.com/ebonet/gotesting

Testes em go