Picture Driven Testing com o Sikuli

Esse post já era para ter saído há um bom tempo, mas só agora tomei vergonha na cara para escrever sobre o Sikuli. 🙂

O que é o Sikuli?

O Sikuli é um projeto sob a licença MIT, desenvolvido pelo User Interface Design Group e o MIT Computer Science and Artificial Intelligence Laboratory (CSAIL), que utiliza imagens (screenshots) para buscar padrões na interface gráfica do usuário (GUI – graphical user interface).

Ele foi criado em Python e roda sobre a JVM (Java Virtual Machine), por meio do Jython, uma implementação da linguagem Python que gera bytecode que pode ser interpretado pela JVM.

O Sikuli tem dois componentes:

  • Sikuli IDE:uma ambiente de desenvolvimento integrado (IDE) que possibilita a escrita de scriptsvisuais utilizando screenshots;
  • Sikuli Script: uma API de scripts visuais para Jython, é por meio dele que os scripts criados no Sikuli IDE, são processados.

Como o Sikuli funciona?

A imagem abaixo mostra os componentes do Sikuli e como eles se relacionam.

Como o Sikuli funciona
Como o Sikuli funciona (fonte)

Basicamente utilizando o Sikuli IDE estamos criando um script python e salvando imagens quando tiramos um screenshot. O script python já importa automaticamente o Sikuli Script, que é o responsável por toda a “mágica” do reconhecimento de imagens. E por fim, quando rodamos o script ele é interpretado pelo Jython sobre a JVM.

Para que posso utilizar o Sikuli?

Com o Sikuli é possível automatizar tudo que você vê na tela. Você pode controlar uma página web, uma aplicação desktop no Windows/Linux/Mac OS, e até mesmo uma aplicação do iphone rodando em um emulador.

O Sikuli pode ser utilizado para diversos fins, desde a automatização de tarefas de usuários até testes de interface.

Utilizando o Sikuli para executar testes

Dentre os vários usos que pode ser feito do Sikuli, um que se destaque é a possibilidade de executar uma suíte de testes de interface (GUI Testing).

A grande diferença do Sikuli, perante as demais ferramentas de automação de testes de interface, está no uso do reconhecimento da imagem (por isso o uso do termo Picture Driven Testing), ao invés, do nome do elemento, ou coordenada da tela. Além disso, a abordagem de busca de elementos por screenshots, torna fácil a aprendizagem e evita um dos grandes problemas da automação de testes de interface, relacionadas a testabilidade do sistema (ex.: elementos com nomes dinâmicos).

O tempo de criação dos testes, provavelmente será maior, comparado as ferramentas record-play (ex.: TestComplete, Selenium IDE, etc), uma vez que é necessário realizar todo o processo de criação do script, tendo pelo menos um conhecimento básico das funções do Sikuli, e ainda você necessitará ir realizando o teste manual e capturando os elementos da tela com screenshots.

Mas por outro lado, como o nosso teste é guiado por imagens, ela será mais difícil de ser quebrado, uma vez que o Sikuli realiza uma busca, de acordo com o padrão da imagem, ou seja, o elemento está em um local diferente da tela, que mesmo assim, o Sikuli o encontrará.

Além disso, o Sikuli já foi projetado para suportar testes de unidade para GUI, integrando com o Junit. Tanto que há um painel de visualização específico para os testes (View -> Unit Test ou o atalho Ctrl+U).

Um script de teste pode ter os métodos de preparação e finalização, além é claro dos seus próprios métodos:

  • setUp(): usado para preparar o ambiente de teste;
  • tearDown(): usado para voltar o ambiente de teste ao estado antes do teste;
  • com o préfixo test: esses serão os seus métodos, que representam os testes que serão feitos (ex.: testCriandoUmArquivoDeTeste);

O Sikuli também provê duas funções de asserção:

  • AssertExist: Verifica se o padrão de imagem, passado como parâmetro, existe na tela;
  • AssertNotExist: Verifica se o padrão de imagem, passado como parâmetro, não existe na tela (o contrário do AssertExist).

Abaixo, um vídeo explicando alguns comandos do Sikuli, no qual eu crio um script bem simples, que abre o notepad, digita um texto e salva o arquivo:

Impressões sobre o Sikuli

A “descoberta” do Sikuli foi feita quando eu estava avaliando algumas ferramentas para automatizar alguns testes que exigiam o uso de interface. E acabei optando por usar o Sikuli.

De início as coisas estavam indo bem e parecia que tínhamos uma boa perspectiva futura com o seu uso. Porém, nem tudo são flores, e isso é mais verdade ainda quando falamos de testes que necessitam da interação com a interface, uma vez que eles são difíceis de se manter, e facilmente quebráveis.

E mesmo com o uso da imagem como “input”, se alguma mudança no visual ocorre na aplicação, os seus testes acabam quebrando, e foi justamente isso que ocorreu comigo. Já tinha automatizado os testes de uma nova funcionalidade da aplicação, porém ela sofreu uma grande mudança visual, e isso acabou quebrando todos os testes que eu tinha feito.

Além disso, na época em que usei ele (faz uns 2/3 meses) eu não consegui descobrir como chamar uma função python de dentro do próprio teste (a minha questão ficou por um bom tempo na lista de questões do Sikuli rs). E assim, acabava tendo que chamar um script em python (que fazia algumas asserções no banco de dados), via comandos do Sikuli + imagens, ou seja, uma solução bem paliativa.

Conclusão

Tendo em vista o pouco tempo de uso, a minha conclusão não pode ser negativa, mesmo não tendo tido sucesso no uso do Sikuli.

Afinal, o Sikuli é um projeto muito interessante e bem recente. E outras pessoas conseguiram bons resultados com ele (veja aqui e aqui).

O que recomendo para você, é testar a ferramenta, afinal ela é bem fácil de se usar, e analisar bem se a automação dos testes de interface é viável para a sua realidade. 😉

Saiba mais

Segue abaixo, alguns links de onde você encontrar mais informações sobre o Sikuli, e se aprofundar mais:

Fique por dentro das novidades, assine o feed do QualidadeBR.

Anúncios

2 comentários sobre “Picture Driven Testing com o Sikuli

  1. Vale a pena salientar que o Sikuli é uma ótima ferramenta de apoio a automação. Creio que utilizando ele para realmente executar os testes automatizados não seja uma boa saida, pois muitos conceitos para a automação como Data Driven, Reuso e componentização ficam de fora com ela.
    Agora, para automatizar as pré-condições, criar ou processar arquivos em batch, etc… que requer comandos manuais e fora da aplicação ele é ótimo!

    Abraços e parabéns pelo post!

    Responder
  2. Muito bem lembrado Elias!

    A grosso modo, podemos dizer que o Sikuli pode fazer qualquer atividade que requer interação manual, e ainda podemos colocar um pouco de inteligência nos scripts, chamando outros scripts (como no exemplo que citei no post).

    Agora para criar ou processar arquivos em batch, acho melhor usar um script em Shell Script, por exemplo.

    Abraços e obrigado pelo comentário! 😉

    Responder

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s