Você está na página 1de 14

Testes Unitários com JUnit

Prof. Evandro César Freiberger

Instituto Federal de Mato Grosso


Departamento da Área de Informática
evandro.freiberger@ifmt.edu.br

2022

Prof. Evandro César Freiberger (IFMT) Testes 2022 1 / 14


Sumário

1 Teste Unitário

Prof. Evandro César Freiberger (IFMT) Testes 2022 2 / 14


Teste Unitário / Unidade
É o nível de teste que tem como objetivo realizar testes nas menores unidades de código de
um software (módulo, método de classe, classe, componente).

A automação de testes unitários é fortemente incentivada, visto que, trata-se de testes em


porções de código consideradas primitivas dentro de um contexto de sistema, sendo mais
fáceis de serem testadas pelos próprios programadores que as produzem.

Outro fato que justifica a automação de testes unitário, é que esses testes devem ser
repetidos todas as vezes que um software for alterado, ou quando uma nova versão for
distribuída, garantindo a integridade do código, pela facilidade de repetir sua execução.

Prof. Evandro César Freiberger (IFMT) Testes 2022 3 / 14


Isolamento da Unidade de Teste
Quando estamos trabalhando com testes de Unidade ou testes Unitário, uma das maiores
preocupações e as vezes um dos maiores esforços se concentra no isolamento da unidade a
ser testada.

O objetivo é ter certeza que o teste diz respeito apenas à unidade em teste no momento, e
não tenha interferência com funcionalidades que pertençam a outras unidades.

Se o teste está sendo produzido para uma unidade (método ou classe), que essa unidade
não sofra interferência de outros recursos externos usados na sua execução, visto que, se o
teste falhar não será possível saber facilmente se a falha é da unidade em questão ou se é de
algum recurso externo.

Outra questão é que se algo mudar no sistema e provocar uma quebra em testes previamente
estabelecidos, o ideal é que a quebra se dê apenas na unidade que foi feita a alteração, não
provocando efeitos colaterais.

O nível de testes que envolvem a integração/dependêcia entre unidade de um software é o


Teste de Integração.
Prof. Evandro César Freiberger (IFMT) Testes 2022 4 / 14
Testes Unitários
Crie um Projeto Maven (maven-archetype-quickstar), com os seguintes
dados:
groupId = br.ifmt.cba

artifactId = junit02

version = 1.0-SNAPSHOT

pasta do projeto: JUnit02

Prof. Evandro César Freiberger (IFMT) Testes 2022 5 / 14


Testes Unitários
Classe de negócio Circulo
1 package b r . i f m t . cba . negocio ;
2
3 public class Circulo {
4
5 p r i v a t e double r a i o ;
6
7 p u b l i c C i r c u l o ( double r a i o ) {
8 this . raio = raio ;
9 }
10
11 p u b l i c double getRaio ( ) {
12 return raio ;
13 }
14
15 p u b l i c v o i d s e t R a i o ( double r a i o ) {
16 this . raio = raio ;
17 }
18
19 p u b l i c double getArea ( ) throws RuntimeException {
20 i f ( t h i s . r a i o > 0) {
21 / / r e t u r n Math . PI * Math . pow ( t h i s . r a i o , 3 ) ; / / provoca e r r o
22 r e t u r n Math . PI * Math . pow ( t h i s . r a i o , 2 ) ;
23 } else {
24 throw new RuntimeException ( " Raio com v a l o r i n c o n s i s t e n t e " ) ;
25 }
26 }
27 }

Prof. Evandro César Freiberger (IFMT) Testes 2022 6 / 14


Testes Unitários
Classe de execução AppCirculo
1 package b r . i f m t . cba . execucao ;
2
3 i m p o r t j a v a x . swing . JOptionPane ;
4
5 i m p o r t b r . i f m t . cba . negocio . C i r c u l o ;
6
7 p u b l i c class AppCirculo {
8 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
9 double r a i o ;
10 try {
11 r a i o = Double . parseDouble ( JOptionPane . sh ow I np ut Di al og ( " E n t r e com o r a i o do c i r c u l o : " ) ) ;
12 C i r c u l o c i r c u l o = new C i r c u l o ( r a i o ) ;
13 JOptionPane . showMessageDialog ( n u l l , " Area do c i r c u l o = " + c i r c u l o . getArea ( ) ) ;
14 } c a t c h ( RuntimeException ex ) {
15 JOptionPane . showMessageDialog ( n u l l , ex . getMessage ( ) ) ;
16 }
17 }
18 }

Prof. Evandro César Freiberger (IFMT) Testes 2022 7 / 14


Testes Unitários
A classe de negócio Circulo pode ser considerada uma Unidade a ser testada.

O que testar da classe Circulo?

Poderíamos testar todos os métodos.

Contudo, métodos construtores e Getters/Setters normalmente são gerados automaticamente


pelas IDE e seu teste acaba não trazendo grandes benefícios.

Considerando essa estratégia, o método getArea() é um bom candidado a automação de


teste, já que é um método cuja lógica é escrita totalmente pelo programador, e que envolve
um cálculo baseado em valores e fórmula.

Prof. Evandro César Freiberger (IFMT) Testes 2022 8 / 14


Testes Unitários
Classe de teste CirculoTest
1 package b r . i f m t . cba . negocio ;
2
3 i m p o r t s t a t i c org . j u n i t . A s s e r t . a s s e r t E q u a l s ;
4
5 i m p o r t org . j u n i t . Test ;
6
7 public class CirculoTest {
8
9 @Test
10 p u b l i c v o i d quandoTodosDadosCorretos ( ) {
11 C i r c u l o c i r c u l o = new C i r c u l o ( 2 ) ;
12 a s s e r t E q u a l s ( 1 2 . 5 6 , c i r c u l o . getArea ( ) , 0 . 0 1 ) ;
13 }
14
15 @Test ( expected = RuntimeException . c l a s s )
16 p u b l i c v o i d quandoRaioMenorOuIgualZero ( ) {
17 C i r c u l o c i r c u l o = new C i r c u l o ( −1) ;
18 c i r c u l o . getArea ( ) ;
19 }
20 }

O primeiro cenário testa o método getArea() quando os dados estão corretos e um valor de
área válido será retornado.

O segundo cenário testa o método getArea() com dado inconsistente, cujo retorno é uma
exceção.
Prof. Evandro César Freiberger (IFMT) Testes 2022 9 / 14
Testes Unitários (1)
Classe de negócio Cilindro
1 package b r . i f m t . cba . negocio ;
2
3 public class C i li n d r o {
4
5 private Circulo circulo ;
6 p r i v a t e double a l t u r a ;
7
8 p u b l i c C i l i n d r o ( C i r c u l o c i r c u l o , double a l t u r a ) {
9 this . circulo = circulo ;
10 this . altura = altura ;
11 }
12
13 public Circulo getCirculo ( ) {
14 return circulo ;
15 }
16
17 public void setCirculo ( Circulo c i r c u l o ) {
18 this . circulo = circulo ;
19 }
20
21 p u b l i c double g e t A l t u r a ( ) {
22 return altura ;
23 }
24 p u b l i c v o i d s e t A l t u r a ( double a l t u r a ) {
25 this . altura = altura ;
26 }
27
28 p u b l i c double getArea ( ) throws RuntimeException {
29

Prof. Evandro César Freiberger (IFMT) Testes 2022 10 / 14


Testes Unitários (2)
30 i f ( t h i s . c i r c u l o ! = n u l l && t h i s . a l t u r a > 0 ) {
31 r e t u r n 2 * c i r c u l o . getArea ( ) + 2 * Math . PI * t h i s . c i r c u l o . getRaio ( ) * t h i s . a l t u r a ;
32 } else {
33 throw new RuntimeException ( " Raio ou a l t u r a i n c o n s i s t e n t e s " ) ;
34 }
35 }
36
37
38
39
40 }

Prof. Evandro César Freiberger (IFMT) Testes 2022 11 / 14


Testes Unitários
Classe de execução AppCilindro
1 package b r . i f m t . cba . execucao ;
2
3 i m p o r t j a v a x . swing . JOptionPane ;
4 i m p o r t b r . i f m t . cba . negocio . C i l i n d r o ;
5 i m p o r t b r . i f m t . cba . negocio . C i r c u l o ;
6
7 public class AppCilindro {
8 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] args ) {
9 double r a i o ;
10 double a l t u r a ;
11 try {
12 r a i o = Double . parseDouble ( JOptionPane . sh ow I np ut Di al og ( " E n t r e com o r a i o do c i l i n d r o : " ) ) ;
13 a l t u r a = Double . parseDouble ( JOptionPane . sh o wI np ut Di al og ( " E n t r e com a a l t u r a do c i l i n d r o : " ) ) ;
14 C i l i n d r o c i l i n d r o = new C i l i n d r o ( new C i r c u l o ( r a i o ) , a l t u r a ) ;
15 JOptionPane . showMessageDialog ( n u l l , " Area do c i l i n d r o = " + c i l i n d r o . getArea ( ) ) ;
16 } c a t c h ( RuntimeException ex ) {
17 JOptionPane . showMessageDialog ( n u l l , ex . getMessage ( ) ) ;
18 }
19 }
20 }

Prof. Evandro César Freiberger (IFMT) Testes 2022 12 / 14


Testes Unitários
A classe de negócio Cilindro pode ser considerada uma Unidade a ser testada.

Considerando o mesmo raciocínio da classe Circulo, podemos decidir testar cenários que
envolvam o método getArea().
O primeiro cenário testa o método getArea() quando os dados estão corretos e um valor de
área válido será retornado.

O segundo cenário testa o método getArea() com dado inconsistente, cujo retorno é uma
exceção.

Prof. Evandro César Freiberger (IFMT) Testes 2022 13 / 14


Testes Unitários
Classe de teste CilindroTest
1 package b r . i f m t . cba . negocio ;
2
3 i m p o r t s t a t i c org . j u n i t . A s s e r t . a s s e r t E q u a l s ;
4
5 i m p o r t org . j u n i t . Test ;
6
7 public class CilindroTest {
8
9 @Test
10 p u b l i c v o i d quandoTodosDadosCorretos ( ) {
11 C i l i n d r o c i l i n d r o = new C i l i n d r o ( new C i r c u l o ( 2 ) , 4 ) ;
12 a s s e r t E q u a l s ( 7 5 . 3 9 , c i l i n d r o . getArea ( ) , 0 . 0 1 ) ;
13 }
14
15 @Test ( expected = RuntimeException . c l a s s )
16 p u b l i c v o i d quandoAlturaMenorOuIgualZero ( ) {
17 C i l i n d r o c i l i n d r o = new C i l i n d r o ( new C i r c u l o ( 2 ) , 0 ) ;
18 c i l i n d r o . getArea ( ) ;
19 }
20
21 @Test ( expected = RuntimeException . c l a s s )
22 p u b l i c v o i d quandoRaioMenorOuIgualZero ( ) {
23 C i l i n d r o c i l i n d r o = new C i l i n d r o ( new C i r c u l o ( −1) , 4 ) ;
24 c i l i n d r o . getArea ( ) ;
25 }
26
27 @Test ( expected = RuntimeException . c l a s s )
28 public void quandoCirculoNull ( ) {
29 C i l i n d r o c i l i n d r o = new C i l i n d r o ( n u l l , 4 ) ;
30 c i l i n d r o . getArea ( ) ;
31 }
32 }
Prof. Evandro César Freiberger (IFMT) Testes 2022 14 / 14

Você também pode gostar