BlogBlogs.Com.Br

quarta-feira, 17 de junho de 2009

Swing e TestUnit (JUnit)

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.






segunda-feira, 8 de junho de 2009

Ioke - Programação Orientada a Protótipo

Eu em alguns devaneios que acredito que todo o programador tenha (Por favor confirmem isso :) ), estava em busca de uma linguagem funcional para aprender, seguindo o conceito de aprender uma linguagem nova por ano, esse ano estava atrasado, ainda não tinha começado a estudar nenhuma linguagem, estão buscando pela linguagem Haskell que havia escutado bem, e também dei uma olhada em Erlang outra linguagem funcional crescendo em uso. Muitos devem se perguntar, por que não Scala? Na verdade cada vez que busco fugir um pouco da filosofia Java, eu melhoro meus códigos em Java, assim como Scala seguem a mesma família, pois sua sintaxe lembra bastante a sintaxe Java.

Então olhando as duas linguagens entrei em um dilema, qual aprender? e foi a duvida, dei uma olhada básica, não me aprofundei muito em nenhuma das duas. e Algum tempo atras, navegando em alguns blogs, cheguei em um que continha uma entrevista com Ola Bini, que é um dos principais desenvolvedores do JRuby, onde ele afirmava que Java é muito baixo nivel é que é excelente para se criar novas linguagem (seria essa uma afirmação do tipo Java é o novo C?), e na mesma entrevista ele citava Ioke, a linguagem de programação que ele havia criado, utilizando Java. E eu resolvi dar uma olhada, e vi que ela é uma linguagem orientada a prototipos, não orientada a objetos. E isso me chamou a atenção, em algumas buscas, encontrei no Groups do Ioke, um brasileiro, que me ajudou a esclarecer algumas dúvidas.

No site do Ioke possui diversos exemplos de como se utiliza ele.
O Ioke possui suporte nativo a Java, e não utiliza o operador . , tão comum para as linguagens atuais, eis que vendo esse suporte nativo resolvi criar uma Bridge de JDBC com o Ioke, e por incrivel que pareça, e depois de algum sofrimento consegui excecutar uma consulta no banco. Algo realmente bacana para quem está aprendendo uma linguagem nova. Mas muito da API não consegui usar, o que consegui foi instanciar classes dos Drivers diretamente.

o Ioke ainda possui o iik que é um console iterativo estilo o irb do Ruby, e ainda possui o iSpec baseado no RSpec, ainda não mechi muito nisso, mas estou gostando desse novo aprendizado, aos poucos vou colando alguns códigos do Ioke para vocês verem.

Só não esperem um hello world por que fazer um "Hello World" println é muito simples não acham?

O material na web ainda é escasso e a linguagem é lenta, mas acredito que tudo isso pode mudar :).

Vamos ver como o Ioke se sai com o tempo.

até a próxima.