Testes unitários com jUnit
       Prof. Leonardo Soares
Recapitulando


Já sabemos qual a importância de aplicar testes
unitários em nosso software
Também sabemos como identificar os testes
necessários
Até o momento realizamos nossos testes de uma
maneira manual
Qual o problema com os testes
          manuais?


Muito código para ser escrito
Mais código ainda para se verificar o retorno dos
métodos de forma automática
Temos de testar um método por vez
Precisamos automatizar isto!
Automação de testes


Testes automatizados envolvem o uso de um
software para controlar a execução dos testes
Há basicamente dois tipos de automatizadores:
  Para avaliar códigos
  Para testes através de interface gráfica
Automação de testes unitários


Utilizaremos um framework para executar nossos testes
Este framework fará a execução de múltiplos testes
Seu objetivo é realizar comparações entre os valores
retornados e os esperados de forma automática
Além de oferecer recursos para comparar mais facilmente os
resultados dos métodos aos esperados
Framework jUnit


Escrito originalmente por Kent Beck e Erich Gamma
Utilizado em Java, mas há versões Unit para
diferentes linguagens de programação
É uma ferramenta de testes de regressao
Integra-se a diferentes IDEs
Como utilizá-lo em nosso projeto


  Podemos baixar a biblioteca do junit e adicionar
  manualmente
    http://www.junit.org
  Ou adicionar ao nosso projeto no NetBeans ou Eclipse
Testes manuais x automatizados


 Calcular imposto com base no salário – calcular( Float
 salario )
   Imposto 27,5% a partir de 3.743
   Imposto 22,5% a partir de 2.995 até 3.743
   O método deve retornar o valor do imposto a ser pago
Teste manual

public static void calcular( Double salario ){
            if( salario > 3743 ){
                         return salario*0.275;
            }else if( salario > 2995 && salario < 3743){
                         return salario*0.225;
            }

            return -1;
}

public static void main( String args[] ){

            double resultado = calcular( 3800.0);
            if( resultado == 1045){
                        System.out.println("Passou no teste");
            }else{
                        System.out.println("Teste falhou");
            }
}
Teste automatizado


import org.junit.Assert;
import org.junit.Test;

public class FiscalRendaTest {

        @Test
        public void testCalculo(){
                 double resultado = FiscalRenda.calcular(3800.0);
                 Assert.assertEquals(1045, resultado, 0.1);
        }
}
Conceitos importantes relacionados
             a teste


  Erro
    Quando o método produziu um resultado inesperado
  Falha
    Quando há algum problema relacionado ao código
  Sucesso
    Quando o método produziu o resultado esperado
Annotations jUnit


É um metadado representado pela @
O jUnit utiliza estas annotations para guiar o uso dos
testes
Evita a necessidade de herdar de algumas
classes, convenções de nomes, criação de métodos
especiais, dentre outros
Annotations do jUnit

@Test – usada para indicar que o método é usado para criar testes
@Before – código a ser executado, toda vez, antes da execução de
cada métodos de teste
 Usado para preparar o ambiente. Inicializar classes, ler dados, dentre outros
@After – código a ser executado, toda vez, após a execução de cada
métodos de teste
@BeforeClass – similar ao @Before porém executado apenas uma vez
antes de todos os testes
Usado para preparar atividades que demandem tempo. Inicializar o banco de
@AfterClass – similar ao @Aftermétodo precisam serapenas uma vez
          dados, por exemplo. Os porém executado estáticos
após todos os testes
@Test( expected = Exception.class ) – verifica se a exceção foi lançada
@Test(timeout = 100) – falha se o método durar mais que 100
milisegundos
Uso do jUnit


1. Criaremos uma classe para nossos testes referentes
   a determinada classe
2. Daremos imports nas classes e métodos necessários
3. Criaremos métodos para testar nossos métodos
4. Faremos a comparação entre o retorno de nosso
   método com o resultado esperado
Criem os testes unitários abaixo


Método para realizar soma
  Recebe como entrada dois números
  Retorna o resultado da soma
Método para ralizar divisão
  Lançar exceção quando receber 0 no denominador
Testar um método para realizar depósito em uma conta
bancária
  O método deve receber um flutuante com o valor a ser
  depósitado
  O método deve retornar o valor contido na conta
Criem os testes unitários abaixo

Testar o método para fazer o saque em uma conta
  O método aceita dois valores: valor_saque, valor_saldo
  O método deve retornar um valor referente ao saldo da conta após
  o saque ou -1 em situação de erro
Testar o método para liberar a prova do detran ou não
  O método aceita um valor do tipo Integer com a idade do aluno
  A liberação da prova será mediante ao atendimento dos critérios
  ou não
  O método deve retornar um boolean true caso a prova seja
  liberada ou false em caso contrário

Introdução a testes unitários com jUnit

  • 1.
    Testes unitários comjUnit Prof. Leonardo Soares
  • 2.
    Recapitulando Já sabemos quala importância de aplicar testes unitários em nosso software Também sabemos como identificar os testes necessários Até o momento realizamos nossos testes de uma maneira manual
  • 3.
    Qual o problemacom os testes manuais? Muito código para ser escrito Mais código ainda para se verificar o retorno dos métodos de forma automática Temos de testar um método por vez Precisamos automatizar isto!
  • 4.
    Automação de testes Testesautomatizados envolvem o uso de um software para controlar a execução dos testes Há basicamente dois tipos de automatizadores: Para avaliar códigos Para testes através de interface gráfica
  • 5.
    Automação de testesunitários Utilizaremos um framework para executar nossos testes Este framework fará a execução de múltiplos testes Seu objetivo é realizar comparações entre os valores retornados e os esperados de forma automática Além de oferecer recursos para comparar mais facilmente os resultados dos métodos aos esperados
  • 6.
    Framework jUnit Escrito originalmentepor Kent Beck e Erich Gamma Utilizado em Java, mas há versões Unit para diferentes linguagens de programação É uma ferramenta de testes de regressao Integra-se a diferentes IDEs
  • 7.
    Como utilizá-lo emnosso projeto Podemos baixar a biblioteca do junit e adicionar manualmente http://www.junit.org Ou adicionar ao nosso projeto no NetBeans ou Eclipse
  • 8.
    Testes manuais xautomatizados Calcular imposto com base no salário – calcular( Float salario ) Imposto 27,5% a partir de 3.743 Imposto 22,5% a partir de 2.995 até 3.743 O método deve retornar o valor do imposto a ser pago
  • 9.
    Teste manual public staticvoid calcular( Double salario ){ if( salario > 3743 ){ return salario*0.275; }else if( salario > 2995 && salario < 3743){ return salario*0.225; } return -1; } public static void main( String args[] ){ double resultado = calcular( 3800.0); if( resultado == 1045){ System.out.println("Passou no teste"); }else{ System.out.println("Teste falhou"); } }
  • 10.
    Teste automatizado import org.junit.Assert; importorg.junit.Test; public class FiscalRendaTest { @Test public void testCalculo(){ double resultado = FiscalRenda.calcular(3800.0); Assert.assertEquals(1045, resultado, 0.1); } }
  • 11.
    Conceitos importantes relacionados a teste Erro Quando o método produziu um resultado inesperado Falha Quando há algum problema relacionado ao código Sucesso Quando o método produziu o resultado esperado
  • 12.
    Annotations jUnit É ummetadado representado pela @ O jUnit utiliza estas annotations para guiar o uso dos testes Evita a necessidade de herdar de algumas classes, convenções de nomes, criação de métodos especiais, dentre outros
  • 13.
    Annotations do jUnit @Test– usada para indicar que o método é usado para criar testes @Before – código a ser executado, toda vez, antes da execução de cada métodos de teste Usado para preparar o ambiente. Inicializar classes, ler dados, dentre outros @After – código a ser executado, toda vez, após a execução de cada métodos de teste @BeforeClass – similar ao @Before porém executado apenas uma vez antes de todos os testes Usado para preparar atividades que demandem tempo. Inicializar o banco de @AfterClass – similar ao @Aftermétodo precisam serapenas uma vez dados, por exemplo. Os porém executado estáticos após todos os testes @Test( expected = Exception.class ) – verifica se a exceção foi lançada @Test(timeout = 100) – falha se o método durar mais que 100 milisegundos
  • 14.
    Uso do jUnit 1.Criaremos uma classe para nossos testes referentes a determinada classe 2. Daremos imports nas classes e métodos necessários 3. Criaremos métodos para testar nossos métodos 4. Faremos a comparação entre o retorno de nosso método com o resultado esperado
  • 15.
    Criem os testesunitários abaixo Método para realizar soma Recebe como entrada dois números Retorna o resultado da soma Método para ralizar divisão Lançar exceção quando receber 0 no denominador Testar um método para realizar depósito em uma conta bancária O método deve receber um flutuante com o valor a ser depósitado O método deve retornar o valor contido na conta
  • 16.
    Criem os testesunitários abaixo Testar o método para fazer o saque em uma conta O método aceita dois valores: valor_saque, valor_saldo O método deve retornar um valor referente ao saldo da conta após o saque ou -1 em situação de erro Testar o método para liberar a prova do detran ou não O método aceita um valor do tipo Integer com a idade do aluno A liberação da prova será mediante ao atendimento dos critérios ou não O método deve retornar um boolean true caso a prova seja liberada ou false em caso contrário

Notas do Editor

  • #7 O teste de regressão é aplicável a uma nova versão de software ou à necessidade de se executar um novo ciclo de teste.
Consiste em se aplicar, a cada nova versão do software ou a cada ciclo, todos os testes que já foram aplicados nas versões ou ciclos de teste anteriores do sistema. Visa identificar se algum erro já identificado anteriormente retorna à nova versão, medindo assim a qualidade do software produzido.
  • #8 Criar um novo projeto e adicionar abibliotecatanto no netbeanscomo no eclipse
  • #10 Modifiquemparatestar com valor nasegundaopção, naterceiraopção e depoismantenhamtodosos testes
  • #16 Testes primeiroponto: quaisquernúmeros, verifiquem se o métodoretorna o valor correto. Incluamvalorescorretos e vejam se osretornossãooscorretosTestes segundoponto: númeropositivomaiorque zero, zero, negativo
  • #17 Testes para a primeiracondição? 20, 100 [sucesso] / 20, 10 [ falha ] (primeiro valor maiorque o segundo) / 0, 0 [falha] (O métododeveaceitar o saquecaso o saldosejamaiorouigual)Testes para a segundacondição? 18 oumaiorque 18 / menorque 18 / número 0 ounegativo