SlideShare a Scribd company logo
1 of 44
Download to read offline
Boas práticas e
sobrevivência com VCR no
Rspec
Fabio Perrella (@fabioperrella)
Agenda
- Teorias
- Dicas
- Dores
Por que testes integrados?
O que são?
> Testes que batem no banco, nas apis, caches, etc.. (sem mocks/stubs)
Vantagens
> Testar de verdade!
Desvantagens
> Dificuldade na setup dos testes
> Dificuldade na manutenção dos testes
> Maior tempo de execução
Por que usar a gem VCR?
- Testes não dependem do estado das suas dependências
- Testes não dependem de estar conectado na internet/vpn
- Automatiza a criação dos mocks (cassetes)
- Melhora performance dos testes
- Serve de “documentação” das chamadas de api que são feitas
Configurações recomendadas
Com isso, vai quebrar o teste se for feito uma requisição inesperada!
Para facilitar o uso do VCR
Nas versões antigas (<4) precisa da conf abaixo, nas novas não!
Config.configure_rspec_metadata!
Com isso é possível usar o :vcr nos cenários
Permita rodar os testes sem VCR
- Cassetes podem ficar obsoletos
- Bom para testes integrados no CI
http://milhouseonsoftware.com/2015/01/14/temporarily-disable-vcr/
Idempotência dos testes com VCR
Em cada teste gravado com VCR, deve ser possível deletar o cassete e
regravá-lo novamente sem precisar mexer no teste (treta!)
Ex: teste de deleção de site
- (setup) deleta o site x se existir (para garantir a idempotência)
- (setup) cria o site x (para poder deletar)
- (exercise) deleta o site
- (verify) verifica se foi deletado
Cuidado com a ordem de execução
No Rspec é recomendado o uso do config.order = 'random'
Se houver algum cache (de service-ticket por exemplo), ele pode fazer o teste
quebrar dependendo da ordem que rodar.
Ex:
Teste 1: faz requisição para gerar ticket, faz requisição na api com ticket
Teste 2: usa ticket cacheado, faz requisição na api com ticket
Se rodar o 2 antes, vai falhar pois este não esperava a req p/ gerar o ticket.
> Desabilite os caches nos testes! (memoization tambem pode ser cache!)
Exemplo de problema com cache
Cuidado com as factories que usam “sequences”
Factories (da gem factory_bot) que usam sequences podem ter os valores dos
campos diferentes dependendo da ordem dos testes.
> Para evitar, setar valor fixo
Prefira (assumindo que o login é uma sequence na factory de site):
site = create(:site, login: ‘lalapopo’)
E não:
site = create(:site)
Filtrando url das APIs
Facilita troca da URL (ou até da porta) sem precisar regravar cassetes
Filtro customizado para ignorar params dinâmicos
Exemplo:
Neste caso, não temos controle sobre qual product_id será postado!
Fazendo o filtro
Remote Factory
https://code.locaweb.com.br/paas/remote_factory
Como descobrir onde está o arquivo do cassette?
1) Usando a busca “fuzzy search” do editor (no sublime: ctrl + p)
Dica extra para copiar o path do arquivo fácil!
Plugin Copy Filepath With Line Numbers (Sublime)
https://packagecontrol.io/packages/Copy%20Filepath%20With%20Line%20Numb
ers
Adicionar key binding:
Como descobrir onde está o arquivo do cassette
2) Usando VCR.current_cassette.file
Como visualizar chamadas do VCR com
colapse
Ctrl + k + 3 (sublime)
Grep no terminal
Ignorando diff de arquivos nos MRs (gitlab)
Criar arquivo .gitattributes
https://git-scm.com/docs/gitattributes
Como resolver o erro “An HTTP request
has been made that VCR does not know
how to handle”
Script
- mv VCR_FILE VCR_FILE-2
- Rodar teste para gravar VCR novamente
- diff VCR_FILE VCR_FILE-2
Dicas
- Provavelmente mudou algo no uri ou no body de algum request
- Focar na 1a diferença que achar no diff
Usando o debug_logger
Aprendi isso ao preparar os slides!
Usando o Webmock have_requested
No spec_helper.rb
https://www.rubydoc.info/github/bblimke/webmock/WebMock/Matchers
No teste
Quando o teste não é
idempotente :(
Pelo menos tente deixar claro isso!
Dúvidas?
ítems para adicionar
- Cuidado quando editar o IT ou CONTEXT de um teste (precisa renomear o
cassette ou regravá-lo)
- Ter rotina para regravar os cassettes frequentemente
- Como limpar cassettes que não são mais usados:
https://github.com/vcr/vcr/issues/283

More Related Content

What's hot

What's hot (20)

AWS Direct Connect フェイルオーバーテストやってみた
AWS Direct Connect フェイルオーバーテストやってみたAWS Direct Connect フェイルオーバーテストやってみた
AWS Direct Connect フェイルオーバーテストやってみた
 
AWS Cloud Cost Optimization
AWS Cloud Cost OptimizationAWS Cloud Cost Optimization
AWS Cloud Cost Optimization
 
Reduce Costs and Build a Strong Operational Foundation with the AWS Migration...
Reduce Costs and Build a Strong Operational Foundation with the AWS Migration...Reduce Costs and Build a Strong Operational Foundation with the AWS Migration...
Reduce Costs and Build a Strong Operational Foundation with the AWS Migration...
 
Azure Cloud PPT
Azure Cloud PPTAzure Cloud PPT
Azure Cloud PPT
 
[NEW LAUNCH!] Scaling Tightly-coupled HPC workloads on HPC with Elastic Fabri...
[NEW LAUNCH!] Scaling Tightly-coupled HPC workloads on HPC with Elastic Fabri...[NEW LAUNCH!] Scaling Tightly-coupled HPC workloads on HPC with Elastic Fabri...
[NEW LAUNCH!] Scaling Tightly-coupled HPC workloads on HPC with Elastic Fabri...
 
AWS와 함께하는 클라우드 컴퓨팅 (강철 AWS 매니저) :: AWS 기초 교육 온라인 세미나
AWS와 함께하는 클라우드 컴퓨팅 (강철 AWS 매니저) :: AWS 기초 교육 온라인 세미나AWS와 함께하는 클라우드 컴퓨팅 (강철 AWS 매니저) :: AWS 기초 교육 온라인 세미나
AWS와 함께하는 클라우드 컴퓨팅 (강철 AWS 매니저) :: AWS 기초 교육 온라인 세미나
 
Azure Functions VS AWS Lambda: overview and comparison
Azure Functions VS AWS Lambda: overview and comparisonAzure Functions VS AWS Lambda: overview and comparison
Azure Functions VS AWS Lambda: overview and comparison
 
Deep Dive - Amazon Elastic MapReduce (EMR)
Deep Dive - Amazon Elastic MapReduce (EMR)Deep Dive - Amazon Elastic MapReduce (EMR)
Deep Dive - Amazon Elastic MapReduce (EMR)
 
AWS Differentiator - AWS Partner Summit Mumbai 2018.pdf
AWS Differentiator - AWS Partner Summit Mumbai 2018.pdfAWS Differentiator - AWS Partner Summit Mumbai 2018.pdf
AWS Differentiator - AWS Partner Summit Mumbai 2018.pdf
 
Introduction to SaltStack
Introduction to SaltStackIntroduction to SaltStack
Introduction to SaltStack
 
Aws storage
Aws storageAws storage
Aws storage
 
Optimize Cost Efficiency on AWS
Optimize Cost Efficiency on AWSOptimize Cost Efficiency on AWS
Optimize Cost Efficiency on AWS
 
20201118 AWS Black Belt Online Seminar 形で考えるサーバーレス設計 サーバーレスユースケースパターン解説
20201118 AWS Black Belt Online Seminar 形で考えるサーバーレス設計 サーバーレスユースケースパターン解説20201118 AWS Black Belt Online Seminar 形で考えるサーバーレス設計 サーバーレスユースケースパターン解説
20201118 AWS Black Belt Online Seminar 形で考えるサーバーレス設計 サーバーレスユースケースパターン解説
 
AWS Summit Seoul 2023 | AWS Graviton과 함께하는 계획문제 최적화 애플리케이션 개발
AWS Summit Seoul 2023 | AWS Graviton과 함께하는 계획문제 최적화 애플리케이션 개발AWS Summit Seoul 2023 | AWS Graviton과 함께하는 계획문제 최적화 애플리케이션 개발
AWS Summit Seoul 2023 | AWS Graviton과 함께하는 계획문제 최적화 애플리케이션 개발
 
Serverless Design Patterns for Rethinking Traditional Enterprise Application ...
Serverless Design Patterns for Rethinking Traditional Enterprise Application ...Serverless Design Patterns for Rethinking Traditional Enterprise Application ...
Serverless Design Patterns for Rethinking Traditional Enterprise Application ...
 
Cloud Migration, Application Modernization, and Security
Cloud Migration, Application Modernization, and Security Cloud Migration, Application Modernization, and Security
Cloud Migration, Application Modernization, and Security
 
Managing highly virtualized environments - Presented by Softchoice and VMware
Managing highly virtualized environments - Presented by Softchoice and VMwareManaging highly virtualized environments - Presented by Softchoice and VMware
Managing highly virtualized environments - Presented by Softchoice and VMware
 
Entendiendo Iaas/Paas/Saas en Azure
Entendiendo Iaas/Paas/Saas en AzureEntendiendo Iaas/Paas/Saas en Azure
Entendiendo Iaas/Paas/Saas en Azure
 
Overview of SharePoint Server 2019 Public Preview
Overview of SharePoint Server 2019 Public PreviewOverview of SharePoint Server 2019 Public Preview
Overview of SharePoint Server 2019 Public Preview
 
Exposing services with Azure API Management
Exposing services with Azure API ManagementExposing services with Azure API Management
Exposing services with Azure API Management
 

Similar to Boas práticas e sobrevivência com vcr no rspec

PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
elliando dias
 
Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.
Thiago Rondon
 

Similar to Boas práticas e sobrevivência com vcr no rspec (20)

PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
 
PostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardoPostgreSQL Tuning: O elefante mais rápido que um leopardo
PostgreSQL Tuning: O elefante mais rápido que um leopardo
 
Cakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudouCakephp 2.0 - O que mudou
Cakephp 2.0 - O que mudou
 
Cacti
CactiCacti
Cacti
 
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
Instalação do Squid3 através da compilação do código fonte no Ubuntu 12.04/14...
 
Infrastructure Testing
Infrastructure TestingInfrastructure Testing
Infrastructure Testing
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
Squid
SquidSquid
Squid
 
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
Performance Tuning de Clusters Plone - PyConBrasil 2 (2006)
 
Azure Functions e Java: Do Desenvolvimento a Produção
Azure Functions e Java: Do Desenvolvimento a ProduçãoAzure Functions e Java: Do Desenvolvimento a Produção
Azure Functions e Java: Do Desenvolvimento a Produção
 
Praticando o Desapego: quando ignorar a dívida técnica
Praticando o Desapego: quando ignorar a dívida técnicaPraticando o Desapego: quando ignorar a dívida técnica
Praticando o Desapego: quando ignorar a dívida técnica
 
Gems para colocar seus testes no trilho
Gems para colocar seus testes no trilho Gems para colocar seus testes no trilho
Gems para colocar seus testes no trilho
 
Agile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicação
Agile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicaçãoAgile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicação
Agile Brazil 2015 - Testando na Nuvem a UI e o JavaScript de sua aplicação
 
Apresentando o CakePHP
Apresentando o CakePHPApresentando o CakePHP
Apresentando o CakePHP
 
Sapo Sessions PHP
Sapo Sessions PHPSapo Sessions PHP
Sapo Sessions PHP
 
Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.
 
Efficient rails
Efficient railsEfficient rails
Efficient rails
 
Z13 x zEC12: O que esperar? - por Luiz Carlos Orsoni
Z13 x zEC12: O que esperar? - por Luiz Carlos OrsoniZ13 x zEC12: O que esperar? - por Luiz Carlos Orsoni
Z13 x zEC12: O que esperar? - por Luiz Carlos Orsoni
 
Otimizando a execução de código-fonte PHP
Otimizando a execução de código-fonte PHPOtimizando a execução de código-fonte PHP
Otimizando a execução de código-fonte PHP
 
Mistério ou tecnologia? Paralelismo!
Mistério ou tecnologia? Paralelismo!Mistério ou tecnologia? Paralelismo!
Mistério ou tecnologia? Paralelismo!
 

More from fabio perrella

Coisas que aprendemos usando Mongoid com grande quantidade de dados
Coisas que aprendemos usando Mongoid com grande quantidade de dadosCoisas que aprendemos usando Mongoid com grande quantidade de dados
Coisas que aprendemos usando Mongoid com grande quantidade de dados
fabio perrella
 

More from fabio perrella (7)

Deixando o código mais amigável para as próximas gerações
Deixando o código mais amigável para as próximas geraçõesDeixando o código mais amigável para as próximas gerações
Deixando o código mais amigável para as próximas gerações
 
Deixando o codigo_mais_amigavel_para_as_proximas_geracoes
Deixando o codigo_mais_amigavel_para_as_proximas_geracoesDeixando o codigo_mais_amigavel_para_as_proximas_geracoes
Deixando o codigo_mais_amigavel_para_as_proximas_geracoes
 
Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado da...
Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado da...Qconsp 2016   escalando uma plataforma de e-mail transacional- aprendizado da...
Qconsp 2016 escalando uma plataforma de e-mail transacional- aprendizado da...
 
[Campus code] Boas práticas em Rails
[Campus code] Boas práticas em Rails[Campus code] Boas práticas em Rails
[Campus code] Boas práticas em Rails
 
Ruby profiling
Ruby profilingRuby profiling
Ruby profiling
 
No sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodbNo sql e as vantagens na utilização do mongodb
No sql e as vantagens na utilização do mongodb
 
Coisas que aprendemos usando Mongoid com grande quantidade de dados
Coisas que aprendemos usando Mongoid com grande quantidade de dadosCoisas que aprendemos usando Mongoid com grande quantidade de dados
Coisas que aprendemos usando Mongoid com grande quantidade de dados
 

Boas práticas e sobrevivência com vcr no rspec

  • 1. Boas práticas e sobrevivência com VCR no Rspec Fabio Perrella (@fabioperrella)
  • 2.
  • 4. Por que testes integrados? O que são? > Testes que batem no banco, nas apis, caches, etc.. (sem mocks/stubs) Vantagens > Testar de verdade! Desvantagens > Dificuldade na setup dos testes > Dificuldade na manutenção dos testes > Maior tempo de execução
  • 5. Por que usar a gem VCR? - Testes não dependem do estado das suas dependências - Testes não dependem de estar conectado na internet/vpn - Automatiza a criação dos mocks (cassetes) - Melhora performance dos testes - Serve de “documentação” das chamadas de api que são feitas
  • 6. Configurações recomendadas Com isso, vai quebrar o teste se for feito uma requisição inesperada!
  • 7. Para facilitar o uso do VCR Nas versões antigas (<4) precisa da conf abaixo, nas novas não! Config.configure_rspec_metadata! Com isso é possível usar o :vcr nos cenários
  • 8. Permita rodar os testes sem VCR - Cassetes podem ficar obsoletos - Bom para testes integrados no CI http://milhouseonsoftware.com/2015/01/14/temporarily-disable-vcr/
  • 9. Idempotência dos testes com VCR Em cada teste gravado com VCR, deve ser possível deletar o cassete e regravá-lo novamente sem precisar mexer no teste (treta!) Ex: teste de deleção de site - (setup) deleta o site x se existir (para garantir a idempotência) - (setup) cria o site x (para poder deletar) - (exercise) deleta o site - (verify) verifica se foi deletado
  • 10. Cuidado com a ordem de execução No Rspec é recomendado o uso do config.order = 'random' Se houver algum cache (de service-ticket por exemplo), ele pode fazer o teste quebrar dependendo da ordem que rodar. Ex: Teste 1: faz requisição para gerar ticket, faz requisição na api com ticket Teste 2: usa ticket cacheado, faz requisição na api com ticket Se rodar o 2 antes, vai falhar pois este não esperava a req p/ gerar o ticket. > Desabilite os caches nos testes! (memoization tambem pode ser cache!)
  • 11. Exemplo de problema com cache
  • 12. Cuidado com as factories que usam “sequences” Factories (da gem factory_bot) que usam sequences podem ter os valores dos campos diferentes dependendo da ordem dos testes. > Para evitar, setar valor fixo Prefira (assumindo que o login é uma sequence na factory de site): site = create(:site, login: ‘lalapopo’) E não: site = create(:site)
  • 13. Filtrando url das APIs Facilita troca da URL (ou até da porta) sem precisar regravar cassetes
  • 14.
  • 15. Filtro customizado para ignorar params dinâmicos Exemplo: Neste caso, não temos controle sobre qual product_id será postado!
  • 17.
  • 19. Como descobrir onde está o arquivo do cassette? 1) Usando a busca “fuzzy search” do editor (no sublime: ctrl + p)
  • 20. Dica extra para copiar o path do arquivo fácil! Plugin Copy Filepath With Line Numbers (Sublime) https://packagecontrol.io/packages/Copy%20Filepath%20With%20Line%20Numb ers Adicionar key binding:
  • 21. Como descobrir onde está o arquivo do cassette 2) Usando VCR.current_cassette.file
  • 22. Como visualizar chamadas do VCR com colapse
  • 23.
  • 24. Ctrl + k + 3 (sublime)
  • 25.
  • 27.
  • 28. Ignorando diff de arquivos nos MRs (gitlab) Criar arquivo .gitattributes https://git-scm.com/docs/gitattributes
  • 29.
  • 30.
  • 31. Como resolver o erro “An HTTP request has been made that VCR does not know how to handle”
  • 32.
  • 33.
  • 34. Script - mv VCR_FILE VCR_FILE-2 - Rodar teste para gravar VCR novamente - diff VCR_FILE VCR_FILE-2 Dicas - Provavelmente mudou algo no uri ou no body de algum request - Focar na 1a diferença que achar no diff
  • 35.
  • 36. Usando o debug_logger Aprendi isso ao preparar os slides!
  • 37.
  • 38. Usando o Webmock have_requested
  • 41. Quando o teste não é idempotente :( Pelo menos tente deixar claro isso!
  • 42.
  • 44. ítems para adicionar - Cuidado quando editar o IT ou CONTEXT de um teste (precisa renomear o cassette ou regravá-lo) - Ter rotina para regravar os cassettes frequentemente - Como limpar cassettes que não são mais usados: https://github.com/vcr/vcr/issues/283