Slide 1

Slide 1 text

Testcontainers: Elevando o nível dos seus testes de integração GopherCon Brasil 2023

Slide 2

Slide 2 text

Os palestrantes

Slide 3

Slide 3 text

01 A real importância dos testes Agenda 02 Estratégias de teste 03 E onde entra o Testcontainers? 04 Testcontainers e Go 05 Demo Time! 06 Conclusão

Slide 4

Slide 4 text

A real importância dos testes 01 * Baseado em fatos reais

Slide 5

Slide 5 text

Anatomia do Desenvolvedor Agostinho Faz deploy na sexta-feira as 17 hrs 1300 arquivos alterados em um único Pull Request Meu código é perfeito. Testar para quê? Desabilita o lint nos arquivos _test.go

Slide 6

Slide 6 text

“Desenvolvedores profissionais testam seu código” The Clean Coder, Uncle Bob. “Os testes mostram a presença e não a ausência de bugs” Dijkstra.

Slide 7

Slide 7 text

Não custa nada reforçar… Arquitete sua suíte de testes e os desenvolva com o mesmo zelo aplicado no código de produção Testes nos protegem de nossas próprias alterações. Testes aceleram o processo de desenvolvimento de software

Slide 8

Slide 8 text

Estratégias de teste 02 Cone, pirâmide, losango e troféu

Slide 9

Slide 9 text

Estratégia, do grego estrategia Cone Pirâmide Ice Cream Cone Pyramid * Fonte das ilustrações: https://web.dev/ta-strategies/

Slide 10

Slide 10 text

Mais uma do Uncle Bob. “The pyramid is based on the assumption that broad-stack tests are expensive, slow, and brittle compared to more focused tests, such as unit tests. While this is usually true, there are exceptions. If my high level tests are fast, reliable, and cheap to modify - then lower-level tests aren't needed.” Fonte: https://martinfowler.com/bliki/TestPyramid.html

Slide 11

Slide 11 text

Testes de Integração O propósito dos Testes de Integração é validar se as unidades que compõem um fluxo funcionam quando conectadas. O que é mais valioso: Cobertura ou Qualidade? Testes de Integração ou de Unidade?

Slide 12

Slide 12 text

Testes Unitários são legais! Só que muitas vezes não são suficientes. ✔ 2 unit tests passed

Slide 13

Slide 13 text

Dito isso, voltamos a discutir Estratégias de Testes. Losango Troféu Honeycomb Trophy

Slide 14

Slide 14 text

E onde entra o Testcontainers? 03 Since 2015

Slide 15

Slide 15 text

Histórico Criado para gerenciar as dependências externas de Testes de Integração de maneira simples Testcontainers não é sobre “testar containers” mas “testar com containers”. É um projeto open-source iniciado em 2015 por Richard North

Slide 16

Slide 16 text

No início, havia uma ideia…

Slide 17

Slide 17 text

E se pudéssemos… usufruir das vantagens dos testes unitários em testes de integração? 😳

Slide 18

Slide 18 text

E se eu te dissesse…? testes que executam rápidamente testes de integração

Slide 19

Slide 19 text

"SIM" velocidade livre de mocks

Slide 20

Slide 20 text

Ainda não me convenceu. Afinal… Posso gerenciar as dependências dos meus testes com docker, sem o Testcontainers Posso usar uma base de dados in-memory para testar

Slide 21

Slide 21 text

Como o Testcontainers se comunica com o Docker? docker client

Slide 22

Slide 22 text

Quem utiliza Testcontainers?

Slide 23

Slide 23 text

Testcontainers e Go 04 Clone & Run!

Slide 24

Slide 24 text

Testcontainers e Go A implementação provê portas randômicas, inicialização/remoção/cleanup dos containers. Conta com 2.4k estrelas no Github além de ser listado no awesome-go. Módulos!

Slide 25

Slide 25 text

Módulos Mas e se não houver um módulo para a tecnologia que eu preciso? Os módulos disponíveis em Golang podem ser listados na documentação e incluem Postgres, MongoDB, Redis, K3s, WireMock (experimental) entre outros. Generic Container

Slide 26

Slide 26 text

Mas e as migrations? E se houverem muitas dependências? Aposto que você deve estar se perguntando… docker-compose

Slide 27

Slide 27 text

Ryuk Responsável pela remoção de recursos Docker criados durante a execução dos testes O Ryuk é um container auxiliar, iniciado automaticamente.

Slide 28

Slide 28 text

Demo Time! https://github.com/vinitius/gopherconbr23_testcontainers_demo 05 Show me the code

Slide 29

Slide 29 text

Conclusão 06 Quase acabando!

Slide 30

Slide 30 text

● Simplicidade ○ Na implementação, evolução e manutenção ○ Na execução: tanto no CI/CD quanto localmente ● Feedback rápido ● Aumento da produtividade ● Flexibilidade ● Testes auto contidos ● Conflitos de porta evitados ● Paralelismo ● Recursos como Waiting Strategies ● Isolamento

Slide 31

Slide 31 text

Agradecemos a atenção! /in/andreiacamila/ /in/vinitius/ /gopherconbr23_testcontainers_demo Referências Testcontainers Golang Testcontainers with Sergei Egorov Martin Fowler blog Testcontainers talk Artigo da hora