Slide 1

Slide 1 text

Continuous Delivery com Jenkins e Watir Guilherme Nogueira - Software Craftsman @ Elo7 31º Encontro GURU-SP - 14/09/2013 @nirev - guilherme.nogueira@elo7.com

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

@nirev guilherme.nogueira@elo7.com

Slide 4

Slide 4 text

Continuous Delivery Desenvolvimento constante Builds regulares Testes automatizados Sempre pronto para deploy @nirev guilherme.nogueira@elo7.com

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

E o Deploy... The BADGER explosion on April 18, 1953, Nevada Test Site. Fed. Gov. USA

Slide 8

Slide 8 text

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 · ·

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Ooops. @nirev guilherme.nogueira@elo7.com

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Passando todos os testes de Selenium pra Watir Tempo pra rodar tudo: 15-20 min @nirev guilherme.nogueira@elo7.com

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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 · ·

Slide 18

Slide 18 text

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 · ·

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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. ·

Slide 21

Slide 21 text

Erros de Timeout Solução: @nirev guilherme.nogueira@elo7.com Criar slaves num cluster do Jenkins, exclusivos para rodar os testes de aceitação. ·

Slide 22

Slide 22 text

Cluster Jenkins Jenkins -> Manage nodes -> Add node @nirev guilherme.nogueira@elo7.com

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Cluster Jenkins @nirev guilherme.nogueira@elo7.com

Slide 25

Slide 25 text

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 · ·

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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 ·

Slide 28

Slide 28 text

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 ·

Slide 29

Slide 29 text

Resultado final @nirev guilherme.nogueira@elo7.com

Slide 30

Slide 30 text

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!

Slide 31

Slide 31 text

Obrigado! Blog técnico Elo7: craftedbits.wordpress.com @nirev guilherme.nogueira@elo7.com