Testes de unidade em Java: JUnit

Preview:

Citation preview

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

FT-UNICAMP

2017

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

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

Utilizando a IDE (NetBeans)

2017 Prof. Ivan Ricarte 4

Diagrama UML

Código Java

Novo projeto (Código Java)

2017 Prof. Ivan Ricarte 5

2017 Prof. Ivan Ricarte 6

2017 Prof. Ivan Ricarte 7

2017 Prof. Ivan Ricarte 8

Novo projeto (Diagrama UML)

2017 Prof. Ivan Ricarte 9

2017 Prof. Ivan Ricarte 10

2017 Prof. Ivan Ricarte 11

2017 Prof. Ivan Ricarte 12

2017 Prof. Ivan Ricarte 13

Diagrama UML

2017 Prof. Ivan Ricarte 14

EasyUML/NetBeans

Geração de código

2017 Prof. Ivan Ricarte 15

2017 Prof. Ivan Ricarte 16

2017 Prof. Ivan Ricarte 17

2017 Prof. Ivan Ricarte 18

2017 Prof. Ivan Ricarte 19

2017 Prof. Ivan Ricarte 20

Código gerado a partir do diagrama UML

2017 Prof. Ivan Ricarte 21

2017 Prof. Ivan Ricarte 22

Obs.: sem atributo referencial para Movie

2017 Prof. Ivan Ricarte 23

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

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

2017 Prof. Ivan Ricarte 25

2017 Prof. Ivan Ricarte 26

2017 Prof. Ivan Ricarte 27

2017 Prof. Ivan Ricarte 28

2017 Prof. Ivan Ricarte 29

2017 Prof. Ivan Ricarte 30

2017 Prof. Ivan Ricarte 31

2017 Prof. Ivan Ricarte 32

2017 Prof. Ivan Ricarte 33

2017 Prof. Ivan Ricarte 34

2017 Prof. Ivan Ricarte 35

2017 Prof. Ivan Ricarte 36

2017 Prof. Ivan Ricarte 37

2017 Prof. Ivan Ricarte 38

2017 Prof. Ivan Ricarte 39

Para inserir os campos de tipo de filme:

2017 Prof. Ivan Ricarte 40

2017 Prof. Ivan Ricarte 41

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)

2017 Prof. Ivan Ricarte 43

2017 Prof. Ivan Ricarte 44

2017 Prof. Ivan Ricarte 45

2017 Prof. Ivan Ricarte 46

2017 Prof. Ivan Ricarte 47

2017 Prof. Ivan Ricarte 48

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

Exemplo: um método main para Movie

2017 Prof. Ivan Ricarte 50

Execução

2017 Prof. Ivan Ricarte 51

2017 Prof. Ivan Ricarte 52

2017 Prof. Ivan Ricarte 53

Um main envolvendo Movie e Rental

2017 Prof. Ivan Ricarte 54

2017 Prof. Ivan Ricarte 55

2017 Prof. Ivan Ricarte 56

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

Alternativa: teste automático

2017 Prof. Ivan Ricarte 58

Teste de unidade

2017 Prof. Ivan Ricarte 59

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

JUnit em NetBeans

2017 Prof. Ivan Ricarte 61

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

2017 Prof. Ivan Ricarte 62

2017 Prof. Ivan Ricarte 63

Opções de código gerado

2017 Prof. Ivan Ricarte 64

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

Código gerado

2017 Prof. Ivan Ricarte 65

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”

Execução do teste

2017 Prof. Ivan Ricarte 67

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

2017 Prof. Ivan Ricarte 68

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

2017 Prof. Ivan Ricarte 70

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

Corpo atualizado dos métodos de teste

2017 Prof. Ivan Ricarte 72

Resultado da execução dos testes

2017 Prof. Ivan Ricarte 73

2017 Prof. Ivan Ricarte 74

2017 Prof. Ivan Ricarte 75

Detalhar

2017 Prof. Ivan Ricarte 76

Uso do inicializador de testes

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

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

Criando e executando conjuntos de testes

2017 Prof. Ivan Ricarte 79

2017 Prof. Ivan Ricarte 80

2017 Prof. Ivan Ricarte 81

2017 Prof. Ivan Ricarte 82

2017 Prof. Ivan Ricarte 83

Para mais informação...

2017 Prof. Ivan Ricarte 84

2017 Prof. Ivan Ricarte 85

...

...

2017 Prof. Ivan Ricarte 86

Recommended