O documento discute boas práticas para usar a gem VCR em testes de integração com RSpec, incluindo configurações recomendadas para VCR, cuidados com a ordem de execução dos testes e caches, e dicas para facilitar o uso e manutenção de VCR.
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
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!)
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!
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
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
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