Mostrando postagens com marcador Testes. Mostrar todas as postagens
Mostrando postagens com marcador Testes. Mostrar todas as postagens

quarta-feira, 17 de junho de 2009

Swing e TestUnit (JUnit)

0

Quem já mecheu com Swing conheçe o parto que é testar as telas. Pensar nas mil possibilidades se fazer cagada em uma tela. Impossivel prever o total de coisas que um usuário consegue fazer. Para facilitar esses testes surgiu o JUnit, automatizando os testes. Não vou entrar em detalhes sobre o TDD, existe muita informação por ai.

Mas algum tempo atrás procurei por algo para automatizar os testes em Interfaces gráficas. Porém nada do que eu achei era o que eu buscava. Não queria ter que abrir a tela e inserir valores. Gostaria de fazer isso via código de forma automatica, como o JUnit, em busca de um resultado esperado. Vi sobre o Maraton, FestSwing, e em todos eu tinha que abrir a droga das telas para testar. Algo que não me agradou nem um pouco.

Então deixei de lado isso. Porém alguns dias atraz me veio uma ideia meio louca de se fazer isso. Criei uma classe que encapsula o frame. e atraves dela consigo recuperar os compoenentes da tela e simular as ações. Exatemente o que eu queria. Automatizar a porcaria do teste (:

Image o seguinte JInternalFrame:



A ação do botão se resume a alterar o texto de JInternalFrame para Clicked.
E ai? como fazer para testar esse esquema?


public class TestFrameWithMock {
private SwingTester mock;

public TestFrameWithMock() {
mock = new SwingTester(new TesteInternal());
}

@Test
public void shouldChangeTextWhenButtonWasClicked(){
JButton btn = (JButton) mock.getFieldReflect("jButton1");
JTextField tf = (JTextField) mock.getFieldReflect("jTextField1");
assertEquals("JInternalFrame", tf.getText());
btn.doClick();
assertEquals("Clicked", tf.getText());
}
}


E ai alguém ai percebeu como é simples o esquema? E nenhuma tela é visivel. A maioria das ferramentes você deveria abrir cada JInternalFrame, um por um e testa-lo. Assim desse modo com a Classe SwingTester ele não é visivel.

Como podem perceber o TesteInternal (JInternalFrame da imagem) é passado como parametro. E atraves dele é possivel recuperar os compoenentes da tela atraves do atributo name de cada um ou atraves do nome da variavel via reflection (que foi usado nesse teste acima). E o teste executa sem problemas.

Foi a abordagem que achei mais legal. Em breve for colocar isso ai no github, se eu lembrar e vcs podem analisar e testar.






Read more

sexta-feira, 23 de janeiro de 2009

Testando Seu Código Java com Ruby

1

Galera essa foi muito boa, eu procurando sobre usar o BDD em Java, algo parecido com o RSpec, que gosto tanto, e me familiarizei fácil usando no Rails. Achei um que pareceu interessante o JBehave, porém parecia mais com os Stories do RSpec, é não com os Spec, que era justamente o que eu queria, também encontrei um tal de JDave, mas ainda é um projeto embrionário, e resolvi procurar se havia uma versão do RSpec para Java, eis que caio no Blog do Ola Bini, um dos Team Leaders do JRuby, e ele mostra usando o RSpec com Java usando JRuby. Não era bem isso que queria, mas mesmo assim, resolvi experimentar, nunca mexi muito com o JRuby, já brinquei com Java e Ruby separados mas não nessa versão, usando recurso das duas linguagens juntas. Então lá fui eu copiar o exemplo do Ola Bini, e para minha surpresa funcionou muito bem, melhor do que eu esperava. Então pequei um código e comecei a testar para ver se funcionava com minhas entidades, testar um programa escrito em puro Java, em outras palavras usar as classes do Projeto e as do Ruby juntas.

Então comecei a luta para o JRuby reconhecer minhas classes, e após algumas tentativas frustradas, que incluíam adicionar o jar do Projeto no classpath, não funcionou. Estava pronto para estudar o JDave ou o JBehave, quando recorri ao senhor supremo da internet, o Google. Encontrei uma wiki sobre JRuby, e lá tinha um código relativamente ridículo, que eles diziam que adicionava a biblioteca ao JRuby. Vejam o código simples:


require "caminho/para/arquivo.jar"
module Models
include_package "pacote/suppacote"
end


Um Module em ruby, é quase uma classe, ele é um complemento para uma classe, todo o código de um module incorporado a uma classe pode ser usado, sem restrição (ou talvez haja e eu não sei, não estudei muito essa parte.). Esse module só vai simplificar nosso trabalho, ao invés de fazer a chamada usando o padrão do JRuby que é de:


pacote.subpacote.Classe


Chamamos direto pelo estilo Ruby de Models::Classe, pode parecer poca coisa mais se você for seguir as convenções da Sun da um caminho grande até a classe.

Agora sim podemos criar nossos testes com o JRuby usando projetos Java. Vocês podem ver o exemplo do Ola Bini, e testar suas classe com o RSpec, caso não saiba ainda utilizar o RSpec, é uma chance de aprender. Para você usar na sua classe de Teste, tem que adicionar também no início do arquivo o require do seu module como, por exemplo:


require "caminho/para/models.rb"


Assim você pode usar qualquer classe do seu Projeto.jar sem problemas e testa-las usando RSpec. Pra que sofrer com JUnit?

Logo logo sai um artigo sobre MVC em PHP a pedido do meu amigo Renato, aguardem.

[]'s

Read more

 
Design by ThemeShift | Bloggerized by Lasantha - Free Blogger Templates | Best Web Hosting