86
Java & JUnit Prof. Dr. Ivan L. M. Ricarte FT-UNICAMP 2017

Testes de unidade em Java: JUnit

Embed Size (px)

Citation preview

Page 1: Testes de unidade em Java: JUnit

Java & JUnitProf. Dr. Ivan L. M. Ricarte

FT-UNICAMP

2017

Page 2: Testes de unidade em Java: JUnit

Objetivos

• Revisão da programação orientada a objetos com Java

• Apresentação do framework de teste de unidade JUnit

2017 Prof. Ivan Ricarte 2

Page 3: Testes de unidade em Java: JUnit

Estudo de caso

• Aplicação da vídeo-locadora (sim, coisa do passado...)

• Cliente (Customer) tem, além do nome (name), o registro de alugueis de filmes

• Para cada aluguel de filme, há a indicação do filme que foi alugado e o registro da quantidade de dias alugados (daysRented)

• Cada filme tem, além do título (title), uma categoria (priceCode) associada, que pode ser uma entre lançamento (NEW_RELEASE), comum (REGULAR) ou infantil (CHILDRENS)

• O método statement(), da classe Customer, gera o relatório (um objeto String) dos filmes alugados pelo cliente e o valor a ser pago

2017 Prof. Ivan Ricarte 3

Page 4: Testes de unidade em Java: JUnit

Utilizando a IDE (NetBeans)

2017 Prof. Ivan Ricarte 4

Diagrama UML

Código Java

Page 5: Testes de unidade em Java: JUnit

Novo projeto (Código Java)

2017 Prof. Ivan Ricarte 5

Page 6: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 6

Page 7: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 7

Page 8: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 8

Page 9: Testes de unidade em Java: JUnit

Novo projeto (Diagrama UML)

2017 Prof. Ivan Ricarte 9

Page 10: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 10

Page 11: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 11

Page 12: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 12

Page 13: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 13

Page 14: Testes de unidade em Java: JUnit

Diagrama UML

2017 Prof. Ivan Ricarte 14

EasyUML/NetBeans

Page 15: Testes de unidade em Java: JUnit

Geração de código

2017 Prof. Ivan Ricarte 15

Page 16: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 16

Page 17: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 17

Page 18: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 18

Page 19: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 19

Page 20: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 20

Page 21: Testes de unidade em Java: JUnit

Código gerado a partir do diagrama UML

2017 Prof. Ivan Ricarte 21

Page 22: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 22

Obs.: sem atributo referencial para Movie

Page 23: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 23

Obs.: sem atributo referencial para coleção de Rental, sem implementação do método

Page 24: Testes de unidade em Java: JUnit

Complementação do código

2017 Prof. Ivan Ricarte 24

Incluir operações para:

• Construir objeto com título e código;

• Obter título (não é alterado)

• Obter e alterar código

Page 25: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 25

Page 26: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 26

Page 27: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 27

Page 28: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 28

Page 29: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 29

Page 30: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 30

Page 31: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 31

Page 32: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 32

Page 33: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 33

Page 34: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 34

Page 35: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 35

Page 36: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 36

Page 37: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 37

Page 38: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 38

Page 39: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 39

Para inserir os campos de tipo de filme:

Page 40: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 40

Page 41: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 41

Page 42: Testes de unidade em Java: JUnit

Similarmente, para a classe Rental

2017 Prof. Ivan Ricarte 42

Incluir campo (atributo referencial) para um objeto da classe Movie

Incluir operações para:

• Construir objeto com filme e dias de aluguel;

• Obter filme (não alterado)

• Obter dias de aluguel (não alterado)

Page 43: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 43

Page 44: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 44

Page 45: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 45

Page 46: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 46

Page 47: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 47

Page 48: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 48

Page 49: Testes de unidade em Java: JUnit

Como testar se as classes estão corretas?

Abordagem 1 (não recomendada): usar o método main

• Pode ser definido para cada classe

• Pode ter um teste que envolva mais de uma classe

2017 Prof. Ivan Ricarte 49

Page 50: Testes de unidade em Java: JUnit

Exemplo: um método main para Movie

2017 Prof. Ivan Ricarte 50

Page 51: Testes de unidade em Java: JUnit

Execução

2017 Prof. Ivan Ricarte 51

Page 52: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 52

Page 53: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 53

Page 54: Testes de unidade em Java: JUnit

Um main envolvendo Movie e Rental

2017 Prof. Ivan Ricarte 54

Page 55: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 55

Page 56: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 56

Page 57: Testes de unidade em Java: JUnit

Limitações dessa abordagem

Execução manual de cada método main

Verificação do resultado precisa de intervenção humana

2017 Prof. Ivan Ricarte 57

Page 58: Testes de unidade em Java: JUnit

Alternativa: teste automático

2017 Prof. Ivan Ricarte 58

Page 59: Testes de unidade em Java: JUnit

Teste de unidade

2017 Prof. Ivan Ricarte 59

Page 60: Testes de unidade em Java: JUnit

Princípios do teste de unidade

Abordagem de teste caixa-preta• Como o método foi implementado não é relevante

Testa um método de cada vez

Cada método X( ) será verificado por um método de teste(tipicamente, testX( )) que:

Cria as condições para invocar o método Invoca o método Verifica se resultado ou efeito foi o esperado

2017 Prof. Ivan Ricarte 60

Page 61: Testes de unidade em Java: JUnit

JUnit em NetBeans

2017 Prof. Ivan Ricarte 61

Page 62: Testes de unidade em Java: JUnit

Passo 1: Criar o conjunto de métodos de teste para uma classe

2017 Prof. Ivan Ricarte 62

Page 63: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 63

Page 64: Testes de unidade em Java: JUnit

Opções de código gerado

2017 Prof. Ivan Ricarte 64

https://netbeans.org/kb/docs/java/junit-intro_pt_BR.html

Page 65: Testes de unidade em Java: JUnit

Código gerado

2017 Prof. Ivan Ricarte 65

Page 66: Testes de unidade em Java: JUnit

Implementação default

2017 Prof. Ivan Ricarte 66

Método que, quando executado, causa a falha do teste

Precisa ser substituído pelo “teste correto”

Page 67: Testes de unidade em Java: JUnit

Execução do teste

2017 Prof. Ivan Ricarte 67

Page 68: Testes de unidade em Java: JUnit

Resultado da execução com métodos fail()

2017 Prof. Ivan Ricarte 68

Page 69: Testes de unidade em Java: JUnit

Como verificar o resultado dos testes

O método fail() é um dos métodos de verificação de resultado de testes oferecido pelo framework Junit

• Sempre causa a falha do teste

• Usado, por exemplo, para indicar que código atingiu um ponto que não deveria ser alcançado em condições normais de execução

Além desse método, outros métodos de asserção são utilizados, tais como:

• assertEquals(): causa a falha do teste se os dois valores passados como argumentos não são iguais

• Dois valores: valor esperado, resultado da execução do teste

• assertTrue(): causa a falha do teste se a condição passada como argumento não for verdadeira

2017 Prof. Ivan Ricarte 69

Page 70: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 70

Page 71: Testes de unidade em Java: JUnit

Outros métodos de asserção

Sempre com opção de ter string de mensagem como primeiro argumento:

• assertFalse(condição)

• assertArrayEquals(arrayEsperado, arrayObtido)

• assertNotEquals(valorNãoEsperado, valorObtido)

• assertNull(referenciaObtida)

• assertNotNull(referenciaObtida)

• assertSame(objetoEsperado, objetoObtido)

• assertNotSame(objetoNãoEsperado, objetoObtido)

Para valores e arranjos, há assinaturas para os diferentes tipos primitivos.

2017 Prof. Ivan Ricarte 71

Page 72: Testes de unidade em Java: JUnit

Corpo atualizado dos métodos de teste

2017 Prof. Ivan Ricarte 72

Page 73: Testes de unidade em Java: JUnit

Resultado da execução dos testes

2017 Prof. Ivan Ricarte 73

Page 74: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 74

Page 75: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 75

Detalhar

Page 76: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 76

Uso do inicializador de testes

Page 77: Testes de unidade em Java: JUnit

Condições especiais de teste: timeout

2017 Prof. Ivan Ricarte 77

Tempo em milissegundos

https://netbeans.org/kb/docs/java/junit-intro_pt_BR.html

Page 78: Testes de unidade em Java: JUnit

Condições especiais de teste: exceções

2017 Prof. Ivan Ricarte 78

Classe da exceção que é esperada na execução do teste

https://netbeans.org/kb/docs/java/junit-intro_pt_BR.html

Page 79: Testes de unidade em Java: JUnit

Criando e executando conjuntos de testes

2017 Prof. Ivan Ricarte 79

Page 80: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 80

Page 81: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 81

Page 82: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 82

Page 83: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 83

Page 84: Testes de unidade em Java: JUnit

Para mais informação...

2017 Prof. Ivan Ricarte 84

Page 85: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 85

...

...

Page 86: Testes de unidade em Java: JUnit

2017 Prof. Ivan Ricarte 86