Sei sulla pagina 1di 73

Testes de Unidade com JUnit

lvaro dArce alvaro@darce.com.br

04/05/2012

Tpicos

Testes de Programas JUnit Introduo JUnit Prtica

04/05/2012

Testes de Programas

Qualquer recurso de programa sem um teste automatizado simplesmente no existe. Kent Beck. Extreme Programing Explained. p 56

04/05/2012

Testes de Programas
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

04/05/2012

Testes de Programas

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

04/05/2012

Testes de Programas
Testes devem ser escritos Poucos o fazem... Falta de tempo... Resultado: ciclo vicioso
Menos testes Menos produtividade Menos estabilidade

Mais presso

Quebrando o ciclo:

Criar um ambiente simples de testes

04/05/2012

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

04/05/2012

Testes de Programas
Testes de Unidade (Unitrio)

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

04/05/2012

Testes de Programas
Java: Teste pelo mtodo main()

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

04/05/2012

10

Testes de Programas
Java: Teste pelo mtodo main()
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

04/05/2012

11

Testes de Programas
Java: Teste pelo mtodo main()

No h mecanismos para coletar resultados de maneira

estruturada
No h replicabilidade
Aps cada teste, o desenvolvedor tem que examinar e interpretar os

resultados

04/05/2012

12

Testes de Programas
JUnit
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

04/05/2012

13

Tpicos

Testes de Programas JUnit Introduo JUnit Prtica

04/05/2012

14

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

04/05/2012

15

JUnit
Vantagens
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

04/05/2012

16

JUnit
Vantagens
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...

04/05/2012

17

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

04/05/2012

18

JUnit
Arquitetura
JUnit 3

Test
+runTest()

Classe Test
runTest(): controla execuo de testes particulares

Classe TestCase: testa os resultados de um

TestCase
+runTest() +setUp() +tearDown()

TestSuite
+runTest()

mtodo
setUp(): chamado antes de cada mtodo de teste* tearDown(): chamado depois de cada mtodo de

teste*
Classe TestSuite: define um conjunto de testes

at o JUnit 3.x a partir do JUnit 4

JUnit 4
import static na API

API do JUnit

*defasados substitudos por anotaes no JUnit 4

04/05/2012

19

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

04/05/2012

20

Dvidas?

04/05/2012

21

Tpicos

Testes de Programas JUnit Introduo JUnit Prtica

04/05/2012

22

JUnit no Eclipse
Exemplo 1: Calculadora

Classe a ser testada

04/05/2012

23

JUnit no Eclipse
Criando um Caso de Teste

Boto direito na classe a ser testada (Calculadora) New JUnit Test Case

04/05/2012

24

JUnit no Eclipse
Criando um Caso de Teste

Nome do caso de teste Classe a ser testada Next

04/05/2012

25

JUnit no Eclipse
Criando um Caso de Teste

Selecionar mtodos a

serem testados Finish

04/05/2012

26

JUnit no Eclipse
Criando um Caso de Teste

Perform the following action... Ok

04/05/2012

27

JUnit no Eclipse
Criando um Caso de Teste

Esqueleto do caso de teste testSomar():


Testes para o mtodo somar()

04/05/2012

28

Exemplo 1: Calculadora
Implementando o Caso de Teste criado

Classe a ser testada Caso de teste

04/05/2012

29

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

04/05/2012

30

Exemplo 1: Calculadora
Executando o Caso de Teste - Plugin

Boto direito no caso de teste Run As JUnit Test

04/05/2012

31

Exemplo 1: Calculadora
Resultado dos testes - Plugin
Exemplo de resultado com falhas

Falha: quando uma afirmao (assertion) falha Erro: quando ocorre uma exceo
Ex.: NullPointerException, ArrayIndexOutOfBoundsException ...

Resultado sem falhas

04/05/2012

32

Exemplo 1: Calculadora
Executando o Caso de Teste - Cdigo

04/05/2012

33

JUnit
Assertions
Sintaxe do Mtodo assertEquals([String mensErro,] esperado, atual) assertFalse([String mensErro,] boolean condicao) assertTrue([String mensErro,] boolean condicao) assertNotNull([String mensErro,] Object objeto) assertNull([String mensErro,] Object objeto) assertNotSame([String mensErro,] Object esperado, Object atual) assertSame([String mensErro,] Object esperado, Object atual) fail([String mensErro]) Descrio Compara dois valores Avalia uma expresso booleana Teste passa se esperado.equals (teste) condicao == false condicao == true objeto != null Compara um objeto com nulo objeto == null esperado != atual Compara dois objetos esperado == atual

Causa uma falha no teste atual (comumente usado em manipulao de excees)

04/05/2012

34

JUnit
Diferena entre verses
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()

04/05/2012

35

JUnit
Diferena entre verses
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

04/05/2012

36

JUnit
Anotaes do JUnit 4
@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

04/05/2012

37

JUnit
Anotaes do JUnit 4
@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

04/05/2012

38

JUnit
Sequncia de Desenvolvimento
@BeforeClass
Antes de todos os testes

Testes consecutivos

@Before

Antes de cada teste


setUp()

@Test

Teste

@After

Aps cada teste


tearDown()

@AterClass

Aps todos os testes

04/05/2012

39

Exemplo 2
Sequncia dos mtodos

04/05/2012

40

Exemplo 2
Ignorando um teste

Ignorado

Ignorado

04/05/2012

41

Exemplo 3: Janela
Classe Janela

04/05/2012

42

Exemplo 3: Janela
Caso de Teste: JanelaTest

A classe Janela est correta?

04/05/2012

43

Exemplo 3: Janela
Caso de Teste: JanelaTest

Mudar posio

A classe Janela est correta?

04/05/2012

44

Exemplo 4: Esperando excees


Caso de Teste

04/05/2012

45

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

04/05/2012

46

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

04/05/2012

47

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

04/05/2012

48

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

04/05/2012

49

Dicas
Quais e quantos testes escrever

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

04/05/2012

50

Dicas
Quais e quantos testes escrever

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

04/05/2012

51

Exerccio
Criatividade na criao de testes
MovimentoFinanceiro -ID: int -TipoES: char -DataEmissao: Date -Cliente: int -DataVencimento: Date -DataPagamento: Date -ValorOriginal: float -ValorJuros: float -ValorPagamento: float

Exerccio

+geraID(valorIncremento: int): int +geraVencimento(dataEmissao: Date): Date +calculaJuros(valorOriginal: float): float +calculaValorPagamento(valorOriginal: float, valorJuros: float): float

Imagine e crie testes para esta classe de movimentao financeira

04/05/2012

52

Exemplo 5: Memoria
Classe MemoriaS1/3

04/05/2012

53

Exemplo 5: Memoria
Classe MemoriaS2/3

04/05/2012

54

Exemplo 5: Memoria
Classe MemoriaS3/3

04/05/2012

55

Exemplo 5: Memoria
Classe CD
1/2

04/05/2012

56

Exemplo 5: Memoria
Classe CD
2/2

04/05/2012

57

Exemplo 5: Memoria
Classe HD

04/05/2012

58

Exemplo 5: Memoria
Caso de Teste MemoriaTeste

04/05/2012

59

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

04/05/2012

60

Sute de Testes
Exemplo 6: Classe Utils

04/05/2012

61

Sute de Testes
Exemplo 6: Caso de Teste TesteUtils

04/05/2012

62

Sute de Testes
Exemplo 6: Resultados de TesteUtils

04/05/2012

63

Sute de Testes
Exemplo 6: Classe Vetores

04/05/2012

64

Sute de Testes
Exemplo 6: Caso de Teste TesteVetores

04/05/2012

65

Sute de Testes
Exemplo 6: Resultado de TesteVetores

04/05/2012

66

Sute de Testes
Criando a Sute

Boto no pacote dos testes

04/05/2012

67

Sute de Testes
Criando a Sute

JUnit Test Suite Next

04/05/2012

68

Sute de Testes
Criando a Sute

Definir nome da sute Selecionar casos de

teste Finish

04/05/2012

69

Sute de Testes
Exemplo 6: Criando a Sute

Sute de Testes criada, padro JUnit 3 Execute-a como um caso de teste

04/05/2012

70

Sute de Testes
Sute em JUnit 4

Sute de Testes modificada para padro JUnit 4 Execute-a como um caso de teste

04/05/2012

71

Sute de Testes
Resultado dos testes da sute

04/05/2012

72

Dvidas?

04/05/2012

73

Exerccios
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

Potrebbero piacerti anche