Continuous Delivery com Jenkins e Watir

Continuous Delivery com Jenkins e Watir

Descrição de como melhoramos nosso processo de deploy ao integrar os testes de aceitação com Watir no pipeline do Jenkins, com um tempo de execução adequado.

4b178f929b750c873b4d2b0c0a682051?s=128

Guilherme de Maio, nirev

September 14, 2013
Tweet

Transcript

  1. Continuous Delivery com Jenkins e Watir Guilherme Nogueira - Software

    Craftsman @ Elo7 31º Encontro GURU-SP - 14/09/2013 @nirev - guilherme.nogueira@elo7.com
  2. O que é a Elo7? @nirev guilherme.nogueira@elo7.com Plataforma de compra

    e venda de artesanato Maior marketplace de artesanato da América Latina Mais de: · · · 105 mil artesães 1,7 milhões de produtos 1,5 buscas por segundo 7,8 milhões de visitas/mês 60 milhões de pageviews/mês - - - - - Dados: Dez/2012
  3. @nirev guilherme.nogueira@elo7.com

  4. Continuous Delivery Desenvolvimento constante Builds regulares Testes automatizados Sempre pronto

    para deploy @nirev guilherme.nogueira@elo7.com
  5. Ambiente inicial @nirev guilherme.nogueira@elo7.com Código no github · master production

    features · · ·
  6. Ambiente inicial Integração Contínua com Hudson @nirev guilherme.nogueira@elo7.com

  7. E o Deploy... The BADGER explosion on April 18, 1953,

    Nevada Test Site. Fed. Gov. USA
  8. Primeiros testes de aceitação Funcionou! Mas... @nirev guilherme.nogueira@elo7.com Selenium IDE

    Competição quem faz mais testes por Sprint · · Montamos uma suite pequena rapidamente Pegou vários bugs antes de ir pra produção · ·
  9. Problemas Execução manual =( Difícil de escrever testes modulares Timeout

    para encontrar elementos na página Testes falhando sem sabermos o porquê.. @nirev guilherme.nogueira@elo7.com
  10. Ooops. @nirev guilherme.nogueira@elo7.com

  11. Watir, pronounced water, is an open- source (BSD) family of

    Ruby libraries for automating web browsers. It allows you to write tests that are easy to read and maintain. It is simple and flexible. “ ” watir.com
  12. Testes com Watir e Rspec @nirev guilherme.nogueira@elo7.com r e q

    u i r e " r u b y g e m s " r e q u i r e " r s p e c " r e q u i r e " w a t i r - w e b d r i v e r " d e s c r i b e " g o o g l e . c o m " d o l e t ( : b r o w s e r ) { @ b r o w s e r | | = W a t i r : : B r o w s e r . n e w : f i r e f o x } b e f o r e { b r o w s e r . g o t o " h t t p : / / g o o g l e . c o m " } a f t e r { b r o w s e r . c l o s e } i t " s h o u l d s e a r c h f o r w a t i r " d o b r o w s e r . t e x t _ f i e l d ( : n a m e = > " q " ) . s e t " w a t i r " b r o w s e r . b u t t o n . c l i c k b r o w s e r . d i v ( : i d = > " r e s u l t S t a t s " ) . w a i t _ u n t i l _ p r e s e n t b r o w s e r . t i t l e . s h o u l d = = " w a t i r - G o o g l e S e a r c h " e n d e n d R U B Y
  13. Passando todos os testes de Selenium pra Watir @nirev guilherme.nogueira@elo7.com

    $ b u n d l e e x e c r a k e s p e c [ r u n _ a c c e p t a n c e _ t e s t s ] r u n n i n g t e s t s : . / c r e a t e _ p r o d u c t _ s p e c . r b . / r e g i s t e r _ a s _ s e l l e r _ s p e c . r b . / r e g i s t e r _ a s _ b u y e r _ s p e c . r b . / s t o r e _ i m a g e s _ s p e c . r b . / s e a r c h i n g _ s p e c . r b . / d e t e c t _ n o n _ s s l _ c o m p o n e n t s _ s p e c . r b . / a l b u m _ s p e c . r b . / f a v o r i t e s _ s p e c . r b . / f e a t u r e d _ s u b s c r i p t i o n _ s p e c . r b . / c a r t _ s p e c . r b . / b u y _ p r o d u c t _ s p e c . r b $ g r e p ' i t " ' * . r b | w c - l 7 4
  14. Passando todos os testes de Selenium pra Watir Helpers para

    ações comuns @nirev guilherme.nogueira@elo7.com d e f c r e a t e _ a l b u m a t t r i b u t e s a t t r i b u t e s = { n a m e : " N e w a l b u m " , i m g : " . . / r e s / u s e r _ p i c . j p g " } . m e r g e a t t r i b u t e s @ b r o w s e r . f i l e _ f i e l d ( n a m e : " i m a g e F i l e " ) . s e t F i l e . e x p a n d _ p a t h a t t r i b u t e s [ : i m g ] @ b r o w s e r . t e x t _ f i e l d ( n a m e : " a l b u m N a m e " ) . w h e n _ p r e s e n t . s e t a t t r i b u t e s [ : n a m e ] @ b r o w s e r . b u t t o n ( i d : " c r e a t e - a l b u m - s u b m i t " ) . w h e n _ p r e s e n t . c l i c k e n d d e f r e g i s t e r _ n e w _ u s e r f u l l _ n a m e , e m a i l , b i r t h _ d a t e , p a s s w d , p a s s w d _ c o n f i r m @ b r o w s e r . t e x t _ f i e l d ( : i d = > " f u l l N a m e " ) . w h e n _ p r e s e n t . s e t f u l l _ n a m e @ b r o w s e r . t e x t _ f i e l d ( : i d = > " e m a i l " ) . w h e n _ p r e s e n t . s e t e m a i l . . . @ b r o w s e r . b u t t o n ( : i d = > " s u b m i t B u t t o n " ) . w h e n _ p r e s e n t . c l i c k e n d R U B Y
  15. Passando todos os testes de Selenium pra Watir Tempo pra

    rodar tudo: 15-20 min @nirev guilherme.nogueira@elo7.com
  16. Aumentando a cobertura de aceitação Também passamos a usar o

    Joaquim @nirev guilherme.nogueira@elo7.com $ g r e p ' i t " ' * . r b | w c - l 1 3 2
  17. Deploy longo, novamente. 30 min+ pra passar tudo aceitação, sem

    erros Com erros, retry local, baby-sitting: a tarde inteira =( @nirev guilherme.nogueira@elo7.com Erros de timeout Retries infinitos · ·
  18. Peraí! O que queremos? Pipeline desenvolvimento Pipeline deploy Metas: @nirev

    guilherme.nogueira@elo7.com Testes de Aceitação: 10 min Pipeline deploy: 20 - 30 min · ·
  19. Melhorando o tempo do teste de aceitação Resolver erros de

    Timeout Testes devem rodar em paralelo Reduzir o tempo dos maiores testes @nirev guilherme.nogueira@elo7.com
  20. Erros de Timeout Estudo: Conclusão: @nirev guilherme.nogueira@elo7.com Vários browsers: firefox,

    chrome, phantomjs Máquina maior para o ambiente de integração Máquina maior para o Joaquim · · · O problema era a máquina de CI. ·
  21. Erros de Timeout Solução: @nirev guilherme.nogueira@elo7.com Criar slaves num cluster

    do Jenkins, exclusivos para rodar os testes de aceitação. ·
  22. Cluster Jenkins Jenkins -> Manage nodes -> Add node @nirev

    guilherme.nogueira@elo7.com
  23. Cluster Jenkins Custo: c1.medium # Nodes Ligada 100% Ligada apenas

    em Horas de Trabalho 1 $ 106.14 $ 49.88 2 $ 212.28 $ 99.76 3 $ 318.42 $ 149.64 4 $ 424.56 $ 199.52 @nirev guilherme.nogueira@elo7.com
  24. Cluster Jenkins @nirev guilherme.nogueira@elo7.com

  25. Testes em paralelo Problema: @nirev guilherme.nogueira@elo7.com A maioria dos testes

    utilizava um usuário padrão pra tomar certas ações e modificavam o estado dessa conta. Foi mais fácil de criar os testes no começo, mas impede que eles sejam executados em paralelo · ·
  26. Testes em paralelo Solução: @nirev guilherme.nogueira@elo7.com Todo teste deve criar

    suas depêndencias antes de ser executado. E só deve utilizar o que foi criado. · d e s c r i b e " P r o d u c t C r e a t i o n " d o l e t ( : s e l l e r ) { U s e r . c r e a t e _ s e l l e r } b e f o r e : a l l d o @ t e s t _ h e l p e r = M a r k e t P l a c e T e s t H e l p e r . s t a r t ! @ t e s t _ h e l p e r . l o g i n s e l l e r . e m a i l , s e l l e r . p a s s w o r d _ p l a i n e n d . . . a f t e r : a l l d o s e l l e r . d e s t r o y @ t e s t _ h e l p e r . f i n i s h ! e n d R U B Y
  27. Testes longos demorando muito Problema: @nirev guilherme.nogueira@elo7.com Testes com muitos

    casos, que precisam de várias condições iniciais diferentes, demoram muito ·
  28. Testes longos demorando muito Solução: Resultado: @nirev guilherme.nogueira@elo7.com Criar depêndencias

    utilizando ActiveRecord, e só fazer a aceitação do que interessa. · Redução média de 50% do tempo ·
  29. Resultado final @nirev guilherme.nogueira@elo7.com

  30. Recapitulando @nirev guilherme.nogueira@elo7.com Definição de metas para o pipeline Construção

    de testes auto-contidos Utilização do site apenas para o que é do escopo do teste. As dependências podem ser criadas por fora. Mais de uma instância do browser rodando na mesma máquina normalmente causa problemas. O tempo de execução é inverso à sua quantidade de slaves. Cultura de deploys!
  31. Obrigado! Blog técnico Elo7: craftedbits.wordpress.com @nirev guilherme.nogueira@elo7.com