Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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 - [email protected]
  2. O que é a Elo7? @nirev [email protected] 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. Primeiros testes de aceitação Funcionou! Mas... @nirev [email protected] 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 · ·
  4. Problemas Execução manual =( Difícil de escrever testes modulares Timeout

    para encontrar elementos na página Testes falhando sem sabermos o porquê.. @nirev [email protected]
  5. 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
  6. Testes com Watir e Rspec @nirev [email protected] 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
  7. Passando todos os testes de Selenium pra Watir @nirev [email protected]

    $ 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
  8. Passando todos os testes de Selenium pra Watir Helpers para

    ações comuns @nirev [email protected] 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
  9. Aumentando a cobertura de aceitação Também passamos a usar o

    Joaquim @nirev [email protected] $ g r e p ' i t " ' * . r b | w c - l 1 3 2
  10. Deploy longo, novamente. 30 min+ pra passar tudo aceitação, sem

    erros Com erros, retry local, baby-sitting: a tarde inteira =( @nirev [email protected] Erros de timeout Retries infinitos · ·
  11. Peraí! O que queremos? Pipeline desenvolvimento Pipeline deploy Metas: @nirev

    [email protected] Testes de Aceitação: 10 min Pipeline deploy: 20 - 30 min · ·
  12. Melhorando o tempo do teste de aceitação Resolver erros de

    Timeout Testes devem rodar em paralelo Reduzir o tempo dos maiores testes @nirev [email protected]
  13. Erros de Timeout Estudo: Conclusão: @nirev [email protected] 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. ·
  14. Erros de Timeout Solução: @nirev [email protected] Criar slaves num cluster

    do Jenkins, exclusivos para rodar os testes de aceitação. ·
  15. 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 [email protected]
  16. Testes em paralelo Problema: @nirev [email protected] 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 · ·
  17. Testes em paralelo Solução: @nirev [email protected] 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
  18. Testes longos demorando muito Problema: @nirev [email protected] Testes com muitos

    casos, que precisam de várias condições iniciais diferentes, demoram muito ·
  19. Testes longos demorando muito Solução: Resultado: @nirev [email protected] Criar depêndencias

    utilizando ActiveRecord, e só fazer a aceitação do que interessa. · Redução média de 50% do tempo ·
  20. Recapitulando @nirev [email protected] 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!