$30 off During Our Annual Pro Sale. View Details »

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.

Guilherme de Maio, nirev

September 14, 2013
Tweet

More Decks by Guilherme de Maio, nirev

Other Decks in Programming

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