Testando API's de forma unitária
mocando as dependências.
Marcelo Aymone
Desenvolvedor de software na
Neoway
“Accept interfaces, return structs.”
type userStorage interface {
Get(id string) (*domain.User, error)
Insert(user *domain.User) (*domain.User, error)
}
type userService struct {
storage userStorage
}
func NewService(s userStorage) *userService {
return &userService{
storage: s,
}
}
func (u *userService) FindID(id string) (*domain.User, error) {
return u.storage.Get(id)
}
func (u *userService) Create(user *domain.User) (*domain.User, error) {
if err := user.Validate(); err != nil {
return nil, err
}
return u.storage.Insert(user)
}
type userStorageMock struct {
GetFn func(id string) (*domain.User, error)
InsertFn func(user *domain.User) (*domain.User, error)
}
func (s *userStorageMock) Get(id string) (*domain.User, error) {
return s.GetFn(id)
}
func (s *userStorageMock) Insert(user *domain.User) (*domain.User, error) {
return s.InsertFn(user)
}
expectedId := "userID"
userMock := &userStorageMock{
GetFn: func(id string) (*domain.User, error) {
assert.Equal(t, expectedId, id)
return &domain.User{
ID: id,
}, nil
},
}
userService := user.NewService(userMock)
Integração
Unidade
Lento
RápidoUnitários
Integração
Aceitação
Manual
Links
http://idiomaticgo.com/post/best-practice/accept-interfaces-return-structs/
https://medium.com/@cep21/what-accept-interfaces-return-structs-means-in-go-2fe879e25ee8
https://martinfowler.com/articles/practical-test-pyramid.html
https://blog.golang.org/cover
https://travis-ci.org/
https://goreportcard.com/
https://codeclimate.com/
Marcelo Bertholdt Aymone
mbaymone@gmail.com
linkedin.com/in/marceloaymone
github.com/aymone/api-unit-test

Testando API's de forma unitária mocando as dependências

Editor's Notes

  • #2 TERMINAL make start ABAS APRESENTAÇÃO REPOSITORIO GO COVER TRAVIS GO REPORT CODE CLIMATE
  • #3 Objetivos da talk: Falar sobre algumas técnicas para facilitar a testabilidade do código de uma api, como: Uso de interfaces Injeção de dependências Mocks Perguntas: Quem trabalha com GO Quem usa testes unitarios
  • #4 Sobre mim: +- 2 anos trabalhando com GO. Atualmente trabalho em softwares relacionados a inteligência de dados em big data. Trabalhei na chaordic / linx e outras empresas menores em projetos de ecommerce. Formação técnica em 2007 em processamento de dados.
  • #5 Promove a coesão, não acopla a um tipo Específica o contrato a ser cumprido pelo parâmetro injetado. Não aplicar a tudo. Bala de prata não existe. Facilita testes, mocar as dependências => Próximo slide
  • #7 Implementação dos métodos do serviço, usando as dependências exigidas pela interface
  • #8 MOCKS Implementa a mesma interface da implementação real Isola o escopo da camada de teste, remove as dependências de outras camadas. Controle sobre o comportamento da dependência mockada.
  • #10 O jack chan é o próprio dublê, igual a testar o código em produção.
  • #13  Roteiro: domain/user.go and unit test domain/user/user.go service, dependency injection, mock, proxy, stub, and unit test Próximo slide: Meme titanic -> testes unitários não bastam.
  • #14 Não confie apenas em testes unitários Testes unitários testam partes, mas não o todo. Use testes de integração e aceitação Próximo slide!
  • #15 Pirâmide de testes O conceito da pirâmide de testes veio de um livro de agile, aparece em alguns posts do martin fowler. velocidade de execução x velocidade de implementação executar quantas vezes, implementar quantas vezes? Código storage/user and integration tests, database drop main and service injections server/user and http unit tests dependency injection, mock, proxy, stub, and unit test server/user and http acceptance tests
  • #16 Mostrar o cover gerado pelo go tool cover
  • #17 travis code climate go report
  • #19 Agradecimentos A organização do TDC Coordenadores da trilha Quem está assistindo