Testando GUI em aplicações externas

Fala Galera!

Eu não sou desenvolvedor de Java e sim de C/C++.
Eu desenvolvo softwares de testes e automações.
Estou querendo fazer uma automação em um software (escrito em java, não sei se usa Swing ou AWT, como consigo descobrir isso?), a automação seria clicar em botões automaticamente, olhar uma listview, interagir com menus e caixas de diálogos e trazer os dados de volta.
Dei uma boa navegada na net antes de abrir o tópico.
Testei algo com o AWT Robot, o mousemove até funcionou mas o clique não. Se eu mandasse clicar dentro do eclipse funcionava mas na minha aplicação não, já havia testado com autohotkey antes e não obtive sucesso tbm!
Minhas dúvidas são:

  • A partir de um programa compilado (.exe), eu consigo chegar a algo próximo a isso?
  • Li sobre Junit, Abbot, Jemmy, UISpec4J mas não consegui entender se eu consigo interagir com o EXE direto ou precisa ser direto com o código fonte. Esse é o caminho mesmo?

Qualquer dúvida é muito bem-vinda.
Mods, se estiver na sessão errada podem remover.

Obrigado!
Felipe

Felipe:

Em geral, os programas em Java não são empacotados como .exe, e sim como .jar.
Se o seu for mesmo um .exe, precisaria ver como foi empacotado, mas sempre há um jar
presente.

Os “executáveis” são arquivos .bat (para Windows) ou .sh (para Unix e similares) que
incluem uma linha +ou- assim:

java -jar nome_da_aplicacao.jar

Nesse arquivo .jar estão todas as classes Java compiladas, arquivos de propriedades e tudo
o que a aplicação necessita. Ele é um arquivo morto compactado no formato zip, portanto pode
ser aberto com qualquer PKZip, Winzip ou similar.

Um dos arquivos contidos no .jar é o META-INF/Manifest.MF, que diz qual é a classe principal
(ponto de entrada). Suponhamos que seja com.xyz.aplicacao.Main.

Se vc vai testar com uma das ferramentas que vc comentou, tipicamente vai
querer executar dentro da mesma máquina virtual, o que significa que o seu código de teste
carrega o código da aplicação sendo testada como se fosse uma biblioteca, mais ou menos assim:

java -classpath nome_da_aplicação.jar MeuTeste

Dentro de MeuTeste.java, vc vai invocar a classe com.xyz.aplicacao.Main
seguindo a receita de bolo da biblioteca de testes escolhida.

Sobre AWT e Swing, vale destacar que o AWT continua existindo por baixo do Swing.
A diferença está nos componentes, que as ferramentas reconhecem de qualquer maneira.
AWT puro é cada vez mais raro, portanto assuma que, se a aplicação não usa nenhuma
lib nativa, ela usará Swing e AWT, e as bibliotecas de teste tem a capacidade de reconhecer
seus componentes.

Se para a aplicação funcionar precisa de lib nativa para a interface usuário,
ela pode ter sido escrita para SWT ou algum outro framework nativo com
binding para Java.

Das bibliotecas que vc falou, a mais profissa é o Jemmy, que é usado para testar
a IDE NetBeans. Recomendo que vc invista seu precioso tempo de estudo nela.

Seria melhor ter postado esta mensagem no fórum de “Metodologias e testes de
software” do GUJ. Talvez o moderador consiga encaminhar.

Espero ter ajudado e fique a vontade para tirar qq dúvida.

Jorge Diz

Fala Jorge,

Obrigado pelas informações.

Ele executa um arquivo chamado client.exe. Tem varios .jar no diretório e um diretório jre. Como descubro qual utilizar?
Como descubro, também, se ele usa lib nativa ou Swing/AWT? Ele é um programa bonito, com botões personalizados e tudo mais. Tem interface boa.

Minha principal dúvida é se eu consigo fazer esses testes com o .exe sendo executado ou eu só consigo simulando algo?

Abraços,

Dê uma olhada no AutoHotkey. Ele funciona como o “gravador de macros” do velho Windows 3, e consegue clicar em botões, simular envio de teclas, etc.

Se vc. precisar entrar mais a fundo na aplicação, talvez o Marathon ajude.

[quote=psevestre]Dê uma olhada no AutoHotkey. Ele funciona como o “gravador de macros” do velho Windows 3, e consegue clicar em botões, simular envio de teclas, etc.

Se vc. precisar entrar mais a fundo na aplicação, talvez o Marathon ajude.

[/quote]

Fala psevestre, como mencionei acima. Eu sou desenvolvedor de C/C++ e desenvolvo muito com autohotkey, autoit etc e não rolou. Eu mando clicar e ele não clica no botão.

[quote=fbossolani]Fala Galera!

Eu não sou desenvolvedor de Java e sim de C/C++.
Eu desenvolvo softwares de testes e automações.
Estou querendo fazer uma automação em um software (escrito em java, não sei se usa Swing ou AWT, como consigo descobrir isso?), a automação seria clicar em botões automaticamente, olhar uma listview, interagir com menus e caixas de diálogos e trazer os dados de volta.
Dei uma boa navegada na net antes de abrir o tópico.
Testei algo com o AWT Robot, o mousemove até funcionou mas o clique não. Se eu mandasse clicar dentro do eclipse funcionava mas na minha aplicação não, já havia testado com autohotkey antes e não obtive sucesso tbm!
Minhas dúvidas são:

  • A partir de um programa compilado (.exe), eu consigo chegar a algo próximo a isso?
  • Li sobre Junit, Abbot, Jemmy, UISpec4J mas não consegui entender se eu consigo interagir com o EXE direto ou precisa ser direto com o código fonte. Esse é o caminho mesmo?

Qualquer dúvida é muito bem-vinda.
Mods, se estiver na sessão errada podem remover.

Obrigado!
Felipe[/quote]

De fato, é um pouco mais chato automatizar um programa em Java que um escrito (por exemplo) em C++ ou VB 6, porque o Java não usa as APIs do sistema operacional para desenhar as janelas (a exceção é para algumas coisas que o SWT faz).
Para saber se um programa java é Swing, SWT ou AWT puro, basta ver o “jeitão” dele.
Normalmente as pessoas usam Swing, e poucas usam SWT.
Por exemplo, algo que é relativamente simples fazer (ler um texto que está escrito em um botão) é bem chato em Java porque o Java não usa SetWindowText para desenhar um texto, ou GetWindowText para obter esse texto.
Só uma classe escrita em Java e que esteja rodando no mesmo processo que a classe a ser testada é que pode “puxar” esses valores.

Obrigado Thingol,

Mas agora a pergunta:
Como fazer isso a partir de um exe já em execução?

Boa pergunta. Nunca cheguei a usar esses tais programas (Jemmy etc.) portanto não sei como funcionam.

Já tentou usar um programa feito para isso, como esse aqui?

Nele, você pode cadastrar cliques do mouse em coordenadas (no caso do Java), ou cliquem em componentes (linguagens que usam API do SO).

Vini, ele precisa também de um programa que LEIA os itens da tela, não só que fique clicando em botões. Se você escreve um programa em C++ ou VB 6 isso é relativamente fácil porque os componentes usados normalmente não são “lightweight”, sendo usados diretamente os componentes do Windows, e é simples ler o texto de um botão ou de um combo ou de um label usando GetWindowText. Mas um programa em Java/Swing desenha absolutamente tudo*, sem usar uma única API do Windows para componentes, e GetWindowText simplesmente não funciona.

  • É claro que estou simplificando o problema. O Java também prevê que você possa acrescentar acessibilidade a componentes, então alguma coisa é possível determinar a respeito de cada componente, mas não com a simples API GetWindowText.

Uia, é verdade, passou batido. Eu conheço só o Rational Functional Tester que faz isso, mas custa uma pequena fortuna. Fora que, seu funcionamento não é tão bom quanto o de uma aplicação feita para testar aplicativos Windows.

Realmente, o Java é muito chato nesse sentido. É o preço de ser Lightweight.

Na verdade, autoit = autohotkey então o que um não funciona o outro tbm não irá funcionar. Na verdade nem o clique eu conseguir fazer funcionar com esses softwares de macros. Eu tenho vasta experiência nesses softwares, mas no java eu to sofrendo um pouco mesmo.
No forum do autoit que eu li a respeito de jemmy e alguns outros GUI testers, mas náo estou conseguindo usar isso ai.

Abraços

[quote=fbossolani][quote=psevestre]Dê uma olhada no AutoHotkey. Ele funciona como o “gravador de macros” do velho Windows 3, e consegue clicar em botões, simular envio de teclas, etc.

Se vc. precisar entrar mais a fundo na aplicação, talvez o Marathon ajude.

[/quote]

Fala psevestre, como mencionei acima. Eu sou desenvolvedor de C/C++ e desenvolvo muito com autohotkey, autoit etc e não rolou. Eu mando clicar e ele não clica no botão.[/quote]

Sorry, não vi que vc. havia mencionado o AHK. O Spy do AHK ao menos mostra a janela principal quando vc. passa o mouse por cima ? Se for o caso, tem um recurso que é procurar um bitmap dentro de uma janela, que uso quando nada mais funciona - java, .net e alguns controles ActiveX.

A função é a ImageSearch, e ela retorna as coordenadas em que encontrar uma imagem “parecida” (veja o que significa isto na deocumentação) com outra contida em um arquivo.

Hm, very nice isso. Já vi algo parecido sim.
Meu grande problema é que o mouseclick (tanto no AHK como no Robot do java) não funcionaram no botão. Eu fiz um mousemove com as coordenadas e depois mandei clicar e não obtive sucesso.

[quote=fbossolani]Hm, very nice isso. Já vi algo parecido sim.
Meu grande problema é que o mouseclick (tanto no AHK como no Robot do java) não funcionaram no botão. Eu fiz um mousemove com as coordenadas e depois mandei clicar e não obtive sucesso.[/quote]

Vc. já tentou usar o Spy++ e capturar a seqüência de mensagens recebidas pelo aplicativo Java ? Depois vc. pode tentar reproduzí-las via AHK, usando o SendMessage.

Ja tentei sim, ele mostra uma janela apenas.
Vou postar um print aqui.

[quote=fbossolani]Fala Jorge,

Obrigado pelas informações.

Ele executa um arquivo chamado client.exe. Tem varios .jar no diretório e um diretório jre. Como descubro qual utilizar?
Como descubro, também, se ele usa lib nativa ou Swing/AWT? Ele é um programa bonito, com botões personalizados e tudo mais. Tem interface boa.

Minha principal dúvida é se eu consigo fazer esses testes com o .exe sendo executado ou eu só consigo simulando algo?

Abraços,[/quote]

Algumas dicas: vc precisa descobrir como iniciar seu programa através do Java. Este artigo:

Java to EXE - Why, When, When Not and How
http://www.javalobby.org/articles/java2exe/

é uma boa introdução sobre como funcionam .exe´s que iniciam aplicações Java.
Veja os itens “Custom Java Launchers And Wrappers” e “Java-Aware Setup Authoring Tools”,
que podem ajudar a entender como é a tecnologia e tem links para as ferramentas.
Extraindo as strings do seu .exe talvez vc ache referência a alguma delas.

Procurando no google por “java executable wrapper” encontra uma lista atualizada dessas
ferramentas.

Em última instância, todo .exe precisa iniciar o processo da JVM (máquina virtual).
A questão é descobrir qual a linha de comando equivalente para iniciar a JVM de maneira que
fique sob controle da sua ferramenta de teste.

Uma técnica que vc pode usar para tentar descobrir como a JVM é iniciada é apontar
o seu PATH do sistema operacional para reconhecer um executável “java” fajuto.
Esse “java” vc implementa como um programa em C que apenas mostra as opções
de linha de comando que foram passadas. Se isto funcionar, vc já terá a linha de comando
que precisa.

Qualquer informação adicional que vc tenha condições de passar tb ajuda.
Fiquei me perguntando qual é a relação que vc tem com o software sendo testado.
Se a sua empresa foi contratada para testar um certo sistema, quem desenvolve
aquele sistema poderia passar essas informações técnicas para permitir que ele
seja testado …

Enfim, espero ter ajudado,

Jorge