Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Paralelize seus testes web e mobile para ter feedbacks mais rápidos

423 views

Published on

Workshop ministrado no Agile Brazil 2018 sobre criação da abordagem de testes paralelos para web e mobile no dia 05/10/2018. Repositório em https://github.com/eliasnogueira/workshop-ab-2018

Published in: Technology
  • Login to see the comments

Paralelize seus testes web e mobile para ter feedbacks mais rápidos

  1. 1. PARALELIZE SEUS TESTES WEB E MOBILE PARA TER FEEDBACKS MAIS RÁPIDOS @eliasnogueira
  2. 2. Problemas na execução de testes automatizados para web Tempo de execução dos testes Compatibilidade dos browsers/dispositivos
  3. 3. Solução: Grid
  4. 4. W E B
  5. 5. Grid Hub Nós
  6. 6. Script de Teste Envia Capacidades NÓ Windows NÓ MacOSX NÓ Linux HUB Entende a capacidade e envia para o nó correto
  7. 7. NÓ Windows NÓ MacOSX NÓ Linux
  8. 8. Local Utiliza máquinas dentro da nossa infraestrutura, podendo ser uma máquina real ou virtual. Nuvem Utiliza serviços na nuvem para criar e conectar máquinas. Containers Utilizar containers e o suporte a orquestração para a criação de grid sob demanda. Formas de criar uma grid web
  9. 9. O que é Paralelismo? 1 maven-surefire-plugin Junit experimental ParallelComputer 3 TestNG suite 2 Formas de criar
  10. 10. • Depende de infraestrutura física • Dificuldade de escalar • Requer manutenção (atualizações) Problema com o grid web local
  11. 11. Solução proposta Com o TestNG conseguimos inserir parâmetros da suíte de teste em xml para os scripts de teste, removendo dependência direta de browsers no script. Com Docker podemos utilizar containers como hub e como nós, e utilizar quantos containers forem necessários para as execuções de teste. TestNG
  12. 12. SCONTAINERS SELENIUM • Containers separados para hub e nós • selenium-hub • selenium-node-chrome • selenium-node-firefox • Necessidade de criar containers adicionais para melhora do paralelismo • Containers através da imagem elgalu/selenium • Auto-escala de containers baseado na quantidade de testes que será recebido • Live Preview com VNC • Gravação de Vídeos • Dashboard
  13. 13. Suite de Teste HUB 2 testes Google Chrome Execução sem auto-escala
  14. 14. Suite de Teste HUB 4 testes Google Chrome Esperando 2 slots free.... Execução sem auto-escala
  15. 15. Suite de Teste HUB 4 testes Google Chrome Execução sem auto-escala
  16. 16. Suite de Teste HUB 4 testes Google Chrome Execução com auto-escala
  17. 17. Suite de Teste HUB 4 testes Google Chrome Execução com auto-escala
  18. 18. Suite de Teste HUB Execução com auto-escala
  19. 19. Exemplo do paralelismo - código @BeforeMethod @Parameters("browser") public void preCondicao(@Optional("chrome") String browser) { driver = getDriver(browser); } <suite name="Build Dev" parallel="tests" thread-count="99"> <test name="Execução Chrome"> <parameter name="browser" value="chrome"/> <classes> <class name="test.ReservarQuartoTest" /> </classes> </test> </suite>
  20. 20. Exemplo do paralelismo - código @BeforeMethod @Parameters("browser") public void preCondicao(@Optional("chrome") String browser) { driver = getDriver(browser); } <suite name="Build Dev" parallel="tests" thread-count="99"> <test name="Execução Chrome"> <parameter name="browser" value="chrome"/> <classes> <class name="test.ReservarQuartoTest" /> </classes> </test> </suite> Indicando que o paralelismo é por testes na classe de teste
  21. 21. Exemplo do paralelismo - código @BeforeMethod @Parameters("browser") public void preCondicao(@Optional("chrome") String browser) { driver = getDriver(browser); } <suite name="Build Dev" parallel="tests" thread-count="99"> <test name="Execução Chrome"> <parameter name="browser" value="chrome"/> <classes> <class name="test.ReservarQuartoTest" /> </classes> </test> </suite> Verifica associação do parâmetro Insere o valor do parâmetro no teste
  22. 22. Exemplo do paralelismo - código @BeforeMethod @Parameters("browser") public void preCondicao(@Optional("chrome") String browser) { driver = getDriver(browser); } <suite name="Build Dev" parallel="methods" thread-count="99"> <test name="Execução Chrome"> <parameter name="browser" value="chrome"/> <classes> <class name="test.ReservarQuartoTest" /> </classes> </test> </suite> Se a execução não for via suíte, executa no Google Chrome
  23. 23. Exemplo do auto-escala Zalenium # Pull docker-selenium docker pull elgalu/selenium # Pull Zalenium docker pull dosel/zalenium # Run Zalenium docker run --rm -ti --name zalenium -p 4444:4444 -v /var/run/docker.sock:/var/run/docker.sock -v /tmp/videos:/home/seluser/videos --privileged dosel/zalenium start --screenWidth 1366 --screenHeight 768 --timeZone "America/Sao_Paulo” --desiredContainers 2 --maxDockerSeleniumContainers 10 --maxTestSessions 1
  24. 24. Ganhos reais min Tempo atual para executar uma suíte com 61 testes em uma grid de 20 nós. min Tempo com abordagem de execução local (sequencial) de uma suíte com 61 testes. Tempo de execução para 15 suítes com 394 testes em grid min
  25. 25. ProTip: Criar uma estratégia de execução de testes em grid • Dividir a execução em diversas suítes de teste • Criar suítes de smoke e execute-as primeiro • Entender a carga de execução (números de testes) e defina a sua infraestrutura (nós)
  26. 26. Suíte de Testes 90 testes 90 testes 30 min 90 testes 30 min 90 testes 30 min Tempo total: 30 min
  27. 27. Suíte de Testes 30 testes 30 testes 10 min 30 testes 10 min 30 testes 10 min Tempo total: 10 min Suíte de Testes 30 testes Suíte de Testes 30 testes
  28. 28. M O B I L E
  29. 29. Desafios: Foco no tipo de apps HTML/Browser Híbrido Nativo
  30. 30. Desafios: Fragmentação Android Versão Codename AP I Distribuição 2.3.3 – 2.3.7 Gingerbread 10 0.6% 4.0.3 – 4.0.4 Ice cream Sanduich 15 0.6% 4.1.x Jelly Bean 16 4.2.x 17 4.3 18 4.4 KitKat 19 5.0 Lollipop 21 5.1 22 6.0 Marshmallow 23 7.0 Nougat 24 7.1 25 Gingerbread 0% Ice Cream 1% Jelly Bean 7% KitKat 15% Lollipop 29% Marshmallow 32% Nougat 16%
  31. 31. Desafios: Fragmentação iOS Anteriores 2% iOS 9 9% iOS 10 89%
  32. 32. Desafios: Fragmentação dispositivos 16 iOS 24,093 Android
  33. 33. Desafios: Tamanho de tela
  34. 34. Desafios: Foco na execução vs vs Cloud vs Device vs Emulator
  35. 35. Desafios: Muitas frentes para testar https://www.ministryoftesting.com/2012/06/getting-started-with-mobile-testing-a-mindmap/
  36. 36. Problema Execução automatizada de teste é feita ”um a um” Não há uma rápida resposta à cobertura de restrições Fabricante Tamanho de tela Versão de plataforma
  37. 37. Script de Teste Nó 01 Nó 02 HUB
  38. 38. O que eu preciso • Selenium Server [1] • Instalação do Appium via npm [2] • Dispositivos emulados ou reais • Script de Teste com: • Suporte a execução paralela (TestNG) • Arquitetura de teste que suporte a execução paralela • Criação do driver (execução no dispositivo sob demanda) [1] http://www.seleniumhq.org/download/#mainContent [2] https://www.npmjs.com/package/appium
  39. 39. Passos para iniciar a grid • Iniciar Selenium Grid como role hub • Iniciar os nós (dispositivos) • Apontando para a URL e porta da GRID • Com portas do Appium (-p) e Bootstrap (-bp) diferentes dos demais • Informando o udid do dispositivo
  40. 40. Script de Teste TestNG Selenium GRID http://192.168.1.31:4444 Nó 01 http://192.168.1.34:4723 Nó 02 http://192.168.1.35:4724 registra na grid -> <- executa teste arquivo .json arquivo .json registra na grid -> <- executa teste Informar alvos (nomes dispositivos) para execução
  41. 41. Iniciando a grid $ java -jar selenium-server-standalone-3.9.1.jar -role hub -hubConfig grid.json { "port": 4444, "newSessionWaitTimeout": -1, "servlets" : [], "withoutServlets": [], "custom": {}, "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher", "throwOnCapabilityNotPresent": true, "cleanUpCycle": 2000, "role": "hub", "debug": false, "browserTimeout": 0, "timeout": 1800 } grid.json
  42. 42. Iniciando a grid $ java -jar selenium-server-standalone-3.9.1.jar -role hub -hubConfig grid.json { "port": 4444, "newSessionWaitTimeout": -1, "servlets" : [], "withoutServlets": [], "custom": {}, // demais configurações ignoradas grid.json
  43. 43. Iniciando os nós $ appium --nodeconfig json/android-6.json -p 4723 -bp 5523 -U emulator-5554 { "capabilities": [ { "browserName":"Android Marshmallow", "version":"6.0", "platform":"ANDROID", "maxInstances": 1 } ], "configuration": { "cleanUpCycle":2000, "timeout":20000, "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", "url": "http://127.0.0.1:4723/wd/hub", "host": "127.0.0.1", "port": 4723, "maxSession": 1, "register": true, "registerCycle": 1000, "hubPort": 4444, "hubHost": "192.168.0.102", "session-override": true } } android-6.json
  44. 44. Iniciando os nós $ appium --nodeconfig json/android-6.json -p 4723 -bp 5523 -U emulator-5554 android-6.json { "capabilities": [ { "browserName":"Android Marshmallow", "version":"6.0", "platform":"ANDROID", "maxInstances": 1 } ],
  45. 45. Iniciando os nós $ appium --nodeconfig json/android-6.json -p 4723 -bp 5523 -U emulator-5554 android-6.json { "configuration": { "cleanUpCycle":2000, "timeout":20000, "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", "url": "http://127.0.0.1:4723/wd/hub", "host": "127.0.0.1", "port": 4723,
  46. 46. Iniciando os nós $ appium --nodeconfig json/android-6.json -p 4723 -bp 5523 -U emulator-5554 android-6.json "host": "127.0.0.1", "port": 4723, "maxSession": 1, "register": true, "registerCycle": 1000, "hubPort": 4444, "hubHost": "192.168.0.102", "session-override": true } }
  47. 47. Referências Paralelismo com maven-surefire-plugin https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html Paralelismo com TestNG suite http://testng.org/doc/documentation-main.html#parallel-tests Paralelismo com JUnit experimental ParallelComputer http://techblog.constantcontact.com/software-development/parallelizing-junit-test-execution/ Docker Selenium https://github.com/SeleniumHQ/docker-selenium Zalenium https://opensource.zalando.com/zalenium/ Elgalu https://github.com/elgalu/docker-selenium

×