SlideShare uma empresa Scribd logo
1 de 33
Baixar para ler offline
Testes de Unidade com JUnit



 Introdução prática ao uso de JUnit para
       desenvolver testes unitários
JUnit
●   Junit: framework para desenvolvimento e
    execução de testes de unidade em
    programas Java
●   Define um modelo de programação para a
    criação de testes de unidade em classes
    Java
●   Disponibiliza o TestRunner: aplicação em
    modo texto ou gráfico para execução de
    testes
●   Podemos baixar o Junit em www.junit.org
     – O arquivo junit.jar deve estar no classpath
       do nosso projeto
Facilidades do JUnit
●   Permite criação de testes unitários para
    métodos pertencentes a uma classe
●   Permite a definição e execução de um
    conjunto de testes unitários – Suites de
    Teste
●   Permite a execução de teste com relato de
    problemas ocorridos e onde especificamente
    ocorreram os erros
JUnit Passo a Passo
●   1º Passo)
    –   Criar uma classe de teste para cada classe a
        ser testada
    –   Exemplo: classe Aritmetica terá como classe
        de teste AritmeticaTest
    –   A classe de Teste deve herdar da
        classe TestCase do framework JUnit
JUnit Passo a Passo
●   2º Passo)
    –   criar métodos de teste para cada método (ou
        funcionalidade) a ser testado (cujos nomes
        devem começar com a palavra “test”) com tipo
        de retorno void.
    –   Exemplo para a classe AritmeticaTest:
         public void testSoma()
         public void testSubtracao()
         public void testDivisao()
         public void testMultiplicacao()
JUnit Passo a Passo
●   3º Passo)
    –   para cada método de teste definir seu
        comportamento:
    –   invocação de métodos da classe do sistema a
        ser testada
    –   avaliação do resultado dos métodos sendo
        testados usando os métodos assertEquals(),
        fail(), assertNull(), assertNotNull() do framework
        JUnit
JUnit Passo a Passo

Método               Descrição            Teste passa se
assertEquals(a,b)    Compara dois         a.equals(b)
                     valores
assertFalse(a)                            a == false
                     Avalia uma
assertTrue(a)        expressão booleana   a == true
assertNotNull(a)                          a != null
                     Compara uma
assertNull(a)        variável com nulo    a == null
assertNotSame(a,b)                        a == b
                     Compara dois
assertSame(a,b)      objetos              a != b
fail()               Causa uma falha no
                     teste atual
JUnit Passo a Passo: Exemplo
public class Aritmetica {


    public int soma(int op1, int op2) {
        return op1 + op2;
    }

    public int subtracao(int op1,int op2) {
        return op1 -op2;
    }

    public int multiplicacao(int op1, int op2) {
        return op1 * op2;
    }

    public int divisao(int op1, int op2) throws Exception {
        if (op2 == 0 ) {
            throw new Exception(quot;Divisao por zeroquot;);
        } else {
            return op1/op2;
        }
    }

}
JUnit Passo a Passo: Exemplo
import junit.framework.*;

public class AritmeticaTest extends TestCase {

public void testSoma() {
        Aritmetica operacoes = new Aritmetica();
        this.assertEquals(4,operacoes.soma(3,1));

}

public void testSubtracao(){
        Aritmetica operacoes = new Aritmetica();
        this.assertEquals(2, operacoes.subtracao(3,1));
}

public void testDivisao() {
        Aritmetica operacoes = new Aritmetica();
        try {
             operacoes.divisao(3,0);
             fail(quot;Deveria lançar Excecaoquot;);
        } catch (Exception e) {

        }
}

public void testMultiplicacao(){
        Aritmetica operacoes = new Aritmetica();
        this.assertEquals(3,operacoes.multiplicacao(3,1));

}
}
JUnit Passo a Passo: Exemplo
●    Como Executar o teste?
      – Direto na linha de comando:
     java junit.textui.TestRunner ContaTeste
     –   Ou inserir os métodos abaixo na classe de teste
          public static Test suite(){
             return new TestSuite(AritmeticaTest.class);

          }

          public static void main(String[] args){
                 junit.textui.TestRunner.run(suite());
          }


    TestRunner chama suite() automaticamente e trata
    como testes (e executa) todos os métodos sem
    argumentos cujos nomes começarem com quot;testquot;
JUnit Passo a Passo: Exemplo
●   Teste com erro




●   Teste sem erro
Observações
●   Caso necessário, pode-se definir configurações iniciais
    para serem executadas antes de cada método de teste
    usando o método setUp()
     – configuração de objetos comuns aos casos de teste
     – configuração de recursos comuns aos casos de
       teste
     – (exemplo: abertura de conexões de banco de
       dados, socket, etc)
●   Para liberar recursos utilizados pelos métodos de teste
    pode-se usar o método tearDown()
     – Exemplos de recursos que podem ser liberados:
       streams, fechar conexões de banco de dados,
       apagar/mover arquivos de dados.
JUnit Passo a Passo
public class Aritmetica {

    private int op1,op2;

    public void setOp1(int op1) {
         this.op1 = op1;
    }

    public void setOp2(int op2) {
         this.op2 = op2;
    }
    public int soma() {
         return op1 + op2;
    }

    public int subtracao() {
         return op1 -op2;
    }

    public int multiplicacao() {
         return op1 * op2;
    }

    public int divisao() throws Exception {
         if (op2 == 0 ) {
              throw new Exception(quot;Divisao por zeroquot;);
         } else {
              return op1/op2;
         }
    }


}
JUnit Passo a Passo
import junit.framework.*;

public class AritmeticaTest extends TestCase {

    Aritmetica operacoes;
                                                           Executa antes de cada
    public void setUp() {
         operacoes = new Aritmetica();
                                                              método de teste
         operacoes.setOp1(3);
         operacoes.setOp2(1);
    }

    public void testSoma() {

         this.assertEquals(4,operacoes.soma());

    }

    public void testSubtracao(){
         this.assertEquals(2, operacoes.subtracao());
    }

    public void testDivisao() {
         try {
              this.assertEquals(3,operacoes.divisao());
         } catch (Exception e) {

         }
    }

    public void testMultiplicacao(){
         this.assertEquals(3,operacoes.multiplicacao());

    }
}
Execução JUnit
●
    Seqüência de execução do JUnit:
     – Cria uma instância da classe de teste para cada
       método de teste. (Exemplo: 4 testes, 4
       instâncias).
     – O test case é instanciado para executar um
       método testXXX() de cada vez.
         ● As alterações que ele fizer ao estado do

           objeto não afetarão os demais testes
●
    Para cada instância:
    –   Chama o método setUp();
    –   Chama o método de teste;
    –   Chama o método tearDown();
Suites de Testes
●   Quando falamos em teste automatizado, é comum
    querermos executar um conjunto de testes de uma
    única vez;
●   Suites de testes representam um conjunto de testes
    que serão executados seqüencialmente;
●   JUnit define a classe TestSuite que:
    –   Permite incluir todos os métodos de teste de
        uma classe em um suite de teste;
    –   Permite definir uma classe que inclui todos os
        suites de teste das classes do sistema.
TestSuite
●   P ermite executar uma coleção de testes
    –  Método addTest(TestS uite) adiciona um teste na
       lista
●   P adrão de codificação:
     – retornar um TestS uite em cada test-case:
             public static TestSuite suite() {
                 return new TestSuite(SuaClasseTest.class);
             }
    –    criar uma classe AllTests que combina as suites:
             public class AllTests {
                 public static Test suite() {
                 TestSuite testSuite = new TestSuite(quot;Roda tudoquot;);
             testSuite.addTest(pacote.AllTests.suite());
             testSuite.addTest(MinhaClasseTest.suite());
             testSuite.addTest(SuaClasseTest.suite());
             return testSuite;
         }
     }
Observações gerais
●   Cada teste deve verificar um pedaço
    específico da funcionalidade
●   Não combine testes não relacionados em
    um único método testXXX()
●   Se o primeiro teste falhar os seguintes
    não serão executados
Testes com Objetos Mock
●   Mocks
     –   São objetos “de mentira” (substitutos) que
         permitem isolar classes de um sistema.


         Conta              LinhaItem          Item
                         Item: Item        nome:String
                         quantidade: int   preco: int
    adicionar(): void
    total(): int          total(): int
Testes com Objetos Mock
public class Conta {                   public class Item {
   private int total;                      private String nome;
   public void adiciona (LinhaItem         private int preco;
linhaItem) {
       total += linhaItem.total();
                                           public void setNome(String nome) {
   }
   public int total() {                        this.nome = nome;
       return total;                       }
   }                                       public void setPreco(int preco) {
}                                              this.preco = preco;
                                           }
public class LinhaItem {               }
   private Item item;
   private int quantidade;

    public LinhaItem(Item item, int quantidade) {
       this.item = item;
       this.quantidade = quantidade;
    }
    public int total() {
       return item.getPreco() * quantidade;
    }
}
Testes com Objetos Mock
import junit.framework.TestCase;

public class ContaTeste extends TesteCase {
    Conta conta = new Conta();
    Item lasanha = new Item();
    lasanha.setNome(quot;Lasanha verdequot;);
    lasanha.setPreco(10);
    Item refrigerante = new Item();
    refrigerante.setNome(quot;Guaranáquot;);
    refrigerante.setPreco(2);
    Item sorvete = new Item();
    sorvete.setNome(quot;Sorvete de Chocolatequot;);
    sorvete.setPreco(4);
    Item cafe = new Item();
    cafe.setNome(quot;Cafe Expressoquot;);
    cafe.setPreco(1);

      LinhaItem   linhaLasanha = new LinhaItem(lasanha, 2);
      LinhaItem   linhaRefri = new LinhaItem(refrigerante, 4);
      LinhaItem   linhaSorvete = new LinhaItem(sorvete, 1);
      LinhaItem   linhaCafe = new LinhaItem(cafe, 2);

      conta.adiciona(linhaLasanha);
      conta.adiciona(linhaRefri);
      conta.adiciona(linhaSorvete);
      conta.adiciona(linhaCafe);

      assertEquals(34. conta.total);
} }
Testes com Objetos Mock
●   Problemas da classe ContaTeste:
    –   Método de teste maior e complexo;
    –   O teste não é verdadeiramente um teste de
        unidade:
         ●   Uma falha no teste pode ser causada por uma falha
             na classe Conta, na classe LinhaItem ou mesmo na
             classe Item.
●   Solução:
    –   Usar objetos mock
    –   Elimina a dependência entre as classes (Conta e
        LinhaItem)
    –   Ao testarmos, ao invés de usar a classe
        LinhaItem, usaremos uma classe que “finge” ser
        a ela.
Testes com Objetos Mock
●   Como usar mock no exemplo?
    –   Usaremos uma classe especial chamada de
        LinhaMock
          ●   Essa classe já recebe no construtor o valor total de
              uma LinhaItem.
    –   A classe LinhaItem passa a implementar uma
        interface, Linha, com um único método: total()
    –   Esse método será utilizado pela classe Conta.

        public interface Linha{
           int total();
        }
Testes com Objetos Mock
●   Nova classe de Teste:
    public class ContaTeste{
       public void TestaTotalNota() {
          Conta conta = new Conta();
          conta.adiciona(new LinhaMock(20));
          conta.adiciona(new LinhaMock(8));
          conta.adiciona(new LinhaMock(2));
          conta.adiciona(new LinhaMock(1));
          conta.adiciona(new LinhaMock(1));
          assertEquals(32,conta.total());
       }
       public static Test suite(){
          return new TestSuite(ContaTeste.class);
       }
    }
Usando Easymock
●   Nem sempre é simples escrever objetos
    mock.
●   Ferramenta Easymock: APIs para gerar
    objetos mock.
●   Como fazer para testar um servlet que
    implementa um mecanismo simplificado de
    login, recebendo dois parâmetros: login e
    senha.
    –   Para obter parâmetros em um servlet usamos
         ●   getParameter(“nomeParametro”) da interface
             HttpServletRequest
Usando Easymock
●   Qual seria o problema?
    –   A interface HttpServletRequest possui mais de
        10 métodos e só estamos interessados no
        getParameter().
         ●   Criar um mock objeto para isso significa criar uma
             classe coma implementação desejada de
             getParameter() e uma implementação vazia ou
             mínima para todos os outros métodos.
●   Solução:
    –   Usar APIs para gerar e manipular objetos mock.
    –   Ao invés de criarmos uma classe que
        implementa uma interface específica, deixamos
        que o EasyMock faça isso por nós.
         ●   Não precisaremos criar um arquivo para nosso mock.
EasyMock
●   O EasyMock pode ser obtido em:
    –   easymock.org
●   Basta extrair do download a biblioteca
    easymock.jar e colocá-la no classpath de
    seu projeto.
Passo a passo usando
                  EasyMock
●   1º Passo)
    –   Solicitamos a criação de um mock para um
        interface particular
         HttpServletRequest requestMock =
          createMock(HttpServletRequest.class);
●   2º Passo)
    –   Criamos comportamentos específicos
         ●   O mock objeto request irá esperar que alguma outra
             classe acesse o seu método getParameter()
              expect(requestMock.getParameter(“login”)).
               andReturn(“Marilia”);

              expect(requestMock.getParameter(“senha”)).
               andReturn(“cefet”);
Passo a passo usando
               EasyMock
●   3º Passo)
    –   Precisamos informar ao mock que ele já não
        está mais sendo preparado, ou seja, é hora da
        ação.
    –   Para isso usamos o método replay();
    –   A partir deste ponto o mock pode ser usado
        normalmente onde antes teria sido necessário
        utilizar um objeto real da aplicação.
    replay(requestMock);
    LoginServlet loginServlet = new LoginServlet();
    assertTrue(loginServlet.loginValido(requestMock
      ());
Passo a passo usando
               EasyMock
●   Observações:
    –   Os métodos usados para programar mock ficam
        disponíveis para a classe de testes através de
        um import estático dos métodos da classe
        EasyMock.
    import static org.easymock.EasyMock.*;
    –   É necessário usarmos java 5 ou superior
Passo a passo usando
                  EasyMock
import   java.io.IOException;
import   javax.servlet.ServletException;
import   javax.servlet.ServletOutputStream;
import   javax.servlet.http.HttpServlet;
import   javax.servlet.http.HttpServletRequest;
import   javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {
        ServletOutputStream out = response.getOutputStream();
        if(loginValido(request)) {
            out.println(quot;Bem-vindoquot;);
        } else {
            out.println(quot;Acesso negadoquot;);
        }
    }
    public boolean loginValido(HttpServletRequest request) {
        if(quot;Mariliaquot;.equals(request.getParameter(quot;loginquot;)) &&
        quot;cefetquot;.equals(request.getParameter(quot;senhaquot;))) {
            return true;
        }
        return false;
    }
}
Passo a passo usando
                  EasyMock
import javax.servlet.http.HttpServletRequest;
import junit.framework.TestCase;
import static org.easymock.EasyMock.*;

public class LoginTeste extends TestCase {
    public void testeLoginComSucesso(){
        HttpServletRequest requestMock = createMock(HttpServletRequest.class);
        expect(requestMock.getParameter(quot;loginquot;)).andReturn(quot;Mariliaquot;);
        expect(requestMock.getParameter(quot;senhaquot;)).andReturn(quot;cfetquot;);
        replay(requestMock);

        LoginServlet loginServlet = new LoginServlet();
        assertTrue(loginServlet.loginValido(requestMock));
    }

}
Para maiores informações
●   Junit:
    –   http://junit.sourceforge.net/
●   EasyMock
    –   http://www.easymock.org/EasyMock2_2_Docum
        entation.html

Mais conteúdo relacionado

Mais procurados

Junções e subconsultas
Junções e subconsultasJunções e subconsultas
Junções e subconsultasjulianaveregue
 
Uml Diagramas Estruturais
Uml   Diagramas EstruturaisUml   Diagramas Estruturais
Uml Diagramas Estruturaisthaisedd
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosphelypploch
 
Java basic tutorial by sanjeevini india
Java basic tutorial by sanjeevini indiaJava basic tutorial by sanjeevini india
Java basic tutorial by sanjeevini indiaSanjeev Tripathi
 
Programação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java WebProgramação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java WebAlex Camargo
 
Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018André Luiz Forchesatto
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIElias Nogueira
 
O paradigma da orientação a objetos
O paradigma da orientação a objetosO paradigma da orientação a objetos
O paradigma da orientação a objetosNécio de Lima Veras
 
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com JavaExercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com JavaLoiane Groner
 
Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnitLeonardo Soares
 
Aula 10 - Diagrama de Sequencia.pdf
Aula 10 - Diagrama de Sequencia.pdfAula 10 - Diagrama de Sequencia.pdf
Aula 10 - Diagrama de Sequencia.pdfIvanFontainha
 
Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)Leinylson Fontinele
 
Introdução ao Spring Framework
Introdução ao Spring FrameworkIntrodução ao Spring Framework
Introdução ao Spring FrameworkNatanael Fonseca
 

Mais procurados (20)

Junções e subconsultas
Junções e subconsultasJunções e subconsultas
Junções e subconsultas
 
Uml Diagramas Estruturais
Uml   Diagramas EstruturaisUml   Diagramas Estruturais
Uml Diagramas Estruturais
 
Java Basics
Java BasicsJava Basics
Java Basics
 
TypeScript intro
TypeScript introTypeScript intro
TypeScript intro
 
Spring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutosSpring Boot - Uma app do 0 a Web em 30 minutos
Spring Boot - Uma app do 0 a Web em 30 minutos
 
Java basic tutorial by sanjeevini india
Java basic tutorial by sanjeevini indiaJava basic tutorial by sanjeevini india
Java basic tutorial by sanjeevini india
 
POO - 03 - Alocação de Memória em Java
POO - 03 - Alocação de Memória em JavaPOO - 03 - Alocação de Memória em Java
POO - 03 - Alocação de Memória em Java
 
Diagrama de Classes
Diagrama de ClassesDiagrama de Classes
Diagrama de Classes
 
Programação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java WebProgramação para Web II: Estrutura de um projeto Java Web
Programação para Web II: Estrutura de um projeto Java Web
 
Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018
 
Test NG Framework Complete Walk Through
Test NG Framework Complete Walk ThroughTest NG Framework Complete Walk Through
Test NG Framework Complete Walk Through
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de API
 
O paradigma da orientação a objetos
O paradigma da orientação a objetosO paradigma da orientação a objetos
O paradigma da orientação a objetos
 
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com JavaExercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
Exercicios Vetores (Arrays) - Estruturas de dados e algoritmos com Java
 
Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnit
 
Arquitetura de sistemas web
Arquitetura de sistemas webArquitetura de sistemas web
Arquitetura de sistemas web
 
Gof design patterns
Gof design patternsGof design patterns
Gof design patterns
 
Aula 10 - Diagrama de Sequencia.pdf
Aula 10 - Diagrama de Sequencia.pdfAula 10 - Diagrama de Sequencia.pdf
Aula 10 - Diagrama de Sequencia.pdf
 
Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)Estrutura de Dados Apoio (Tabela Hash)
Estrutura de Dados Apoio (Tabela Hash)
 
Introdução ao Spring Framework
Introdução ao Spring FrameworkIntrodução ao Spring Framework
Introdução ao Spring Framework
 

Semelhante a Testes de Unidade com JUnit

JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitárioselliando dias
 
Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitelliando dias
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitDiego Tremper
 
Testes de performance com JUnitPerf
Testes de performance com JUnitPerfTestes de performance com JUnitPerf
Testes de performance com JUnitPerfDenis L Presciliano
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitRobinson Castilho
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010rafaelferreira
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 

Semelhante a Testes de Unidade com JUnit (20)

Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Java 12
Java 12Java 12
Java 12
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
 
Junit
JunitJunit
Junit
 
Introdução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnitIntrodução a testes unitários automatizados com JUnit e NUnit
Introdução a testes unitários automatizados com JUnit e NUnit
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
 
JUnit
JUnitJUnit
JUnit
 
Qualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnitQualidade no desenvolvimento de software com PHPUnit
Qualidade no desenvolvimento de software com PHPUnit
 
Aula5
Aula5Aula5
Aula5
 
Java5
Java5Java5
Java5
 
ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09
 
Testes de performance com JUnitPerf
Testes de performance com JUnitPerfTestes de performance com JUnitPerf
Testes de performance com JUnitPerf
 
Ferramentas testes2003
Ferramentas testes2003Ferramentas testes2003
Ferramentas testes2003
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 

Mais de elliando dias

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slideselliando dias
 
Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScriptelliando dias
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structureselliando dias
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de containerelliando dias
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agilityelliando dias
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Librarieselliando dias
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!elliando dias
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Webelliando dias
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduinoelliando dias
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorceryelliando dias
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Designelliando dias
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makeselliando dias
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.elliando dias
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebookelliando dias
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Studyelliando dias
 

Mais de elliando dias (20)

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slides
 
Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScript
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structures
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de container
 
Geometria Projetiva
Geometria ProjetivaGeometria Projetiva
Geometria Projetiva
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agility
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Libraries
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!
 
Ragel talk
Ragel talkRagel talk
Ragel talk
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Web
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Minicurso arduino
Minicurso arduinoMinicurso arduino
Minicurso arduino
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorcery
 
Rango
RangoRango
Rango
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Design
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makes
 
Hadoop + Clojure
Hadoop + ClojureHadoop + Clojure
Hadoop + Clojure
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebook
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Study
 

Testes de Unidade com JUnit

  • 1. Testes de Unidade com JUnit Introdução prática ao uso de JUnit para desenvolver testes unitários
  • 2. JUnit ● Junit: framework para desenvolvimento e execução de testes de unidade em programas Java ● Define um modelo de programação para a criação de testes de unidade em classes Java ● Disponibiliza o TestRunner: aplicação em modo texto ou gráfico para execução de testes ● Podemos baixar o Junit em www.junit.org – O arquivo junit.jar deve estar no classpath do nosso projeto
  • 3. Facilidades do JUnit ● Permite criação de testes unitários para métodos pertencentes a uma classe ● Permite a definição e execução de um conjunto de testes unitários – Suites de Teste ● Permite a execução de teste com relato de problemas ocorridos e onde especificamente ocorreram os erros
  • 4. JUnit Passo a Passo ● 1º Passo) – Criar uma classe de teste para cada classe a ser testada – Exemplo: classe Aritmetica terá como classe de teste AritmeticaTest – A classe de Teste deve herdar da classe TestCase do framework JUnit
  • 5. JUnit Passo a Passo ● 2º Passo) – criar métodos de teste para cada método (ou funcionalidade) a ser testado (cujos nomes devem começar com a palavra “test”) com tipo de retorno void. – Exemplo para a classe AritmeticaTest: public void testSoma() public void testSubtracao() public void testDivisao() public void testMultiplicacao()
  • 6. JUnit Passo a Passo ● 3º Passo) – para cada método de teste definir seu comportamento: – invocação de métodos da classe do sistema a ser testada – avaliação do resultado dos métodos sendo testados usando os métodos assertEquals(), fail(), assertNull(), assertNotNull() do framework JUnit
  • 7. JUnit Passo a Passo Método Descrição Teste passa se assertEquals(a,b) Compara dois a.equals(b) valores assertFalse(a) a == false Avalia uma assertTrue(a) expressão booleana a == true assertNotNull(a) a != null Compara uma assertNull(a) variável com nulo a == null assertNotSame(a,b) a == b Compara dois assertSame(a,b) objetos a != b fail() Causa uma falha no teste atual
  • 8. JUnit Passo a Passo: Exemplo public class Aritmetica { public int soma(int op1, int op2) { return op1 + op2; } public int subtracao(int op1,int op2) { return op1 -op2; } public int multiplicacao(int op1, int op2) { return op1 * op2; } public int divisao(int op1, int op2) throws Exception { if (op2 == 0 ) { throw new Exception(quot;Divisao por zeroquot;); } else { return op1/op2; } } }
  • 9. JUnit Passo a Passo: Exemplo import junit.framework.*; public class AritmeticaTest extends TestCase { public void testSoma() { Aritmetica operacoes = new Aritmetica(); this.assertEquals(4,operacoes.soma(3,1)); } public void testSubtracao(){ Aritmetica operacoes = new Aritmetica(); this.assertEquals(2, operacoes.subtracao(3,1)); } public void testDivisao() { Aritmetica operacoes = new Aritmetica(); try { operacoes.divisao(3,0); fail(quot;Deveria lançar Excecaoquot;); } catch (Exception e) { } } public void testMultiplicacao(){ Aritmetica operacoes = new Aritmetica(); this.assertEquals(3,operacoes.multiplicacao(3,1)); } }
  • 10. JUnit Passo a Passo: Exemplo ● Como Executar o teste? – Direto na linha de comando: java junit.textui.TestRunner ContaTeste – Ou inserir os métodos abaixo na classe de teste public static Test suite(){ return new TestSuite(AritmeticaTest.class); } public static void main(String[] args){ junit.textui.TestRunner.run(suite()); } TestRunner chama suite() automaticamente e trata como testes (e executa) todos os métodos sem argumentos cujos nomes começarem com quot;testquot;
  • 11. JUnit Passo a Passo: Exemplo ● Teste com erro ● Teste sem erro
  • 12. Observações ● Caso necessário, pode-se definir configurações iniciais para serem executadas antes de cada método de teste usando o método setUp() – configuração de objetos comuns aos casos de teste – configuração de recursos comuns aos casos de teste – (exemplo: abertura de conexões de banco de dados, socket, etc) ● Para liberar recursos utilizados pelos métodos de teste pode-se usar o método tearDown() – Exemplos de recursos que podem ser liberados: streams, fechar conexões de banco de dados, apagar/mover arquivos de dados.
  • 13. JUnit Passo a Passo public class Aritmetica { private int op1,op2; public void setOp1(int op1) { this.op1 = op1; } public void setOp2(int op2) { this.op2 = op2; } public int soma() { return op1 + op2; } public int subtracao() { return op1 -op2; } public int multiplicacao() { return op1 * op2; } public int divisao() throws Exception { if (op2 == 0 ) { throw new Exception(quot;Divisao por zeroquot;); } else { return op1/op2; } } }
  • 14. JUnit Passo a Passo import junit.framework.*; public class AritmeticaTest extends TestCase { Aritmetica operacoes; Executa antes de cada public void setUp() { operacoes = new Aritmetica(); método de teste operacoes.setOp1(3); operacoes.setOp2(1); } public void testSoma() { this.assertEquals(4,operacoes.soma()); } public void testSubtracao(){ this.assertEquals(2, operacoes.subtracao()); } public void testDivisao() { try { this.assertEquals(3,operacoes.divisao()); } catch (Exception e) { } } public void testMultiplicacao(){ this.assertEquals(3,operacoes.multiplicacao()); } }
  • 15. Execução JUnit ● Seqüência de execução do JUnit: – Cria uma instância da classe de teste para cada método de teste. (Exemplo: 4 testes, 4 instâncias). – O test case é instanciado para executar um método testXXX() de cada vez. ● As alterações que ele fizer ao estado do objeto não afetarão os demais testes ● Para cada instância: – Chama o método setUp(); – Chama o método de teste; – Chama o método tearDown();
  • 16. Suites de Testes ● Quando falamos em teste automatizado, é comum querermos executar um conjunto de testes de uma única vez; ● Suites de testes representam um conjunto de testes que serão executados seqüencialmente; ● JUnit define a classe TestSuite que: – Permite incluir todos os métodos de teste de uma classe em um suite de teste; – Permite definir uma classe que inclui todos os suites de teste das classes do sistema.
  • 17. TestSuite ● P ermite executar uma coleção de testes – Método addTest(TestS uite) adiciona um teste na lista ● P adrão de codificação: – retornar um TestS uite em cada test-case: public static TestSuite suite() { return new TestSuite(SuaClasseTest.class); } – criar uma classe AllTests que combina as suites: public class AllTests { public static Test suite() { TestSuite testSuite = new TestSuite(quot;Roda tudoquot;); testSuite.addTest(pacote.AllTests.suite()); testSuite.addTest(MinhaClasseTest.suite()); testSuite.addTest(SuaClasseTest.suite()); return testSuite; } }
  • 18. Observações gerais ● Cada teste deve verificar um pedaço específico da funcionalidade ● Não combine testes não relacionados em um único método testXXX() ● Se o primeiro teste falhar os seguintes não serão executados
  • 19. Testes com Objetos Mock ● Mocks – São objetos “de mentira” (substitutos) que permitem isolar classes de um sistema. Conta LinhaItem Item Item: Item nome:String quantidade: int preco: int adicionar(): void total(): int total(): int
  • 20. Testes com Objetos Mock public class Conta { public class Item { private int total; private String nome; public void adiciona (LinhaItem private int preco; linhaItem) { total += linhaItem.total(); public void setNome(String nome) { } public int total() { this.nome = nome; return total; } } public void setPreco(int preco) { } this.preco = preco; } public class LinhaItem { } private Item item; private int quantidade; public LinhaItem(Item item, int quantidade) { this.item = item; this.quantidade = quantidade; } public int total() { return item.getPreco() * quantidade; } }
  • 21. Testes com Objetos Mock import junit.framework.TestCase; public class ContaTeste extends TesteCase { Conta conta = new Conta(); Item lasanha = new Item(); lasanha.setNome(quot;Lasanha verdequot;); lasanha.setPreco(10); Item refrigerante = new Item(); refrigerante.setNome(quot;Guaranáquot;); refrigerante.setPreco(2); Item sorvete = new Item(); sorvete.setNome(quot;Sorvete de Chocolatequot;); sorvete.setPreco(4); Item cafe = new Item(); cafe.setNome(quot;Cafe Expressoquot;); cafe.setPreco(1); LinhaItem linhaLasanha = new LinhaItem(lasanha, 2); LinhaItem linhaRefri = new LinhaItem(refrigerante, 4); LinhaItem linhaSorvete = new LinhaItem(sorvete, 1); LinhaItem linhaCafe = new LinhaItem(cafe, 2); conta.adiciona(linhaLasanha); conta.adiciona(linhaRefri); conta.adiciona(linhaSorvete); conta.adiciona(linhaCafe); assertEquals(34. conta.total); } }
  • 22. Testes com Objetos Mock ● Problemas da classe ContaTeste: – Método de teste maior e complexo; – O teste não é verdadeiramente um teste de unidade: ● Uma falha no teste pode ser causada por uma falha na classe Conta, na classe LinhaItem ou mesmo na classe Item. ● Solução: – Usar objetos mock – Elimina a dependência entre as classes (Conta e LinhaItem) – Ao testarmos, ao invés de usar a classe LinhaItem, usaremos uma classe que “finge” ser a ela.
  • 23. Testes com Objetos Mock ● Como usar mock no exemplo? – Usaremos uma classe especial chamada de LinhaMock ● Essa classe já recebe no construtor o valor total de uma LinhaItem. – A classe LinhaItem passa a implementar uma interface, Linha, com um único método: total() – Esse método será utilizado pela classe Conta. public interface Linha{ int total(); }
  • 24. Testes com Objetos Mock ● Nova classe de Teste: public class ContaTeste{ public void TestaTotalNota() { Conta conta = new Conta(); conta.adiciona(new LinhaMock(20)); conta.adiciona(new LinhaMock(8)); conta.adiciona(new LinhaMock(2)); conta.adiciona(new LinhaMock(1)); conta.adiciona(new LinhaMock(1)); assertEquals(32,conta.total()); } public static Test suite(){ return new TestSuite(ContaTeste.class); } }
  • 25. Usando Easymock ● Nem sempre é simples escrever objetos mock. ● Ferramenta Easymock: APIs para gerar objetos mock. ● Como fazer para testar um servlet que implementa um mecanismo simplificado de login, recebendo dois parâmetros: login e senha. – Para obter parâmetros em um servlet usamos ● getParameter(“nomeParametro”) da interface HttpServletRequest
  • 26. Usando Easymock ● Qual seria o problema? – A interface HttpServletRequest possui mais de 10 métodos e só estamos interessados no getParameter(). ● Criar um mock objeto para isso significa criar uma classe coma implementação desejada de getParameter() e uma implementação vazia ou mínima para todos os outros métodos. ● Solução: – Usar APIs para gerar e manipular objetos mock. – Ao invés de criarmos uma classe que implementa uma interface específica, deixamos que o EasyMock faça isso por nós. ● Não precisaremos criar um arquivo para nosso mock.
  • 27. EasyMock ● O EasyMock pode ser obtido em: – easymock.org ● Basta extrair do download a biblioteca easymock.jar e colocá-la no classpath de seu projeto.
  • 28. Passo a passo usando EasyMock ● 1º Passo) – Solicitamos a criação de um mock para um interface particular HttpServletRequest requestMock = createMock(HttpServletRequest.class); ● 2º Passo) – Criamos comportamentos específicos ● O mock objeto request irá esperar que alguma outra classe acesse o seu método getParameter() expect(requestMock.getParameter(“login”)). andReturn(“Marilia”); expect(requestMock.getParameter(“senha”)). andReturn(“cefet”);
  • 29. Passo a passo usando EasyMock ● 3º Passo) – Precisamos informar ao mock que ele já não está mais sendo preparado, ou seja, é hora da ação. – Para isso usamos o método replay(); – A partir deste ponto o mock pode ser usado normalmente onde antes teria sido necessário utilizar um objeto real da aplicação. replay(requestMock); LoginServlet loginServlet = new LoginServlet(); assertTrue(loginServlet.loginValido(requestMock ());
  • 30. Passo a passo usando EasyMock ● Observações: – Os métodos usados para programar mock ficam disponíveis para a classe de testes através de um import estático dos métodos da classe EasyMock. import static org.easymock.EasyMock.*; – É necessário usarmos java 5 ou superior
  • 31. Passo a passo usando EasyMock import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream out = response.getOutputStream(); if(loginValido(request)) { out.println(quot;Bem-vindoquot;); } else { out.println(quot;Acesso negadoquot;); } } public boolean loginValido(HttpServletRequest request) { if(quot;Mariliaquot;.equals(request.getParameter(quot;loginquot;)) && quot;cefetquot;.equals(request.getParameter(quot;senhaquot;))) { return true; } return false; } }
  • 32. Passo a passo usando EasyMock import javax.servlet.http.HttpServletRequest; import junit.framework.TestCase; import static org.easymock.EasyMock.*; public class LoginTeste extends TestCase { public void testeLoginComSucesso(){ HttpServletRequest requestMock = createMock(HttpServletRequest.class); expect(requestMock.getParameter(quot;loginquot;)).andReturn(quot;Mariliaquot;); expect(requestMock.getParameter(quot;senhaquot;)).andReturn(quot;cfetquot;); replay(requestMock); LoginServlet loginServlet = new LoginServlet(); assertTrue(loginServlet.loginValido(requestMock)); } }
  • 33. Para maiores informações ● Junit: – http://junit.sourceforge.net/ ● EasyMock – http://www.easymock.org/EasyMock2_2_Docum entation.html