Testes de Unidade com JUnit
JUnit
- Junit: framework para desenvolvimento e execução de testes de
unidade em programas Java
- Define um modelo de programação para a criação de testes de
unidade em classes Java
- Disponibiliza o TestRunner aplicação em modo texto ou gráfico para
execução de Testes
- Podemos baixar o Junit em www.junit.org – O arquivo junit.jar deve
estar no classpath do nosso projeto
Facilidades do JUnit
- Permite criação de testes unitários para métodos pertencentes a uma
classe
- Permite a definição e execução de um conjunto de testes unitários –
Suites de Teste
- Permite a execução de teste com relato de problemas ocorridos e
onde especificamente ocorreram os erros
JUnit Passo a Passo
1º Passo
- Criar uma classe de teste para cada classe a ser testada
- Exemplo: classe Aritmetica terá como classe de teste AritmeticaTest
- A classe de Teste deve herdar da classe TestCase do framework JUnit
JUnit Passo a Passo
2º Passo
– Criar métodos de teste para cada método (ou funcionalidade) a ser
testado (cujos nomes devem começar com a palavra “test”) com tipo de
retorno void.
– Exemplo para a classe AritmeticaTest:
public void testSoma()
public void testSubtracao()
public void testDivisao()
public void testMultiplicacao()
JUnit Passo a Passo
3º Passo
- para cada método de teste definir seu comportamento:
- invocação de métodos da classe do sistema a ser testada
- avaliação do resultado dos métodos sendo testados usando os
métodos assertEquals(), fail(), assertNull(), assertNotNull() do framework
JUnit
JUnit Passo a Passo
MÉTODO DESCRIÇÃO TESTE PASSA SE
Compara dois
assertEquals(a,b) valores a.equals(b)
assertFalse(a) a == false
Avalia uma
expressão booleana
assertTrue(a) a == true
assertNotNull(a) a != Null
Compara uma
variavel com nulo
assertNull(a) a == Null
assertNotSame(a,b) a != b
Compara dois
objetos
assertSame(a,b) a == b
Causa uma falha no
fail() teste atual
JUnit Passo a Passo: Exemplo
public class Aritmetica {
public int soma(int op1, int op2) {
return op1 + op2;
}
public int subtracao(int op1,int op2) {
return op1 -op2;
}
public int multiplicacao(int op1, int op2) {
return op1 * op2;
}
public int divisao(int op1, int op2) throws Exception {
if (op2 == 0 ) {
throw new Exception("Divisao por zero");
} else {
return op1/op2;
}
}
}
JUnit Passo a Passo: Exemplo
import junit.framework.*;
public class AritmeticaTest extends TestCase {
public void testSoma() {
Aritmetica operacoes = new Aritmetica();
this.assertEquals(4,operacoes.soma(3,1));
}
public void testSubtracao(){
Aritmetica operacoes = new Aritmetica();
this.assertEquals(2, operacoes.subtracao(3,1));
}
public void testDivisao() {
Aritmetica operacoes = new Aritmetica();
try {
operacoes.divisao(3,0);
fail("Deveria lançar Excecao");
} catch (Exception e) {
}
}
public void testMultiplicacao(){
Aritmetica operacoes = new Aritmetica();
this.assertEquals(3,operacoes.multiplicacao(3,1));
}
}
JUnit Passo a Passo: Exemplo
Como Executar o teste?
- Direto na linha de comando:
- Ou inserir os métodos abaixo na classe de teste
public static Test suite(){
return new TestSuite(AritmeticaTest.class);
public static void main(String[] args){
junit.textui.TestRunner.run(suite());
- Quase todos os IDE's usadas hoje em dia executam as classes de teste do
JUnit
Observação
Caso necessário, pode-se definir configurações iniciais para serem
executadas antes de cada método de teste usando o método setUp()
- configuração de objetos comuns aos casos de teste
- configuração de recursos comuns aos casos deTeste
- (exemplo: abertura de conexões de banco de dados, socket, etc)
Para liberar recursos utilizados pelos métodos de teste pode-se usar o
método tearDown()
- Exemplos de recursos que podem ser liberados: streams, fechar
conexões de banco de dados, apagar/mover arquivos de dados.
JUnit Passo a Passo
public class Aritmetica {
private int op1,op2;
public void setOp1(int op1) {
this.op1 = op1;
}
public void setOp2(int op2) {
this.op2 = op2;
public int soma() {
return op1 + op2;
}
public int subtracao() {
return op1 -op2;
}
public int multiplicacao() {
return op1 * op2;
}
public int divisao() throws Exception {
if (op2 == 0 ) {
throw new Exception("Divisao por zero");
} else {
return op1/op2;
}
}
}
JUnit Passo a Passo
import junit.framework.*;
public class AritmeticaTest extends TestCase {
Aritmetica operacoes;
public void setUp() {
operacoes = new Aritmetica();
operacoes.setOp1(3);
operacoes.setOp2(1);
}
public void testSoma() {
this.assertEquals(4,operacoes.soma());
}
public void testSubtracao(){
this.assertEquals(2, operacoes.subtracao());
}
public void testDivisao() {
try {
this.assertEquals(3,operacoes.divisao());
} catch (Exception e) {
}
}
public void testMultiplicacao(){
this.assertEquals(3,operacoes.multiplicacao());
}
}
Execução JUnit
Seqüência de execução do JUnit:
- Cria uma instância da classe de teste para cada método de teste
(Exemplo: 4 testes, 4 instâncias).
- O test case é instanciado para executar um método testXXX() de
cada vez.
As alterações que ele fizer ao estado do objeto não afetarão os demais
testes
Para cada instância:
- Chama o método setUp();
- Chama o método de teste;
- Chama o método tearDown();
Suites de Testes
Quando falamos em teste automatizado, é comum querermos executar
um conjunto de testes de uma única vez;
Suites de testes representam um conjunto de testes que serão
executados seqüencialmente;
JUnit define a classe TestSuite que:
- Permite incluir todos os métodos de teste de uma classe em um
suite de teste;
- Permite definir uma classe que inclui todos os suites de teste
das classes do sistema.
TestSuite
Permite executar uma coleção de testes
- Método addTest(TestSuite) adiciona um teste na Lista
Padrão de codificação:
- retornar um TestSuite em cada test-case:
public static TestSuite suite() {
return new TestSuite(SuaClasseTest.class);
}
- criar uma classe AllTests que combina as suites:
public class AllTests {
public static Test suite() {
TestSuite testSuite = new TestSuite("Roda tudo");
testSuite.addTest(pacote.AllTests.suite());
testSuite.addTest(MinhaClasseTest.suite());
testSuite.addTest(SuaClasseTest.suite());
return testSuite;
}
}
Observações gerais
- Cada teste deve verificar um pedaço específico
da funcionalidade
- Não combine testes não relacionados em um
único método testXXX()
- Se o primeiro teste falhar os seguintes não
serão executados
PERGUNTAS?
FIM