Criando uma grid (device farm)
para execução de teste paralelo
com Appium
Elias Nogueira QA Engineer | Agile Coach, Sicredi
@eliasnogueira
http://eliasnogueira.com
Desafios
HTML/Browser Híbrido Nativo
Foco correto para cada tipo de app
Fragmentação das plataformas - Android
Desafios
Versão Codename API 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
https://developer.android.com/about/dashboards/index.html
Gingerbread
0%
Ice Cream
1% Jelly Bean
7%
KitKat
15%
Lollipop
29%
Marshmallow
32%
Nougat
16%
Fragmentação das plataformas - iOS
Desafios
https://developer.apple.com/support/appstore
Anteriores
2%
iOS 9
9%
iOS 10
89%
Fragmentação de Dispositivos
• 16 iOS
• 24,093 Android
Desafios
http://iossupportmatrix.com/ https://opensignal.com/reports/2015/08/android-fragmentation/
Tamanho de Tela
Desafios
http://iossupportmatrix.com/ https://opensignal.com/reports/2015/08/android-fragmentation/
Foco de execução
• Cloud vs Device vs Emulador
Desafios
vs vs
Diversas frentes para testar
https://www.ministryoftesting.com/2012/06/getting-started-with-mobile-testing-a-mindmap/
Definir o trabalho em conjunto com um processo
http://www.softwaretestingclass.com/introduction-to-mobile-application-testing/
Criando uma grid para
execução de teste
automatizado funcional e e2e
• 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
O problema...
Grid
Grid é uma forma de conectar todos os seus dispositivos em um
único controlador (hub).
Cada dispositivo deve ser gerenciado pelo seu serial/udid
Execução na grid
No script de teste devemos informar para qual dispositivo
(serial/udid) queremos executar o teste
Execução paralela
Uma execução paralela é aquela onde os testes selecionados são
executados em mais de um dispositivo na grid ao mesmo tempo
Como funciona um grid?
• A máquina que gerencia as execuções é chamada de hub
• As máquinas (dispositivos) que receberão o teste são
chamadas de nó
• Os nós devem se registrar no hub com uma série de
informações
Como funciona um grid?
Arquitetura base de um grid
Script de Teste
Nó 01 Nó 02
HUB
• Validação de suporte a outros idiomas
• Validação em diferentes versões de plataforma
• Validação em diferentes resoluções
• Validações em diferentes fabricantes
• Minimizar o tempo de execução de teste
Benefícios do Teste em Paralelo
• 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)
O que eu preciso?
[1] http://www.seleniumhq.org/download/#mainContent
[2] https://www.npmjs.com/package/appium
• 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
Passos para iniciar a Grid
Arquitetura base de um grid
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
$ java -jar selenium-server-standalone-3.9.1.jar -role hub -hubConfig grid.json
Iniciando a grid
{
"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
$ java -jar selenium-server-standalone-3.9.1.jar -role hub -hubConfig grid.json
Iniciando a grid
{
"port": 4444,
"newSessionWaitTimeout": -1,
"servlets" : [],
"withoutServlets": [],
"custom": {},
// demais configurações ignoradas
grid.json
$ appium --nodeconfig json/android-6.json -p 4723 -bp 5523 -U emulator-5554
Iniciando um nó
{
"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
$ appium --nodeconfig json/android-6.json -p 4723 -bp 5523 -U emulator-5554
Iniciando um nó
{
"capabilities":
[
{
"browserName":"Android Marshmallow",
"version":"6.0",
"platform":"ANDROID",
"maxInstances": 1
}
],
android-6.json
$ appium --nodeconfig json/android-6.json -p 4723 -bp 5523 -U emulator-5554
Iniciando um nó
{
"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,
android-6.json
$ appium --nodeconfig json/android-6.json -p 4723 -bp 5523 -U emulator-5554
Iniciando um nó
"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
Script de Teste + Suíte paralela
private AppiumDriver<?> driver;
@Test
@Parameters( { "platform", "udid", "platformVersion"})
public void testCalculateDefaultTip(String platform, String udid,
String platformVersion) throws Exception {
<test name="Android-AVD">
<parameter name="platform" value="android"/>
<parameter name="udid" value="emulator-5554"/>
<parameter name="platformVersion" value="7.0"/>
<classes>
<class name="com.eliasnogueira.unique_script.TipTest"/>
</classes>
</test>
Script de Teste + Suíte paralela
private AppiumDriver<?> driver;
@Test
@Parameters( { "platform", "udid", "platformVersion"})
public void testCalculateDefaultTip(String platform, String udid,
String platformVersion) throws Exception {
<test name="Android-AVD">
<parameter name="platform" value="android"/>
<parameter name="udid" value="emulator-5554"/>
<parameter name="platformVersion" value="7.0"/>
<classes>
<class name="com.eliasnogueira.unique_script.TipTest"/>
</classes>
</test>
• Use sempre uma máquina Linux
• Boa prática reiniciar o ADB em uma execução paralela
• Para device reais, use um hub USB energizado
• [Appium] Use o selenium-server < 3.8
• O Appium ainda não está suportando totalmente o protocolo no W3C
• Exception apresentada: CapabilityNotPresentOnTheGridException
Minhas recomendações
Hora do truque...
Obrigado
@eliasnogueira
http://eliasnogueira.com
https://slideshare.net/elias.nogueira
https://facebook.com/elias.nogueira.teste
https://github.com/eliasnogueira/appium-parallel-execution

Criando uma grid para execução de testes paralelo com Appium

  • 1.
    Criando uma grid(device farm) para execução de teste paralelo com Appium Elias Nogueira QA Engineer | Agile Coach, Sicredi @eliasnogueira http://eliasnogueira.com
  • 2.
    Desafios HTML/Browser Híbrido Nativo Fococorreto para cada tipo de app
  • 3.
    Fragmentação das plataformas- Android Desafios Versão Codename API 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 https://developer.android.com/about/dashboards/index.html Gingerbread 0% Ice Cream 1% Jelly Bean 7% KitKat 15% Lollipop 29% Marshmallow 32% Nougat 16%
  • 4.
    Fragmentação das plataformas- iOS Desafios https://developer.apple.com/support/appstore Anteriores 2% iOS 9 9% iOS 10 89%
  • 5.
    Fragmentação de Dispositivos •16 iOS • 24,093 Android Desafios http://iossupportmatrix.com/ https://opensignal.com/reports/2015/08/android-fragmentation/
  • 6.
    Tamanho de Tela Desafios http://iossupportmatrix.com/https://opensignal.com/reports/2015/08/android-fragmentation/
  • 7.
    Foco de execução •Cloud vs Device vs Emulador Desafios vs vs
  • 8.
    Diversas frentes paratestar https://www.ministryoftesting.com/2012/06/getting-started-with-mobile-testing-a-mindmap/
  • 9.
    Definir o trabalhoem conjunto com um processo http://www.softwaretestingclass.com/introduction-to-mobile-application-testing/
  • 10.
    Criando uma gridpara execução de teste automatizado funcional e e2e
  • 11.
    • Execução automatizadade teste é feita ”um a um” • Não há uma rápida resposta à cobertura de restrições • Fabricante • Tamanho de tela • Versão de plataforma O problema...
  • 12.
    Grid Grid é umaforma de conectar todos os seus dispositivos em um único controlador (hub). Cada dispositivo deve ser gerenciado pelo seu serial/udid Execução na grid No script de teste devemos informar para qual dispositivo (serial/udid) queremos executar o teste Execução paralela Uma execução paralela é aquela onde os testes selecionados são executados em mais de um dispositivo na grid ao mesmo tempo Como funciona um grid?
  • 13.
    • A máquinaque gerencia as execuções é chamada de hub • As máquinas (dispositivos) que receberão o teste são chamadas de nó • Os nós devem se registrar no hub com uma série de informações Como funciona um grid?
  • 14.
    Arquitetura base deum grid Script de Teste Nó 01 Nó 02 HUB
  • 15.
    • Validação desuporte a outros idiomas • Validação em diferentes versões de plataforma • Validação em diferentes resoluções • Validações em diferentes fabricantes • Minimizar o tempo de execução de teste Benefícios do Teste em Paralelo
  • 16.
    • 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) O que eu preciso? [1] http://www.seleniumhq.org/download/#mainContent [2] https://www.npmjs.com/package/appium
  • 17.
    • Iniciar SeleniumGrid 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 Passos para iniciar a Grid
  • 18.
    Arquitetura base deum grid 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
  • 19.
    $ java -jarselenium-server-standalone-3.9.1.jar -role hub -hubConfig grid.json Iniciando a grid { "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
  • 20.
    $ java -jarselenium-server-standalone-3.9.1.jar -role hub -hubConfig grid.json Iniciando a grid { "port": 4444, "newSessionWaitTimeout": -1, "servlets" : [], "withoutServlets": [], "custom": {}, // demais configurações ignoradas grid.json
  • 21.
    $ appium --nodeconfigjson/android-6.json -p 4723 -bp 5523 -U emulator-5554 Iniciando um nó { "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
  • 22.
    $ appium --nodeconfigjson/android-6.json -p 4723 -bp 5523 -U emulator-5554 Iniciando um nó { "capabilities": [ { "browserName":"Android Marshmallow", "version":"6.0", "platform":"ANDROID", "maxInstances": 1 } ], android-6.json
  • 23.
    $ appium --nodeconfigjson/android-6.json -p 4723 -bp 5523 -U emulator-5554 Iniciando um nó { "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, android-6.json
  • 24.
    $ appium --nodeconfigjson/android-6.json -p 4723 -bp 5523 -U emulator-5554 Iniciando um nó "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
  • 25.
    Script de Teste+ Suíte paralela private AppiumDriver<?> driver; @Test @Parameters( { "platform", "udid", "platformVersion"}) public void testCalculateDefaultTip(String platform, String udid, String platformVersion) throws Exception { <test name="Android-AVD"> <parameter name="platform" value="android"/> <parameter name="udid" value="emulator-5554"/> <parameter name="platformVersion" value="7.0"/> <classes> <class name="com.eliasnogueira.unique_script.TipTest"/> </classes> </test>
  • 26.
    Script de Teste+ Suíte paralela private AppiumDriver<?> driver; @Test @Parameters( { "platform", "udid", "platformVersion"}) public void testCalculateDefaultTip(String platform, String udid, String platformVersion) throws Exception { <test name="Android-AVD"> <parameter name="platform" value="android"/> <parameter name="udid" value="emulator-5554"/> <parameter name="platformVersion" value="7.0"/> <classes> <class name="com.eliasnogueira.unique_script.TipTest"/> </classes> </test>
  • 27.
    • Use sempreuma máquina Linux • Boa prática reiniciar o ADB em uma execução paralela • Para device reais, use um hub USB energizado • [Appium] Use o selenium-server < 3.8 • O Appium ainda não está suportando totalmente o protocolo no W3C • Exception apresentada: CapabilityNotPresentOnTheGridException Minhas recomendações
  • 28.
  • 29.