Desenvolvimento - Java

Java: Testes Unitários e JUnit

Conheça um dos mais conhecidos frameworks open-source presente no estágio inicial da cadeia de testes a qual uma aplicação pode ser submetida.

por Eric C M Oliveira



O teste unitário ou de unidade é uma modalidade de testes que se concentra na verificação da menor unidade do projeto de software. É realizado o teste de uma unidade lógica, com uso de dados suficientes para se testar apenas a lógica da unidade em questão. Em sistemas construídos com uso de linguagens orientadas a objetos, como Java e C#, essa unidade pode ser identificada como um método, uma classe ou mesmo um objeto.

O teste de unidade testa o menor dos componentes de um sistema de maneira isolada. Cada uma dessas unidades define um conjunto de estímulos (chamada de métodos), e de dados de entrada e saída associados a cada estímulo. As entradas são parâmetros e as saídas são o valor de retorno, exceções ou o estado do objeto.

Esse tipo de teste é de responsabilidade do próprio desenvolvedor durante a implementação do sistema, isto é, após codificar uma classe, por exemplo, ele planeja, codifica e executa o teste de unidade.

Tipicamente um teste unitário executa um método individualmente e compara uma saída conhecida após o processamento da mesma. Por exemplo:

Assert( 2 == algumMetodo( 1 ) );

A expressão acima verifica se a saída de algumMetodo() é 2 quando esse método recebe o parâmetro 1. Normalmente o desenvolvedor já realiza testes semelhantes a esse pequeno exemplo, o que é chamado de testes unitários em linha. Assim sendo, o conceito chave de um teste de unidade é exercitar um código e qual o resultado esperado.

Os testes de unidade são considerados o estagio inicial da cadeia de testes a qual um software pode ser submetido. Essa categoria de testes não atende a testar toda a funcionalidade de uma aplicação, que fica a cargo de outros testes, como de integração ou de performance.

JUnit

JUnit é um framework open-source que possibilita a criação de testes unitários em Java. A maioria das IDEs do mercado incorporam o JUnit dentro de seu ambiente de desenvolvimento, facilitando assim o uso desse framework.

O JUnit possibilita a criação das classes de testes. Estas classes contêm um ou mais métodos para que sejam realizados os testes, podendo ser organizados de forma hierárquica, de forma que o sistema seja testado em partes separadas, algumas integradas ou até mesmo todas de uma só vez. Além disso, este framework tem como objetivo, facilitar a criação de casos de teste, além de permitir escrever testes que retenham seu valor ao longo do tempo, ou seja, que possam ser reutilizáveis.

Configuração e Conceitos

O .JAR do Junit pode ser encontrado na página principal do próprio framework (url nas referências deste artigo).

Para configurar o JUnit em seu ambiente, é necessário adicionar o .JAR do JUnit ao caminho do seu projeto. Se você estiver trabalhando com o Eclipse, você deve em:

[Seu Projeto]/ Propriedades / Bibliotecas/ Incluir JAR Externo e apontar para o caminho plug-ins/ org.JUnit/ JUnit.jar.

Existem alguns conceitos específicos do framework para a criação de testes. Para se testar uma classe específica, é necessário criar uma classe que deve ser herdeira da classe JUnit.framework.TestCase. Para fazer os testes dos métodos de uma certa classe, a classe de teste deve implementar um testXXX(), sendo XXX, normalmente, o nome do método da classe que esta sendo testada.

Toda classe de teste é uma subclasse da classe TestCase que é declarada no pacote do JUnit.framework localizado no arquivo JUnit.jar.

TestCase é a classe que chama os métodos das classes para realizar os testes. Podendo ser realizado um único teste ou vários testes ao mesmo tempo, através do objeto composto TestSuite.

E há as asserções, que tem o objetivo de verificar valores de saída de um processamento, facilitando assim a análise dos resultados obtidos em testes de unidade. Ao executar o JUnit as saídas esperadas são validadas através do métodos chamados assertXxx, onde Xxx pode ser True, False Equals, ou outra condição. Além disso, pode ser passada para esses métodos alguma mensagem especifica caso o teste falhe.

Convenções

São consideradas as seguintes convenções do JUnit:

  • Test Case Class: [NomeClasse]Test.java, onde NomeClasse é o nome da classe a ser testada.
  • Test Case Method: [NomeMetodo], onde NomeMetodo é o nome do método a ser testado.

Estas convenções são consideradas boas práticas em testes, assim como separar o código de teste do código da aplicação em si. Isto pode ser feito criando pacotes com nomes referenciando testes, onde deverão estar somente as classes de teste.

Referências

- http://www.JUnit.org.
- http://JUnit.sourceforge.net/doc/cookbook/cookbook.htm

Eric C M Oliveira

Eric C M Oliveira - Bacharel em Ciencia da Computação/FASP e Comunicação/Unesp, tem experiência em desenvolvimento Java nas plataformas J2SE, J2EE e J2ME, além de atividades ligadas a disciplina de testes, engenharia e qualidade de software. Tem certificações Java SCJP 1.3, SCJP 1.4, Rational Test Management, Rational Robot e RUP (Rational Unified Process).