DevSecOps

9 out, 2015

SikuliX: automatize testes apenas com visualização – Parte 02

Publicidade

Recentemente, eu fiz uma introdução à SikuliX, ferramenta que utiliza apenas a visualização para automatizar testes. Hoje, vamos entrar em uma abordagem mais profunda e partir para o código! Antes de tudo, porém, é importante lembrar algumas coisas.

Primeiro, nós vamos utilizar a IDE do SikuliX para tirar as nossas prints. Segundo, quando nós criamos um projeto com a IDE da SikuliX, ele gera um arquivo .py , que fica dentro de uma pasta .SikuliX, que tem a sintaxe muito parecida com os métodos Ruby. Sim, vamos desenvolver em Ruby.

sikulix-1

O terceiro ponto é que vamos fazer umas configurações bem específicas do Ruby, então eu recomendo (MUITO) que você tenha o rbenv ou o rvm instalados. Por fim, vale lembrar que vamos utilizar o Cucumber.

Dito isso, vamos começar com a IDE. Levando em conta que todo mundo já instalou (o tutorial está no artigo da semana anterior), vamos criar um novo projeto e salvá-lo no mesmo local onde estará nosso projeto em Ruby. Depois disso, vamos mudar um detalhe na nossa IDE, seguindo o caminho:

SikuliX>Preferências>Nomear Automaticamente>Manualmente.

Agora, quando nós tirarmos as prints, vamos poder colocar nomes legíveis.

sikulix-2

A primeira coisa a se fazer é, pela IDE, salvar o projeto. Assim, a SikuliX vai criar uma pasta .sikuliX no diretório desejado. Abra esse mesmo diretório, só que pelo terminal.

Partindo do princípio de que você está com o Rbenv instalado, vamos descobrir qual versão do Ruby estamos usando no diretório. Eu utilizo o Ruby para desenvolver testes em plataformas que exigem versões diferentes, então é importante verificar. Lembrando que o Rbenv é facilmente adaptável para quem usa Rvm e o uso do Brew vai facilitar a sua vida. Vale destacar também que a organização das coisas é melhor. O ambiente fica isolado e é possível depurar erros de setup mais facilmente.

Usando o comando rbenv version, você vai descobrir qual a sua versão atual. Provavelmente não vai ser a versão que o SikuliX precisa, que é Jruby-1.7.18. Então, é só rodar o comando rbenv install Jruby-1.7.18, e a sua máquina vai baixar a versão necessária para que possamos rodar o projeto. Depois disso, teste de novo a versão do Ruby (ruby -v) na pasta, e se ela não for a que nós baixamos agora, basta utilizar o comando rbenv local Jruby-1.7.18 que o rbenv vai setar essa versão para a pasta. Se você estiver em dúvida se baixou e instalou mesmo, o comando rbenv versions (não esqueça o S no final do versions) mostra todas as versões instaladas.

Você vai precisar instalar o Cucumber (gem install cucumber), a Sikuli (gem install sikuli) e a SikuliX (gem install sikulix). Caso exista qualquer dúvida na instalação, aqui está a lista das gems da pasta que eu fiz o setup.

Depois de instalar as gems, rode o comando cucumber –init para criar a estrutura inicial de pastas. Algumas versões do Cucumber podem não disponibilizar esse método, e caso isso aconteça crie o seguinte ambiente de pastas: Pasta do projeto contendo uma pasta chamada features, que contém o arquivo especificacoes.feature e as pastas support e step_definitions. A pasta support contém o arquivo env.rb, e a pasta step_definitions contém o arquivo home.rb. A estrutura final deve ficar assim:

sikulix-3

Dentro do projeto que vai ser criado (em Ruby), altere o .env incluindo as seguintes linhas:

require "sikulix/platform"
Sikulix::Platform.check_and_require
require "sikulix/sikulix.rb"
Sikulix::ImagePath.add("DribbbleX.sikuli")

Aqui nós adicionamos a Sikuli, iniciamos a plataforma e adicionamos o path do qual ele vai ler as nossas imagens. Perceba que o .sikuli, ali em cima, é a pasta na qual a minha IDE da Sikuli está salvando as imagens.

Agora, caso você queira experimentar uma das funcionalidades que eu acho mais interessantes, vamos abrir a pasta criada pela Sikuli, o .sikuli, e o .py que foi gerado lá dentro.

sikulix-4

Dentro desse arquivo, existe o script:

dragDrop(Pattern("top_screen-1.png").exact(), Pattern("screen_bottom.png").exact())
click("view_counter.png")
wait("share_icon.png", 3)

click("share_icon.png")
wait("email_icon.png",3)
click("email_icon.png")
wait("email_mini_icon.png",3)
type("cicerohellmann@gmail.com")

click("Senha.png")
type("nonono")

Dentro da pasta features, criada pelo Cucumber, crie um arquivo chamado nome_da_sua_feature.feature e dentro da pasta step_definitions crie o arquivo nome_do_seu_setp.rb.

sikulix-5

Para cada uma das funcionalidades geradas em Python pela IDE, eu vou criar um step:

Given I touch the eye
When I wait for the share icon
Then I touch the share icon
And I wait for the email icon
Then I touch the email icon
When I wait to see if it's in the email login screen
Then I type my email
And I touch password field
Then I type my password

Para inicializar o Sikuli no Ruby, é necessário chamar uma nova Screen (escreva isso no topo do seu step.rb)

sikulix-6

Um ponto a levantar é que algumas classes, quando vindas do Sikuli, precisam receber o prefixo Sikulix::, por exemplo:

Sikulix::Pattern("top_screen-1.png").exact()

Se tudo der certo, é só rodar o comando “cucumber” na pasta correspondente e pronto! Ele vai começar a rodar os testes. Aqui está o repositório com o app Android que eu usei e o teste usando Sikuli e Cucumber. E aqui está o repositório da Sikuli com o Cucumber.

Ficou alguma dúvida ou tem algum comentário? Deixe sua contribuição abaixo.