73
Testes de Unidade com JUnit Álvaro d’Arce [email protected]

Testes Unitários com JUnit

Embed Size (px)

DESCRIPTION

Testes de unidade com JUnit

Citation preview

Page 1: Testes Unitários com JUnit

Testes de Unidadecom JUnit

Álvaro d’[email protected]

Page 2: Testes Unitários com JUnit

Tópicos

Testes de Programas

JUnit – Introdução

JUnit – Prática

04/05/2012 2

Page 3: Testes Unitários com JUnit

Testes de Programas

“Qualquer recurso de programa sem um teste automatizado simplesmente não existe.”

Kent Beck. Extreme Programing Explained. p 56

04/05/2012 3

Page 4: Testes Unitários com JUnit

Testes de Programas

• Defeitos de programa: problemas• Custos enormes

• Tempo, dinheiro, frustrações...

• Como amenizar esses problemas?• Criação e execução de casos de teste (de maneira contínua) para

programas• Abordagem prática e comum para lidar com defeitos de programas

• Antes que sejam “deixados para trás” no ambiente de desenvolvimento

04/05/2012 4

Page 5: Testes Unitários com JUnit

Testes de Programas

• Importância dos testes• Um produto de software deve passar por várias fases de teste:

• Teste de unidade, de integração, de sistema, de aceitação...

04/05/2012 5

Page 6: Testes Unitários com JUnit

Testes de Programas• Testes devem ser escritos• Poucos o fazem...

• “Falta” de tempo...

• Resultado: ciclo vicioso

04/05/2012 6

Menos testesMenos produtividadeMenos estabilidade

Mais pressão

� Quebrando o ciclo:– Criar um ambiente simples de testes

Page 7: Testes Unitários com JUnit

Testes de ProgramasTestes de Unidade (Unitário)

• Testam as menores unidades de programa desenvolvidas• POO: unidade pode ser método/classe/objeto

• Objetivo• Prevenir defeitos• Permitir um nível de qualidade de produto durante o

desenvolvimento do software

04/05/2012 7

Page 8: Testes Unitários com JUnit

Testes de ProgramasTestes de Unidade (Unitário)

• Testes

• Responsabilidade do próprio desenvolvedor

• Comumente testam um método individualmente• Comparação de uma saída conhecida após o processamento da

mesma

• Não testam todo o programa

04/05/2012 8

Page 9: Testes Unitários com JUnit

Testes de ProgramasJava: Teste pelo método main()

• Criação do método main() na classe a ser testada

• Instância da classe

• Execução de uma série de checagens• Certificar que o objeto possui o comportamento desejado

04/05/2012 9

Page 10: Testes Unitários com JUnit

Testes de ProgramasJava: Teste pelo método main()

• Questões: eficiência como ambiente de teste

• Não há conceito explícito de teste aprovado ou reprovado• Normalmente, o programa gera mensagens com System.out.println()• Desenvolvedor decide se a mensagem está correta ou não

• 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 10

Page 11: Testes Unitários com JUnit

Testes de ProgramasJava: Teste pelo método main()

• Não há mecanismos para coletar resultados de maneira estruturada

• Não há replicabilidade• Após cada teste, o desenvolvedor tem que examinar e interpretar os

resultados

04/05/2012 11

Page 12: Testes Unitários com JUnit

Testes de ProgramasJUnit

• Framework de criação de testes automatizados para desenvolvimento Java

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

• Provê abrangente facilidade de asserção• Verificar resultados esperados x resultados reais

• Utiliza um princípio fundamental da programação XP:• Criação e execução de testes deve ser fácil

04/05/2012 12

Page 13: Testes Unitários com JUnit

Tópicos

Testes de Programas

JUnit – Introdução

JUnit – Prática

04/05/2012 13

Page 14: Testes Unitários com JUnit

JUnitIntrodução

• Facilita criação de código para automação de testes com apresentação dos resultados• Dirigido a Testes de unidade – Caixa Branca

• Componentes de um sistema (classes/métodos) testados de maneira isolada

• Verifica se cada método de uma classe funciona da maneira esperada• Exibindo possíveis erros ou falhas

04/05/2012 14

Page 15: Testes Unitários com JUnit

JUnitVantagens• Permite rápida criação de códigos de teste

• Possibilitando aumento da qualidade do sistema sendo desenvolvido e testado

• Não é necessário escrever o próprio framework• Framework Caixa Preta

• Amplamente utilizado pelos desenvolvedores da comunidade open-source

• Uma vez escritos, os testes são executados rapidamente• Sem a interrupção do processo de desenvolvimento

04/05/2012 15

Page 16: Testes Unitários com JUnit

JUnitVantagens

• 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 código

• Integração com as principais IDEs• NetBeans, Eclipse, JDeveloper...

04/05/2012 16

Page 17: Testes Unitários com JUnit

JUnitQuestões• Casos de teste são definidos em classes separadas

• Sem acesso a partes encapsuladas

• Testes são realizados a partir da interface de um objeto ao mundo externo

• Hábito:1.Codifique um pouco...

2.Teste um pouco...

3.Codifique um pouco...

4.Teste um pouco...

– Resumo: Objeto pronto, teste-o

04/05/2012 17

Page 18: Testes Unitários com JUnit

JUnitArquitetura

• JUnit 3• Classe Test

• runTest(): controla execução de testes particulares

• Classe TestCase: testa os resultados de um método

• setUp(): chamado antes de cada método de teste*• tearDown(): chamado depois de cada método de

teste*

• Classe TestSuite: define um conjunto de testes

• JUnit 4• import static na API

*defasados – substituídos por anotações no JUnit 4

04/05/2012 18

Test

+runTest()

Test

+runTest()

TestCase

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

TestCase

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

TestSuite

+runTest()

TestSuite

+runTest()

API do JUnit

até o JUnit 3.x

a partir do JUnit 4

Page 19: Testes Unitários com JUnit

JUnitConsiderações Finais

• Testes de unidade:• Importantes na construção de métodos

• Permite ao desenvolvedor testá-los durante a construção• Viabilizando a implementação de métodos livres de erros

• JUnit:• Possibilita criar testes antes da conclusão do sistema

• Testando métodos separadamente assim que estiverem prontos• Evita percorrer todo o código para descobrir defeitos que possivelmente

apareceriam quando o sistema estivesse pronto

• Viabiliza criação de sistemas mais estáveis

04/05/2012 19

Page 20: Testes Unitários com JUnit

Dúvidas?

04/05/2012 20

Page 21: Testes Unitários com JUnit

Tópicos

Testes de Programas

JUnit – Introdução

JUnit – Prática

04/05/2012 21

Page 22: Testes Unitários com JUnit

JUnit no EclipseExemplo 1: Calculadora

04/05/2012 22

Classe a ser testada

Page 23: Testes Unitários com JUnit

JUnit no EclipseCriando um Caso de Teste

• Botão direito na classe a ser testada (Calculadora)• New• JUnit Test Case

04/05/2012 23

Page 24: Testes Unitários com JUnit

JUnit no EclipseCriando um Caso de Teste

• Nome do caso de teste• Classe a ser testada• Next

04/05/2012 24

Page 25: Testes Unitários com JUnit

JUnit no EclipseCriando um Caso de Teste

• Selecionar métodos a serem testados

• Finish

04/05/2012 25

Page 26: Testes Unitários com JUnit

JUnit no EclipseCriando um Caso de Teste

• Perform the following action...• Ok

04/05/2012 26

Page 27: Testes Unitários com JUnit

JUnit no EclipseCriando um Caso de Teste

• Esqueleto do caso de teste• testSomar():

• Testes para o método somar()

04/05/2012 27

Page 28: Testes Unitários com JUnit

Exemplo 1: CalculadoraImplementando o Caso de Teste criado

04/05/2012 28

Classe a ser testada

Caso de teste

Page 29: Testes Unitários com JUnit

JUnit no EclipseExecução de um Caso de Teste

• Por plugin• Interface pronta• Recursos:

• Visualização de falhas e erros (exceções)• Debug• Histórico de testes

• Por código• Desenvolvedor cria a interface

• Método conhecido como TestRunner

04/05/2012 29

Page 30: Testes Unitários com JUnit

Exemplo 1: CalculadoraExecutando o Caso de Teste - Plugin

• Botão direito no caso de teste• Run As• JUnit Test

04/05/2012 30

Page 31: Testes Unitários com JUnit

Exemplo 1: CalculadoraResultado dos testes - Plugin

• Falha: quando uma “afirmação” (assertion) falha• Erro: quando ocorre uma exceção

• Ex.: NullPointerException, ArrayIndexOutOfBoundsException ...

04/05/2012 31

Res

ulta

do s

em fa

lhas

Exe

mpl

o de

res

ulta

do c

om fa

lhas

Page 32: Testes Unitários com JUnit

Exemplo 1: CalculadoraExecutando o Caso de Teste - Código

04/05/2012 32

Page 33: Testes Unitários com JUnit

JUnitAssertions

04/05/2012 33

Sintaxe do Método Descrição Teste passa se

assertEquals ([String mensErro,]esperado, atual)

Compara dois valores

esperado.equals(teste)

assertFalse ([String mensErro,]boolean condicao) Avalia uma

expressão 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 manipulação de exceções)

Page 34: Testes Unitários com JUnit

JUnitDiferença entre versões

• Até o JUnit 3.x

• Classes de teste herdam classe TestCase• Declaração do construtor da classe

• Métodos de teste iniciavam com a palavra test• testMetodo(), testGravacao(), testSoma() etc

• Método setUp()

• Método tearDown()

04/05/2012 34

Page 35: Testes Unitários com JUnit

JUnitDiferença entre versões

• A partir do JUnit 4

• Herança de TestCase substituída por import estático• import static org.junit.Assert.*• Não precisa declarar o construtor da classe

• Métodos de teste identificados com a anotação @Test

• Métodos setUp() e tearDown() substituídos pelas anotações @Before e @After respectivamente

04/05/2012 35

Page 36: Testes Unitários com JUnit

JUnitAnotações do JUnit 4• @Test

• Identifica que o método é um método de teste.

• @Before• Executa o método antes de cada teste. Este método pode ser

usado para preparar o ambiente de teste (Ex: ler dados do usuário). Substituto do setUp().

• @After• Executa o método após cada teste. Substituto do tearDown().

• @BeforeClass• Executa o método antes do início de todos os testes

• Ex: conectar base de dados

04/05/2012 36

Page 37: Testes Unitários com JUnit

JUnitAnotações do JUnit 4

• @AfterClass• Executa o método após todos os testes finalizarem (Ex:

desconectar base de dados).

• @Ignore [(“Comentário”) ]• O método é ignorado.

• @Test (expected=IllegalArgumentException.class)• Testa se o método levanta a exceção especificada.

• @Test (timeout=100)• Falha se o teste demorar mais que 100 milissegundos

04/05/2012 37

Page 38: Testes Unitários com JUnit

JUnitSequência de Desenvolvimento

04/05/2012 38

@BeforeClass

@Before

@Test

@After

@AterClass

Test

es c

onse

cutiv

os

Antes de todos os testes

Antes de cada testesetUp()

Teste

Após cada testetearDown()

Após todos os testes

Page 39: Testes Unitários com JUnit

Exemplo 2Sequência dos métodos

04/05/2012 39

Page 40: Testes Unitários com JUnit

Exemplo 2Ignorando um teste

04/05/2012 40

IgnoradoIgnorado

IgnoradoIgnorado

Page 41: Testes Unitários com JUnit

Exemplo 3: JanelaClasse Janela

04/05/2012 41

Page 42: Testes Unitários com JUnit

Exemplo 3: JanelaCaso de Teste: JanelaTest

• A classe Janela está correta?

04/05/2012 42

Page 43: Testes Unitários com JUnit

Exemplo 3: JanelaCaso de Teste: JanelaTest

• A classe Janela está correta?

04/05/2012 43

Mudar posiçãoMudar

posição

Page 44: Testes Unitários com JUnit

Exemplo 4: Esperando exceçõesCaso de Teste

04/05/2012 44

Page 45: Testes Unitários com JUnit

Exemplo 4: Esperando exceçõesResultado

• divisaoComExcecao(): erro• Exceção ocorrida (divisão por zero)

• divisaoEsperandoExcecao1(): passou• Ocorreu exceção esperada

• divisaoEsperandoExcecao2(): falhou• Não ocorreu exceção esperada

• divisaoSemExcecao(): passou

04/05/2012 45

Page 46: Testes Unitários com JUnit

DicasOrganização

• Organize os casos de teste em uma pasta separada dos códigos fonte do sistema• Organize os casos de teste dentro dos mesmos pacotes que os

códigos fonte

04/05/2012 46

Page 47: Testes Unitários com JUnit

DicasDesenvolvimento Dirigido a Testes

• Testes devem ser• escritos assim que possível• adaptados de acordo com mudanças

• Testes antigos:• Deixar em execução

• Surgimento de novas ideias:1.Criar testes2.Verificar se funcionam3.Se necessário, altere o código do programa

04/05/2012 47

Page 48: Testes Unitários com JUnit

DicasGranularidade dos Testes

• Cada teste deve verificar uma porção específica de uma funcionalidade do sistema

• Não combine testes não relacionados em um único método de teste

04/05/2012 48

Page 49: Testes Unitários com JUnit

DicasQuais 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.: não teste 10 condições se apenas 3 são suficientes

04/05/2012 49

Page 50: Testes Unitários com JUnit

DicasQuais e quantos testes escrever

• Não teste métodos triviais• gets e sets• Métodos set: Somente crie testes se houver validação de dados

• Achou um bug?• Não conserte sem antes escrever um teste que o detecte

• Caso contrário, ele pode voltar

04/05/2012 50

Page 51: Testes Unitários com JUnit

ExercícioCriatividade na criação de testes

Imagine e crie testes para esta classe de movimentação financeira

04/05/2012 51

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

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

Exercício

Page 52: Testes Unitários com JUnit

Exemplo 5: MemoriaClasse MemoriaS1/3

04/05/2012 52

Page 53: Testes Unitários com JUnit

Exemplo 5: MemoriaClasse MemoriaS2/3

04/05/2012 53

Page 54: Testes Unitários com JUnit

Exemplo 5: MemoriaClasse MemoriaS3/3

04/05/2012 54

Page 55: Testes Unitários com JUnit

Exemplo 5: MemoriaClasse CD 1/2

04/05/2012 55

Page 56: Testes Unitários com JUnit

Exemplo 5: MemoriaClasse CD 2/2

04/05/2012 56

Page 57: Testes Unitários com JUnit

Exemplo 5: MemoriaClasse HD

04/05/2012 57

Page 58: Testes Unitários com JUnit

Exemplo 5: MemoriaCaso de Teste MemoriaTeste

04/05/2012 58

Page 59: Testes Unitários com JUnit

JUnitSuítes de Testes

• Crescimento do número de testes de unidade:• Necessário uma suíte de testes

• Gerenciamento de uma coleção de testes

• Conjunto de testes• Executa uma coleção de Casos de Teste

04/05/2012 59

Page 60: Testes Unitários com JUnit

Suíte de TestesExemplo 6: Classe Utils

04/05/2012 60

Page 61: Testes Unitários com JUnit

Suíte de TestesExemplo 6: Caso de Teste TesteUtils

04/05/2012 61

Page 62: Testes Unitários com JUnit

Suíte de TestesExemplo 6: Resultados de TesteUtils

04/05/2012 62

Page 63: Testes Unitários com JUnit

Suíte de TestesExemplo 6: Classe Vetores

04/05/2012 63

Page 64: Testes Unitários com JUnit

Suíte de TestesExemplo 6: Caso de Teste TesteVetores

04/05/2012 64

Page 65: Testes Unitários com JUnit

Suíte de TestesExemplo 6: Resultado de TesteVetores

04/05/2012 65

Page 66: Testes Unitários com JUnit

Suíte de TestesCriando a Suíte

• Botão no pacote dos testes

04/05/2012 66

Page 67: Testes Unitários com JUnit

Suíte de TestesCriando a Suíte

• JUnit Test Suite• Next

04/05/2012 67

Page 68: Testes Unitários com JUnit

Suíte de TestesCriando a Suíte

• Definir nome da suíte• Selecionar casos de

teste• Finish

04/05/2012 68

Page 69: Testes Unitários com JUnit

Suíte de TestesExemplo 6: Criando a Suíte

• Suíte de Testes criada, padrão JUnit 3• Execute-a como um caso de teste

04/05/2012 69

Page 70: Testes Unitários com JUnit

Suíte de TestesSuíte em JUnit 4

• Suíte de Testes modificada para padrão JUnit 4• Execute-a como um caso de teste

04/05/2012 70

Page 71: Testes Unitários com JUnit

Suíte de TestesResultado dos testes da suíte

04/05/2012 71

Page 72: Testes Unitários com JUnit

Dúvidas?

04/05/2012 72

Page 73: Testes Unitários com JUnit

Exercícios

• Treinamento:

• Implementar cada exemplo da aula

• Criatividade:

• Implementar 1 classe e alguns casos de teste para:• Registro de ligações• Fila de impressão• Bilheteria de cinema• Estacionamento com ticket

04/05/2012 73