Testes Unitários em Java ME com JMUnit

28 maio 2010 0 comentários
Nesse post, retirado do blog do Rafael Vianna, faremos uma pequena introdução aos tipos de teste, dando maior importância aos testes unitários e como eles podem ser utilizados em Java ME com framework JMUnit e a metodologia Test-Driven Development.
Testes automatizados são algo fundamental no desenvolvimento de software orientado a objetos. Eles permitem uma melhor evolução do software agregando confiança e qualidade ao produto final. No mundo Java SE e Java EE existem muitas ferramentas de testes. Quando olhamos para Java ME o número de ferramentas torna-se menor, devido tanto aos requisitos das aplicações quanto as restrições impostas pela própria API Java ME.

Diferentes tipos de testes em aplicações Java ME

Existem vários tipos de testes e eles variam de acordo com a aplicação e com os requisitos desejados pelo cliente. Em aplicações Java ME os principais tipos de teste são:
Testes de Usabilidade: tem foco na navegação entre as telas da aplicação e na maneira que os componentes visuais comunicam-se com o usuário.
Teste de performance e trafego na rede: testa se a aplicação funciona bem em redes que apresentam condições extremas. Aplicativos móveis devem funcionar de maneira satisfatória mesmo em redes muito congestionadas.
Testes do lado servidor: muitos aplicativos Java ME comunicação com servidores remotos. Para tais aplicativos testar as interfaces entre a aplicação que roda no dispositivo móvel e o servidor remoto é muito importante.
Testes unitários automatizados: estes é um dos mais importantes testes, seja em aplicativos móveis, Web ou Desktop. Ele feito durante o desenvolvimento do aplicativo, juntamente com o código-fonte. Geralmente esses testes são criados com algum framework da família xUnit (jUnit, nUnit, etc).

TDD

Test-Driven Development é uma maneira diferente de escrever software. Nela você primeiro escreve o teste e depois escreve o código a ser testado. O TDD está conseguindo cada vez mais adeptos graças a sua simplicidade e alto grau de qualidade do código ao durante todo o processo de desenvolvimento.
Algumas vantagens dessa abordagem são:
    * Simplicidade
    * Aumento da confiança no código
    * Ajuda na documentação
    * Falicita refatorações
O processo de criação no TDD é simples:
   1. Escreva um teste que falhe
   2. Faça o teste passar o mais rápido possível
   3. Refatore
   4. Faça o teste passar
   5. Refatore seus testes
   6. Faça os passos 1 a 5 para cada novo teste
   7. Repita todos os passos para cada novo método adicionado

Framworks para Testes Unitários
Para escrever testes unitários existem alguns frameworks, sendo o mais famosos deles o JUnit. Infelizmente o JUnit só pode ser utilizado em ambientes Java SE e Java EE, devido principalmente a algo que ele usa e é totalmente inexistente da API Java ME: reflexão. Isso ficou mais complicado depois do lançamento da versão 4 do JUnit, que agora também tem suporte a Annotations. Mesmo com essas barreiras, existem frameworks para testes unitários em Java ME, sendo os principais o JMUnit e o J2MEUnit.

O framework JMUnit

O JMUnit é um framework nos mesmos moldes do JUnit voltada para Java ME. Possui uma versão para configuração CLCD (1.0 e 1.1), é open-source e foi criado pelo brasileiro Bruno Silva.

JMUnit na prática

Chegou a hora de utilizar o JMUnit. Crie um novo MIDlet Project no Eclipse com o nome Java ME unit testes. Dentro da pasta src crie dois pacotes: model e jmunit.tests. A sua estrutura de diretórios deve ficar parecida com a da figura abaixo:


Vamos fazer algo bem simples somente para demonstração: uma classe que fará a conversão de temperatura de Celsius para Kelvin. Lembre-se que iremos utilizar TDD, então vamos escrever os testes primeiro.


Escrevendo os Testes

O JMUnit possui dois conceitos principais:
Test Case: classe onde os casos de testes são escritos.
Test Suite: classe onde os Test Cases são executados.
A primeira coisa que faremos é criar um Test Case para nossa classe de conversão. Para fazer isso siga os passos abaixo:
1 - Clique em o botão direito sobre o pacote jmunit.tests
2 - Selecione New - JMUnit Test Case



3 - Caso uma mensagem de alerta apareça na parte inferior do Wizard, clique onde diz Click here. Coloque o nome da classe de ConversionTest. Clique em Finish.

A classe gerada apresenta um construtor e um método:
public ConversionTest()
{
 super(0, "TemperatureConversionTest");
}

public void test(int testNumber) throws Throwable
{
 switch (testNumber)
 {
 }
}
O construtor possui dois parâmetros: o número de testes existentes no Test Case e o nome do Test Case. No método test nos passamos o número de testes que serão executados que servirá para o switch.

Agora vamos adicionar nossos testes. Irei seguir o padrão do JUnit onde cada método não terá retorno (void) e começa com o nome test seguido do nome do método que irá ser testado. O primeiro test será esse:
public void testcelsiusToKelvin() throws AssertionFailedException
{
 float result = TemperatureConversion.celsiusToKelvin(); // apresenta erro.
 assertEquals(0, result);
}
Para o teste acima funcionar você deve alterar o construtor da classe e o método test. Eles ficarão assim:
public ConversionTest()
{
 // Passe o número de testes no construtor, nesse caso o número 1
 super(1, "ConversionTest");
}

public void test(int testNumber) throws Throwable
{
 switch (testNumber)
 {
  // Também modificamos o "case". Lembre-se que o “case” em Java começa em 0.
  case 0: testcelsiusToKelvin(); break;
  default: break;
 }
}
Para rodar o teste é necessário criar um Test Suite. É bem simples criar um:

1 – Clique com o botão direito em cima da pacote “jmunit.tests”.

2 – Vá em New - JMUnit Test Suite.


3 – No Wizard que irá aparecer apenas clique em Finish

Agora siga os passos abaixo para rodar o teste:

1 – Clique com o botão direito em cima do Test Suite AllTestSuite.

2 – Vá em Run As - Emulated Java ME MIDlet.

3 – Surgirá uma janela de alerta do Eclipse. Clique no botão Proceed.

Rode o teste clicando em Test.

Opa! O testes falhou. Olhando o resultado do teste pode-se observar que a classe TemperatureConversion não existe. Realmente ela não existe ainda já estamos usando TDD. Escrevemos primeiro o teste e depois o código que irá ser testado, lembre-se disso.



Crie a classe:

1 – Utilize o Quick Fix do eclipse (Ctrl+1 ou clique no ‘x’ no começo da linha) e escolha a primeira opção: Create Class TemperatureConversion.

2 – Quando o Wizard aparacer, escolha o pacote model. Para isso clique no botão Browser, escolha o pacote model.



3 – Clique em Finish.

4 – Faça o mesmo processo para criar o método celsiusToKevin na classe TemperatureConversion . Não mude o conteúdo do método gerado.

Rodando o teste novamente ele irá passar. Isso é visto com a barrinha verde apresentada no MIDlet Emulator.

Agora vamos fazer mais um teste para nosso método. Vá na classe TemperatureConversionTest e adicione o sequinte método:
public void testcelsiusToKelvin(float c, float k) throws AssertionFailedException
{
 k = TemperatureConversion.celsiusToKelvin(c);
 assertEquals(298, k);
}
Não esqueça de mudar o construtor e o método test da classe:
public TemperatureConversionTest()
{
 super(2, "TemperatureConversionTest");
}

public void test(int testNumber) throws Throwable
{
 switch (testNumber)
        {
         case 0: testcelsiusToKelvin();break;
  case 1: testcelsiusToKelvin(25, 298);
  default: break;
 }
}
Rode a classe AllTestSuite novamente. Perceba que agora temos dois testes. Execute os testes.


Olhando o resultado dos testes percebemos que um deles passou e outro falhou. Vamos refatorar o método responsável pela conversão das temperaturas na classe TemperatureConversion colando a fórmula para conversão de Celsius para Kelvin, que é K = ºC + 273. Modifique o método para:
public static float celsiusToKelvin(float celsius)
{
 float kelvin = celsius + 273;
 return kelvin;
}
Parece tudo OK agora, não é? Só para garantir, rode os testes novamente.

Opa! Barrinha vermelha de novo. Mas o que será que está errado?

Vá na nossa classe de testes. Você esqueceu de refatorar o nosso primeiro método de testes. Modifique-o para:
public void testcelsiusToKelvin() throws AssertionFailedException
{
        // Agora é necessário passar um parâmatro para o método que nesse caso é 0 (zero).
 float result = TemperatureConversion.celsiusToKelvin(0);
 assertEquals(273, result);
}
Rode os testes e barrinha verde novamente aparecerá.




Conclusão

Testes unitários são algo de extrema importância no desenvolvimento de software. Como podemos ver, escrever testes unitários é algo bem simples e não há desculpas para não fazê-lo, seja em que ambiente for. No mundo Java ME existem outros frameworks para testes unitários, mas prefiro o JMUnit por sua simplicidade, por seguir o padrão xUnit e também por já estar integrado ao Eclipse Pulsar.

Profissão Java 2010

26 maio 2010 0 comentários
Bom dia..

Gostaria de deixar aqui uma dica de evento: Profissão Java 2010. O evento é gratutito e acontece dia 26/06, na Universidade Anhembi Morumbi.

Segundo o site oficial, o Profissão Java é um evento para profissionais que desejam entrar no mercado, que estão buscando uma recolocação profissional ou mesmo querem dar um novo rumo na sua carreira. O foco é carreira!

Podemos encontrar palestras sobre TV Digital e Android por exemplo.. temas quentes no momento..

Att.
Ricardo

Perspectivas muito boas para Android..

11 maio 2010 0 comentários
Bom dia..

Segundo o Mashable, via JavaFree, o Android, sistema operacional da Google para smartphones, superou o iPhone em vendas no primeiro trimestre de 2010 de acordo com relatório publicado hoje pelo grupo NPD.

Para demonstrar ainda mais o poder de fogo do Android, a Info Plantão publicuo a matéria "O Poder do Android no Mercado de Smartphones".

Segundo a fonte:

- Já adotado pela HTC, Motorola, Samsung, Sony Ericsson e LG, o Android será o segundo principal sistema operacional para smartphones em 2010, respondendo por 18% das vendas globais de smartphones.

- O Symbian, da Nokia, atual SO dominante com participação global de mercado de 51% , será open source em 2010. Em 2010, o Symbian open source liderará o mercado de smartphones com participação de 37%.

- O Maemo verá maior adoção nos smartphones sofisticados da Nokia e, junto com outros projetos baseados em Linux, responderá por 6% do mercado em 2012.

Além disso, o mercado de smartphones sera dominado por plataformas open source em 2012. Android, Symbian, Maemo e vários sistemas operacionais baseados em Linux responderão por de 62% do mercado. Plataformas proprietárias da RIM e da Apple terão participação de mercado de 27%. O Windows Mobile da Microsoft será pressionado por essas duas abordagens e deverá controlar 9% do mercado.


Android está muito forte mesmo.


Att.

Ricardo

Kuix... nasce irmão do LWUIT

04 maio 2010 1 comentários
Boa tarde..

O Lightweight UI Toolkit (LWUIT) é uma biblioteca que permite criar interfaces gráficas do usuário (GUI) bastante atraentes, para dispositivos móveis ou quaisquer outros dispositivos que suportem o perfil MIDP, do Java ME. Ele foi baseado no Swing do Java SE e possui compatibilidade compatibilidade com MIDP 2.0, CDC, PBB e Java SE. Com o LWUIT, diminui-se muito a necessidade de se desenhar telas em canvas para se obter interfaces amigáveis.

Descrição retirada do post LWUIT - Introdução.

Pois bem, agora não ficamos restritos somente ao LWUIT, foi lançada]o o Kuix, que basicamente tem a mesma finalidade, ou seja, um framework para construção de interfaces ricas em aplicativos Java ME.

** Neste link você encontra uma série de tutoriais passo a passo para construir sua primeira aplicação.

-------------------------------------------

Confesso que ainda prefiro o LWUIT, por alguns motivos:

** No Kuix a edição do CSS é na mão, o LWUIT apresenta uma ferramenta gráfica para tal finalidade.
** O Kuix tem licença comercial comercial, LWUIT não.
** LWUIT é suportada no Ginga-J (TV Digital Brasileira).
** Para não dizer que só falei mal do Kuix. O esquema de definir telas com XML e CSS é bem bacana, é quase como uma tendência.

Se alguém conhece as duas ferramentas e quer expressar sua opinião... comentários são bem vindos.

Att.
Ricardo

Desenvolvendo um Estudo de Caso Utilizando a Plataforma Java ME

02 maio 2010 0 comentários
Este é o primeiro Trabalho de Conclusão de Curso que postamos aqui no blog. Convidamos a todos que fizeram seu TCC/Monografia, sobre assuntos relacionados aos temas do Java Móvel, a compartilhar com os leitores do blog. Basta enviar um e-mail para que possamos colocar no ar e partilhar com todos aqueles que procuram referências consistentes.

Resumo
A plataforma Java Micro Edition é o conjunto de tecnologias que permitem o desenvolvimento de aplicações Java para dispositivos com processamento, memória e vídeo limitados, como celulares e smartphones. Assim como as outras edições Java, essa plataforma foi desenvolvida com o mesmo intuito, a portabilidade, além de possuir diversas APIs para o desenvolvimento, o Java ME também fornece compatibilidade entre as edições Java, possibilitando a comunicação com aplicações construídas em Java SE e Java EE. Mantendo o foco em Java Micro Edition, este trabalho propõe o desenvolvimento de uma aplicação móvel que una as tecnologias Java ME e Java EE. Como o Java Enterprise Edition possui várias funcionalidades de redes e Internet e contém classes especialmente desenvolvidas para acesso a servidores e banco de dados, parte da aplicação foi construída usando esta tecnologia, possibilitando a comunicação entre dispositivos móveis e um servidor disposto na rede local ou Internet. Portanto, neste trabalho foi abordado, juntamente com a plataforma Java ME, o uso de Servlets dentro da arquitetura Java EE, interagindo com um cliente móvel através do protocolo HTTP para estabelecer a comunicação com celulares e smartphones. Visto que um Servlet pode efetuar qualquer processamento inerente a uma classe Java e enviar respostas na forma de documentos XML, para efetuarmos a troca de dados entre um dispositivo móvel e o servidor remoto de dados, que alimenta o sistema móvel, utilizamos os recursos que a linguagem XML nos oferece. Para auxiliar o desenvolvimento do estudo de caso, a metodologia ágil extreme programming foi utilizada juntamente com diagramas da UML com o intuito de organizar o processo de desenvolvimento. A aplicação desenvolvida durante o trabalho é responsável por agilizar o processo de vendas de uma distibuidora de bebidas, a fim de automatizar a força de vendas e foi testada em celulares e smartphones com o sistema operacional móvel Symbian e Windows Mobile, interagindo com o servidor via requisições HTTP.