JUnit
O JUnit é um framework open-source, que se assemelha ao raio de testes software java, criado por Erich Gamma e Kent Beck, com suporte à criação de testes automatizados na linguagem de programação Java.
Esse framework facilita a criação e manutenção do código para a automação de testes com apresentação dos resultados. Com ele, pode ser verificado se cada método de uma classe funciona da forma esperada, exibindo possíveis erros ou falhas podendo ser utilizado tanto para a execução de baterias de testes como para extensão.
Com JUnit, o programador tem a possibilidade de usar esta ferramenta para criar um modelo padrão de testes, muitas vezes de forma automatizada.
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. 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.assertEquals(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.
O JUnit permite a realização de testes de unidades, conhecidos como "caixa branca", facilitando assim a correção de métodos e objetos.
Algumas vantagens de se utilizar JUnit:
- Permite a criação rápida de código de teste enquanto possibilita um aumento na qualidade do sistema sendo desenvolvido e testado;
- Não é necessário escrever o próprio framework;
- Amplamente utilizado pelos desenvolvedores da comunidade código-aberto, possuindo um grande número de exemplos;
- Uma vez escritos, os testes são executados rapidamente sem que, para isso, seja interrompido o processo de desenvolvimento;
- JUnit checa os resultados dos testes e fornece uma resposta imediata;
- Pode-se criar uma hierarquia de testes que permitirá testar apenas uma parte do sistema ou todo ele;
- Escrever testes com JUnit permite que o programador perca menos tempo depurando seu código;
- JUnit é LIVRE.
A experiência adquirida com o JUnit tem sido importante na consolidação do Test Driven Development (desenvolvimento direcionado a testes). Além disso, ele foi adaptado a outras linguagens, tais como C♯ (NUnit), Python, Fortran, e C++.
Exemplos de Código
editarCaso de teste bem simples para mostrar como o JUnit 3.8 funciona:
import junit.framework.TestCase;
// Todo caso de teste deve herdar características de TestCase.
public class SampleTest extends TestCase {
private java.util.List<Object> listaVazia;
/**
* Este método será chamado antes de cada método de teste.
*/
protected void setUp() {
listaVazia = new java.util.ArrayList<Object>();
}
/**
* Após cada método de teste, este método é invocado para limpar o lixo.
*/
protected void tearDown() {
listaVazia = null;
}
/**
* Todo método que começar com a palavra "test" será executado pelo JUnit.
* O método testComportamento faz uma chamada ao método assertEquals(mensagem, valor
* esperado, valor atual) que verifica se o resultado de "listaVazia.size()" (tamanho da
* lista) é igual a 0 (zero) que é o valor esperado, caso contrário emite a mensagem.
*/
public void testComportamento() {
assertEquals("A lista vazia deve ter 0 elementos", 0, listaVazia.size());
}
/**
* Este método está testando a exceção. Ela deve ser lançada, pois existe
* nenhum item na lista. Caso contrário a implementação tem problemas.
*/
public void testForException() {
try {
Object o = listaVazia.get(0);
fail("Deve levantar uma IndexOutOfBoundsException");
} catch (IndexOutOfBoundsException success) {
// Sucesso
}
}
}
O mesmo teste para JUnit 4.0:
// imports reorganizados para a versão 4.0
import org.junit.Assert;
import org.junit.Test;
import org.junit.Before;
import org.junit.After;
// Não necessita herdar nada.
public class SampleTest {
private java.util.List<Object> listaVazia;
/**
* Este método será chamado antes de cada método de teste.
*/
@Before
protected void inicializar() {
listaVazia = new java.util.ArrayList<Object>();
}
/**
* Após cada método de teste, este método é invocado para limpar o lixo.
*/
@After
protected void terminou() {
listaVazia = null;
}
/**
* Todo método com a anotação @Test será executado pelo JUnit.
* O método comportamento faz uma chamada ao método assertEquals(mensagem, valor
* esperado, valor atual) que verfica se o resultado de "listaVazia.size()" (tamanho da
* lista) é igual a 0 (zero) que é o valor esperado, caso contrário emite a mensagem.
*/
@Test
public void comportamento() {
Assert.assertEquals("A lista vazia deve ter 0 elementos", 0, listaVazia.size());
}
/**
* Este método está testando a exceção. Ela deve ser lançada, pois não existe
* nenhum item na lista. Caso contrário a implementação tem problemas.
*/
@Test(expected=IndexOutOfBoundsException.class)
public void lancarException() {
listaVazia.get(0);
}
}
Exemplo de classe de testes usando versões anteriores a 3.8:
import junit.framework.TestCase;
public class TesteMultiplica extends TestCase {
public void testMultiplication() {
// Testando se 2*2=4:
assertEquals("Multiplica", 4, 2 * 2);
}
}
O Mesmo exemplo utilizando o JUnit 4.0:
import org.junit.Assert;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TesteMultiplica {
@Test
public void multiplication() {
// Testando se 2*2=4:
assertEquals("Multiplica", 4, 2 * 2);
}
}
Ligações externas
editar- Tutorial em português PTBR
- Site oficial do JUnit
- Artigo em Português sobre JUnit
- Testes de Unidade com JUnit
- JUnit antipatterns (developerWorks) and JUnit antipatterns (Exubero)
- Uma breve análise do JUnit 4
Ferramentas complementares
editar- Lobo, continuous tuning Ferramenta para testes de performance. Sua utilização é semelhante ao JUnit.