COMO CRIAR E EXECUTAR TESTES
PARALELOS WEB USANDO
SELENIUM E CONTAINERS
@eliasnogueira
Problemas na execução de testes
automatizados para web
Compatibilidade
dos browsers
Tempo de execução
dos testes
Solução: Grid
Grid
Hub
Nós
Script de Teste
Envia Capacidades
NÓ Windows NÓ MacOSX NÓ Linux
HUB
Entende a capacidade
e envia para o nó correto
NÓ Windows NÓ MacOSX NÓ Linux
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
O que é
Paralelismo?
1
maven-surefire-plugin
Junit
experimental
ParallelComputer
3
TestNG suite
2
Formas de criar
• Depende de infraestrutura física
• Dificuldade de escalar
• Requer manutenção (atualizações)
Problema com o grid local
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
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
Suite de Teste
HUB
2 testes
Google Chrome
Execução sem auto-escala
Executa os dois testes
nos dois nós
Suite de Teste
HUB
4 testes
Google Chrome
Esperando 2 slots free....
Execução sem auto-escala
Suite de Teste
HUB
4 testes
Google Chrome
Execução sem auto-escala
Executa dos testes nos
dois nós disponíveis
Suite de Teste
HUB
4 testes
Google Chrome
Execução com auto-escala
Cria mais dois nós
Suite de Teste
HUB
Execução com auto-escala
Ao final da execução,
mantém somente os dois nós
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>
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
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
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
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
Ganhos reais
min
Tempo atual para executar uma
suíte de pagamentos com 61 testes
em uma grid de 20 nós.
min
Tempo com abordagem de
execução local (sequencial)
de 61 testes.
Tempo de execução para 15 suítes
com 394 testes em grid
min
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)
Suíte de Testes
90 testes
90 testes
30 min
90 testes
30 min
90 testes
30 min
Tempo total: 30 min
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
OBRIGADO!
@eliasnogueira
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

Como criar e executar testes paralelos web usando Selenium e containers

  • 1.
    COMO CRIAR EEXECUTAR TESTES PARALELOS WEB USANDO SELENIUM E CONTAINERS @eliasnogueira
  • 2.
    Problemas na execuçãode testes automatizados para web Compatibilidade dos browsers Tempo de execução dos testes
  • 3.
  • 4.
  • 5.
    Script de Teste EnviaCapacidades NÓ Windows NÓ MacOSX NÓ Linux HUB Entende a capacidade e envia para o nó correto
  • 6.
    NÓ Windows NÓMacOSX NÓ Linux
  • 7.
    Local Utiliza máquinas dentroda 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
  • 8.
  • 9.
    • Depende deinfraestrutura física • Dificuldade de escalar • Requer manutenção (atualizações) Problema com o grid local
  • 10.
    Solução proposta Com oTestNG 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
  • 11.
    SCONTAINERS SELENIUM • Containers separadospara 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
  • 12.
    Suite de Teste HUB 2testes Google Chrome Execução sem auto-escala Executa os dois testes nos dois nós
  • 13.
    Suite de Teste HUB 4testes Google Chrome Esperando 2 slots free.... Execução sem auto-escala
  • 14.
    Suite de Teste HUB 4testes Google Chrome Execução sem auto-escala Executa dos testes nos dois nós disponíveis
  • 15.
    Suite de Teste HUB 4testes Google Chrome Execução com auto-escala Cria mais dois nós
  • 16.
    Suite de Teste HUB Execuçãocom auto-escala Ao final da execução, mantém somente os dois nós
  • 17.
    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>
  • 18.
    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
  • 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> Verifica associação do parâmetro Insere o valor do parâmetro no teste
  • 20.
    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
  • 21.
    Exemplo do auto-escalaZalenium # 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
  • 22.
    Ganhos reais min Tempo atualpara executar uma suíte de pagamentos com 61 testes em uma grid de 20 nós. min Tempo com abordagem de execução local (sequencial) de 61 testes. Tempo de execução para 15 suítes com 394 testes em grid min
  • 23.
    ProTip: Criar umaestraté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)
  • 24.
    Suíte de Testes 90testes 90 testes 30 min 90 testes 30 min 90 testes 30 min Tempo total: 30 min
  • 25.
    Suíte de Testes 30testes 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
  • 26.
  • 27.
    Referências Paralelismo com maven-surefire-plugin https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html Paralelismocom 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