Você está na página 1de 89

Testes de Unidade

com JUnit

Prof. MSc. lvaro dArce
alvaro@darce.com.br
Tpicos
Testes de Programas

JUnit Introduo

JUnit Prtica
2
Testes
Voc viajaria em um avio que nunca saiu do cho?










Voc entrega software sem testar?
3
Testes de Programas [1/4]
Qualquer recurso de programa sem um teste
automatizado simplesmente no existe.

Kent Beck. Extreme Programing Explained. p 56
4
Testes de Programas [2/4]
Defeitos de programa: problemas
Custos enormes
Tempo, dinheiro, frustraes...

Como amenizar esses problemas?
Criao e execuo de casos de teste (de maneira contnua) para
programas
Abordagem prtica e comum para lidar com defeitos de programas
Antes que sejam deixados para trs no ambiente de desenvolvimento
5
Testes de Programas [3/4]
Importncia dos testes

Um produto de software deve passar por vrias fases de teste:
Teste de unidade, de integrao, de sistema, de aceitao...

Funo de um teste:

Certificar que uma determinada entrada sempre produz uma
mesma sada
6
Testes de Programas [4/4]
Testes devem ser escritos
Poucos o fazem...
Falta de tempo...
Resultado: ciclo vicioso
7
Menos testes
Menos produtividade
Menos estabilidade
Mais presso
Quebrando o ciclo:
Criar um ambiente simples de testes
Testes de Programas
Testes de Unidade (Unitrio)
Testam as menores unidades de programa desenvolvidas
POO: unidade pode ser mtodo/classe/objeto

Objetivo
Prevenir defeitos
Permitir um nvel de qualidade de produto durante o
desenvolvimento do software
8
Testes de Programas
Importncia dos Testes [1/5]
Dados no mentem Erros existem!

1/3 poderiam ser evitados

50% so detectados em produo

Prejuzo de US$ ~60 bilhes/ano

[http://www.nist.gov/public_affairs/releases/n02-10.htm]

9
Testes de Programas
Importncia dos Testes [2/5]
Defeitos so caros!

Quanto mais tarde so encontrados, mais caros sero.

Concluso:

melhor encontrar defeitos o mais cedo possvel.
10
Testes de Programas
Importncia dos Testes [3/5]
Seja profissional, garanta seu trabalho!

Voc o nico responsvel pela qualidade do seu
trabalho.
Ningum melhora se voc no melhorar primeiro.

Desenvolvedores profissionais
escrevem testes

Teste seu software!
11
Testes de Programas
Importncia dos Testes [4/5]
Jamais entregue ao seu cliente um produto sem
qualidade!
12
Testes de Programas
Importncia dos Testes [5/5]
Escreva seus testes antes de terminar sua programao.

Voc vai:

Amar seus cdigos

Programar melhor

Pensar antes de codificar

Reduzir cdigo intil

Ganhar com qualidade
13
Testes de Programas
Testes de Unidade (Unitrio) [1/2]
Pergunta:
Ao criarmos mtodos na programao OO, temos a certeza de que
ele retorna o valor correto?
Ou em caso mais geral, ser que eles esto fazendo o que
deveriam fazer?

Resposta:
Vamos aplicar testes unitrios
14
Testes de Programas
Testes de Unidade (Unitrio) [2/2]
Testes

Responsabilidade do prprio desenvolvedor

Comumente testam um mtodo individualmente
Comparao de uma sada conhecida aps o processamento da
mesma

No testam todo o programa
15
Testes de Programas
Java: Teste pelo mtodo main() [1/3]
Criao do mtodo main() na classe a ser testada

Instncia da classe

Execuo de uma srie de checagens
Certificar que o objeto possui o comportamento desejado
16
Testes de Programas
Java: Teste pelo mtodo main() [2/3]
Questes: eficincia como ambiente de teste

No h conceito explcito de teste aprovado ou reprovado
Normalmente, o programa gera mensagens com System.out.println()
Desenvolvedor decide se a mensagem est correta ou no

main() tem acesso a itens protected e private
Enquanto desenvolvedor pode querer testar o funcionamento interno de
uma classe, muitos testes se referem interface de um objeto ao
mundo externo
17
Testes de Programas
Java: Teste pelo mtodo main() [3/3]
Muito cdigo a ser escrito

Testa-se apenas 1 mtodo por vez

No h mecanismos para coletar resultados de maneira
estruturada
Mais cdigo ainda para se verificar o retorno dos mtodos de forma
automtica

No h replicabilidade
Aps cada teste, o desenvolvedor tem que examinar e interpretar os
resultados
18
Testes de Programas
Junit [1/2]
Sempre que voc estiver tentando
escrever um print() ou uma expresso
de depurao, escreva um teste.

Martin Fowler
19
Testes de Programas
Junit [2/2]
Framework de criao de testes automatizados para
desenvolvimento Java

Possui API que habilita o desenvolvedor a facilmente criar
casos de teste em Java

Prov abrangente facilidade de assero
Verificar resultados esperados x resultados reais

Utiliza um princpio fundamental da programao XP:
Criao e execuo de testes deve ser fcil
20
Tpicos
Testes de Programas

JUnit Introduo

JUnit Prtica
21
JUnit
Introduo
Facilita criao de cdigo para automao de testes com
apresentao dos resultados
Dirigido a Testes de unidade Caixa Branca
Componentes de um sistema (classes/mtodos) testados de maneira
isolada

Verifica se cada mtodo de uma classe funciona da
maneira esperada
Exibindo possveis erros ou falhas
22
JUnit
Vantagens [1/2]
Permite rpida criao de cdigos de teste
Possibilitando aumento da qualidade do sistema sendo
desenvolvido e testado

No necessrio escrever o prprio framework
Framework Caixa Preta

Amplamente utilizado pelos desenvolvedores da
comunidade open-source

Uma vez escritos, os testes so executados rapidamente
Sem a interrupo do processo de desenvolvimento
23
JUnit
Vantagens [2/2]
Checa os resultados dos testes e fornece uma resposta
imediata

Pode-se criar uma hierarquia de testes que permitir
testar apenas uma parte ou todo o sistema

Permite que o programador perca menos tempo
depurando seu cdigo

Integrao com as principais IDEs
NetBeans, Eclipse, JDeveloper...
24
Testes Manuais x JUnit
Calcular imposto com base no salrio calcular( Float
salario )

Imposto 27,5% a partir de 3.743
Imposto 22,5% a partir de 2.995 at 3.743
O mtodo deve retornar o valor do imposto a ser pago
25
Testes Manuais x JUnit
Mtodo a ser testado
26
public static double calcular( double salario ) {
if ( salario > 3743 ) {
return salario * 0.275;
} else if ( salario > 2995 && salario < 3743) {
return salario * 0.225;
}
return -1;
}
Testes Manuais x JUnit
Teste manual pelo mtodo main
27
public static void main( String args[] ){

double resultado = calcular( 3800.0);
if ( resultado == 1045) {
System.out.println("Passou no teste");
} else {
System.out.println("Teste falhou");
}
}
Testes Manuais x JUnit
Classe de teste automatizado com JUnit [1/2]
28
import org.junit.Assert;
import org.junit.Test;

public class FiscalRendaTest {

@Test
public void testCalculo(){
double resultado =
FiscalRenda.calcular(3800.0);
Assert.assertEquals(1045, resultado, 0.1);
}
}
Testes Manuais x JUnit
Classe de teste automatizado com JUnit [2/2]
29
import org.junit.Assert;
import org.junit.Test;

public class FiscalRendaTest {

@Test
public void testCalculo(){
double resultado =
FiscalRenda.calcular(3800.0);
Assert.assertEquals(1045, resultado, 0.1);
}
}
Erro
Quando o mtodo de teste
produziu um resultado
inesperado (exceo)

Falha
Quando h algum problema
relacionado ao cdigo
testado

Sucesso
Quando o mtodo produziu o
resultado esperado
JUnit
Utilizao
1. Criar uma classe de testes JUnit

2. Imports as classes e mtodos necessrios

3. Criar mtodos para realizar os testes

4. Comparar o retorno do mtodo testado com o resultado
esperado
30
JUnit
Questes
Casos de teste so definidos em classes separadas
Sem acesso a partes encapsuladas

Testes so realizados a partir da interface de um objeto
ao mundo externo

Hbito:
1.Codifique um pouco...
2.Teste um pouco...
3.Codifique um pouco...
4.Teste um pouco...
Resumo: Objeto pronto, teste-o
31
JUnit
Arquitetura
JUnit 3
Classe Test
runTest(): controla execuo de testes particulares

Classe TestCase: testa os resultados de um
mtodo
setUp(): chamado antes de cada mtodo de teste*
tearDown(): chamado depois de cada mtodo de
teste*

Classe TestSuite: define um conjunto de testes

JUnit 4
import static na API

*defasados substitudos por anotaes no JUnit 4
32
Test
+runTest()
TestCase
+runTest()
+setUp()
+tearDown()
TestSuite
+runTest()
API do JUnit
at o JUnit 3.x
a partir do JUnit 4
JUnit
Consideraes Finais
Testes de unidade:
Importantes na construo de mtodos
Permite ao desenvolvedor test-los durante a construo
Viabilizando a implementao de mtodos livres de erros

JUnit:
Possibilita criar testes antes da concluso do sistema
Testando mtodos separadamente assim que estiverem prontos
Evita percorrer todo o cdigo para descobrir defeitos que possivelmente
apareceriam quando o sistema estivesse pronto
Viabiliza criao de sistemas mais estveis
33
Dvidas?
34
Tpicos
Testes de Programas

JUnit Introduo

JUnit Prtica
35
JUnit no Eclipse
Exemplo 1: Calculadora
36
Classe a ser testada
JUnit no Eclipse
Criando um Caso de Teste [1/5]
Boto direito na classe a ser testada (Calculadora)
New
JUnit Test Case
37
JUnit no Eclipse
Criando um Caso de Teste [2/5]
Nome do caso de teste
Classe a ser testada
Next
38
JUnit no Eclipse
Criando um Caso de Teste [3/5]
Selecionar mtodos a
serem testados
Finish
39
JUnit no Eclipse
Criando um Caso de Teste [4/5]
Perform the following action...
Ok
40
JUnit no Eclipse
Criando um Caso de Teste [5/5]
Esqueleto do caso de teste
testSomar():
Testes para o mtodo somar()
41
Exemplo 1: Calculadora
Implementando o Caso de Teste criado
42
Classe a ser testada
Caso de teste
JUnit no Eclipse
Execuo de um Caso de Teste
Por plugin
Interface pronta
Recursos:
Visualizao de falhas e erros (excees)
Debug
Histrico de testes

Por cdigo
Desenvolvedor cria a interface
Mtodo conhecido como TestRunner
43
Exemplo 1: Calculadora
Executando o Caso de Teste - Plugin
Boto direito no caso de teste
Run As
JUnit Test
44
Exemplo 1: Calculadora
Resultado dos testes - Plugin
Falha: quando uma afirmao (assertion) falha
Erro: quando ocorre uma exceo
Ex.: NullPointerException, ArrayIndexOutOfBoundsException ...
45
R
e
s
u
l
t
a
d
o

s
e
m

f
a
l
h
a
s

E
x
e
m
p
l
o

d
e

r
e
s
u
l
t
a
d
o

c
o
m

f
a
l
h
a
s

Exemplo 1: Calculadora
Executando o Caso de Teste - Cdigo
46
JUnit
Assertions
47
Sintaxe do Mtodo Descrio Teste passa se
assertEquals([String mensErro,]
esperado, atual)
Compara dois
valores
esperado.equals
(teste)
assertFalse([String mensErro,]
boolean condicao)
Avalia uma
expresso booleana
condicao == false
assertTrue([String mensErro,]
boolean condicao)
condicao == true
assertNotNull([String mensErro,]
Object objeto)
Compara um objeto
com nulo
objeto != null
assertNull([String mensErro,]
Object objeto)
objeto == null
assertNotSame([String mensErro,]
Object esperado, Object atual)
Compara dois
objetos
esperado != atual
assertSame([String mensErro,]
Object esperado, Object atual)
esperado == atual
fail([String mensErro]) Causa uma falha no teste atual
(comumente usado em manipulao de
excees)
JUnit
Diferena entre verses [1/2]
At o JUnit 3.x

Classes de teste herdam classe TestCase
Declarao do construtor da classe

Mtodos de teste iniciavam com a palavra test
testMetodo(), testGravacao(), testSoma() etc

Mtodo setUp()

Mtodo tearDown()
48
JUnit
Diferena entre verses [2/2]
A partir do JUnit 4

Herana de TestCase substituda por import esttico
import static org.junit.Assert.*
No precisa declarar o construtor da classe

Mtodos de teste identificados com a anotao @Test

Mtodos setUp() e tearDown() substitudos pelas anotaes
@Before e @After respectivamente
49
JUnit
Anotaes do JUnit 4 [1/2]
@Test
Identifica que o mtodo um mtodo de teste.

@Before
Executa o mtodo antes de cada teste. Este mtodo pode ser
usado para preparar o ambiente de teste (Ex: ler dados do
usurio). Substituto do setUp().

@After
Executa o mtodo aps cada teste. Substituto do tearDown().

@BeforeClass
Executa o mtodo antes do incio de todos os testes
Ex: conectar base de dados
50
JUnit
Anotaes do JUnit 4 [2/2]
@AfterClass
Executa o mtodo aps todos os testes finalizarem (Ex:
desconectar base de dados).

@Ignore[(Comentrio)]
O mtodo ignorado.

@Test (expected=IllegalArgumentException.class)
Testa se o mtodo levanta a exceo especificada.

@Test (timeout=100)
Falha se o teste demorar mais que 100 milissegundos
51
JUnit
Sequncia de Desenvolvimento
52
@BeforeClass
@Before
@Test
@After
@AterClass
T
e
s
t
e
s

c
o
n
s
e
c
u
t
i
v
o
s

Antes de todos os testes
Antes de cada teste
setUp()
Teste
Aps cada teste
tearDown()
Aps todos os testes
Exemplo 2
Sequncia dos mtodos
53
Exemplo 2
Ignorando um teste
54
Ignorado
Ignorado
Exemplo 3: Janela
Classe Janela
55
Exemplo 3: Janela
Caso de Teste: JanelaTest [1/2]
A classe Janela est correta?
56
Exemplo 3: Janela
Caso de Teste: JanelaTest [2/2]
A classe Janela est correta?
57
Mudar
posio
Exemplo 4: Esperando excees
Caso de Teste
58
Exemplo 4: Esperando excees
Resultado
divisaoComExcecao(): erro
Exceo ocorrida (diviso por zero)
divisaoEsperandoExcecao1(): passou
Ocorreu exceo esperada
divisaoEsperandoExcecao2(): falhou
No ocorreu exceo esperada
divisaoSemExcecao(): passou
59
Dicas
Organizao
Organize os casos de teste em uma pasta separada
dos cdigos fonte do sistema
Organize os casos de teste dentro dos mesmos pacotes que os
cdigos fonte
60
Dicas
Desenvolvimento Dirigido a Testes
Testes devem ser
escritos assim que possvel
adaptados de acordo com mudanas

Testes antigos:
Deixar em execuo

Surgimento de novas ideias:
1.Criar testes
2.Verificar se funcionam
3.Se necessrio, altere o cdigo do programa
61
Dicas
Granularidade dos Testes
Cada teste deve verificar uma poro especfica de uma
funcionalidade do sistema

No combine testes no relacionados em um nico
mtodo de teste
62
Dicas
Quais e quantos testes escrever [1/2]
Regra principal:
Tenha criatividade para imaginar as possibilidades de testes

Comece pelo teste mais simples
deixe os mais complexos para o final

Use apenas dados suficientes
Ex.: no teste 10 condies se apenas 3 so suficientes
63
Dicas
Quais e quantos testes escrever [2/2]
No teste mtodos triviais
gets e sets
Mtodos set: Somente crie testes se houver validao de dados

Achou um bug?
No conserte sem antes escrever um teste que o detecte
Caso contrrio, ele pode voltar
64
Exerccio
Criatividade na criao de testes
Imagine e crie testes para esta classe de movimentao
financeira
65
MovimentoFinanceiro
-ID: int
-TipoES: char
-DataEmissao: Date
-Cliente: int
-DataVencimento: Date
-DataPagamento: Date
-ValorOriginal: float
-ValorJuros: float
-ValorPagamento: float
+geraID(valorIncremento: int): int
+geraVencimento(dataEmissao: Date): Date
+calculaJuros(valorOriginal: float): float
+calculaValorPagamento(valorOriginal: float, valorJuros: float): float
Exerccio
Exemplo 5: Memoria
Classe MemoriaS [1/3]
66
Exemplo 5: Memoria
Classe MemoriaS [2/3]
67
Exemplo 5: Memoria
Classe MemoriaS [3/3]
68
Exemplo 5: Memoria
Classe CD [1/2]
69
Exemplo 5: Memoria
Classe CD [2/2]
70
Exemplo 5: Memoria
Classe HD
71
Exemplo 5: Memoria
Caso de Teste MemoriaTeste
72
JUnit
Sutes de Testes
Crescimento do nmero de testes de unidade:
Necessrio uma sute de testes
Gerenciamento de uma coleo de testes

Conjunto de testes
Executa uma coleo de Casos de Teste
73
Sute de Testes
Exemplo 6: Classe Utils
74
Sute de Testes
Exemplo 6: Caso de Teste TesteUtils
75
Sute de Testes
Exemplo 6: Resultados de TesteUtils
76
Sute de Testes
Exemplo 6: Classe Vetores
77
Sute de Testes
Exemplo 6: Caso de Teste TesteVetores
78
Sute de Testes
Exemplo 6: Resultado de TesteVetores
79
Sute de Testes
Criando a Sute
Boto no pacote dos testes
80
Sute de Testes
Criando a Sute
JUnit Test Suite
Next
81
Sute de Testes
Criando a Sute
Definir nome da sute
Selecionar casos de
teste
Finish
82
Sute de Testes
Exemplo 6: Criando a Sute
Sute de Testes criada, padro JUnit 3
Execute-a como um caso de teste
83
Sute de Testes
Sute em JUnit 4
Sute de Testes modificada para padro JUnit 4
Execute-a como um caso de teste
84
Sute de Testes
Resultado dos testes da sute
85
Dvidas?
86
Exerccios [1/2]
Criar testes unitrios em JUnit para:

Mtodo para realizar soma
Recebe como entrada dois nmeros
Retorna o resultado da soma

Mtodo para ralizar diviso
Lanar exceo quando receber 0 no denominador

Mtodo para realizar depsito em uma conta bancria
O mtodo deve receber um flutuante com o valor a ser depsitado
O mtodo deve retornar o valor contido na conta
87
Exerccios [2/2]
Criar testes unitrios em JUnit para:

Mtodo para fazer o saque em uma conta
O mtodo aceita dois valores: valor_saque, valor_saldo
O mtodo deve retornar um valor referente ao saldo da conta aps o
saque ou -1 em situao de erro

Mtodo para liberar ou no a prova do Detran
O mtodo aceita um valor do tipo Integer com a idade do aluno
A liberao da prova ser mediante ao atendimento dos critrios
Idade do aluno entre 18 e 90 anos
O mtodo deve retornar um boolean true caso a prova seja liberada ou
false em caso contrrio
88
Exerccios para Casa
Treinamento:

Implementar cada exemplo da aula

Criatividade:

Implementar 1 classe e alguns casos de teste para:
Registro de ligaes
Fila de impresso
Bilheteria de cinema
Estacionamento com ticket
89

Você também pode gostar