Your SlideShare is downloading. ×
0
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 mo...
Facilidades do JUnit
●   Permite criação de testes unitários para
    métodos pertencentes a uma classe
●   Permite a defi...
JUnit Passo a Passo
●   1º Passo)
    –   Criar uma classe de teste para cada classe a
        ser testada
    –   Exemplo...
JUnit Passo a Passo
●   2º Passo)
    –   criar métodos de teste para cada método (ou
        funcionalidade) a ser testad...
JUnit Passo a Passo
●   3º Passo)
    –   para cada método de teste definir seu
        comportamento:
    –   invocação d...
JUnit Passo a Passo

Método               Descrição            Teste passa se
assertEquals(a,b)    Compara dois         a....
JUnit Passo a Passo: Exemplo
public class Aritmetica {


    public int soma(int op1, int op2) {
        return op1 + op2;...
JUnit Passo a Passo: Exemplo
import junit.framework.*;

public class AritmeticaTest extends TestCase {

public void testSo...
JUnit Passo a Passo: Exemplo
●    Como Executar o teste?
      – Direto na linha de comando:
     java junit.textui.TestRu...
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 ...
JUnit Passo a Passo
public class Aritmetica {

    private int op1,op2;

    public void setOp1(int op1) {
         this.o...
JUnit Passo a Passo
import junit.framework.*;

public class AritmeticaTest extends TestCase {

    Aritmetica operacoes;
 ...
Execução JUnit
●
    Seqüência de execução do JUnit:
     – Cria uma instância da classe de teste para cada
       método ...
Suites de Testes
●   Quando falamos em teste automatizado, é comum
    querermos executar um conjunto de testes de uma
   ...
TestSuite
●   P ermite executar uma coleção de testes
    –  Método addTest(TestS uite) adiciona um teste na
       lista
...
Observações gerais
●   Cada teste deve verificar um pedaço
    específico da funcionalidade
●   Não combine testes não rel...
Testes com Objetos Mock
●   Mocks
     –   São objetos “de mentira” (substitutos) que
         permitem isolar classes de ...
Testes com Objetos Mock
public class Conta {                   public class Item {
   private int total;                  ...
Testes com Objetos Mock
import junit.framework.TestCase;

public class ContaTeste extends TesteCase {
    Conta conta = ne...
Testes com Objetos Mock
●   Problemas da classe ContaTeste:
    –   Método de teste maior e complexo;
    –   O teste não ...
Testes com Objetos Mock
●   Como usar mock no exemplo?
    –   Usaremos uma classe especial chamada de
        LinhaMock
 ...
Testes com Objetos Mock
●   Nova classe de Teste:
    public class ContaTeste{
       public void TestaTotalNota() {
     ...
Usando Easymock
●   Nem sempre é simples escrever objetos
    mock.
●   Ferramenta Easymock: APIs para gerar
    objetos m...
Usando Easymock
●   Qual seria o problema?
    –   A interface HttpServletRequest possui mais de
        10 métodos e só e...
EasyMock
●   O EasyMock pode ser obtido em:
    –   easymock.org
●   Basta extrair do download a biblioteca
    easymock.j...
Passo a passo usando
                  EasyMock
●   1º Passo)
    –   Solicitamos a criação de um mock para um
        int...
Passo a passo usando
               EasyMock
●   3º Passo)
    –   Precisamos informar ao mock que ele já não
        está...
Passo a passo usando
               EasyMock
●   Observações:
    –   Os métodos usados para programar mock ficam
        ...
Passo a passo usando
                  EasyMock
import   java.io.IOException;
import   javax.servlet.ServletException;
imp...
Passo a passo usando
                  EasyMock
import javax.servlet.http.HttpServletRequest;
import junit.framework.TestC...
Para maiores informações
●   Junit:
    –   http://junit.sourceforge.net/
●   EasyMock
    –   http://www.easymock.org/Eas...
Upcoming SlideShare
Loading in...5
×

Testes de Unidade com JUnit

2,755

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,755
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
141
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Testes de Unidade com JUnit"

  1. 1. Testes de Unidade com JUnit Introdução prática ao uso de JUnit para desenvolver testes unitários
  2. 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. 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. 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. 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. 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. 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. 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. 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. 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. 11. JUnit Passo a Passo: Exemplo ● Teste com erro ● Teste sem erro
  12. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 33. Para maiores informações ● Junit: – http://junit.sourceforge.net/ ● EasyMock – http://www.easymock.org/EasyMock2_2_Docum entation.html
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×