Você está na página 1de 19

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