Escolar Documentos
Profissional Documentos
Cultura Documentos
JUnit
Junit: framework para desenvolvimento e execuo de testes de unidade em programas Java Define um modelo de programao para a criao de testes de unidade em classes Java Disponibiliza o TestRunner: aplicao em modo texto ou grfico para execuo 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 criao de testes unitrios para mtodos pertencentes a uma classe Permite a definio e execuo de um conjunto de testes unitrios Suites de Teste Permite a execuo de teste com relato de problemas ocorridos e onde especificamente ocorreram os erros
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
2 Passo)
criar mtodos de teste para cada mtodo (ou funcionalidade) a ser testado (cujos nomes devem comear 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()
3 Passo)
para cada mtodo de teste definir seu comportamento: invocao de mtodos da classe do sistema a ser testada avaliao do resultado dos mtodos sendo testados usando os mtodos assertEquals(), fail(), assertNull(), assertNotNull() do framework JUnit
TestRunner chama suite() automaticamente e trata como testes (e executa) todos os mtodos sem argumentos cujos nomes comearem com "test"
Observaes
Caso necessrio, pode-se definir configuraes iniciais para serem executadas antes de cada mtodo de teste usando o mtodo setUp() configurao de objetos comuns aos casos de teste configurao de recursos comuns aos casos de teste (exemplo: abertura de conexes de banco de dados, socket, etc) Para liberar recursos utilizados pelos mtodos de teste pode-se usar o mtodo tearDown() Exemplos de recursos que podem ser liberados: streams, fechar conexes de banco de dados, apagar/mover arquivos de dados.
Execuo JUnit
Seqncia de execuo do JUnit: Cria uma instncia da classe de teste para cada mtodo de teste. (Exemplo: 4 testes, 4 instncias). O test case instanciado para executar um mtodo testXXX() de cada vez. As alteraes que ele fizer ao estado do objeto no afetaro os demais testes
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 sero executados seqencialmente; JUnit define a classe TestSuite que:
Permite incluir todos os mtodos 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
Mtodo addTest(TestS uite) adiciona um teste na lista P adro de codificao: retornar um TestS uite em cada test-case:
Observaes gerais
Cada teste deve verificar um pedao especfico da funcionalidade No combine testes no relacionados em um nico mtodo testXXX() Se o primeiro teste falhar os seguintes no sero executados
Mocks
Conta
public LinhaItem(Item item, int quantidade) { this.item = item; this.quantidade = quantidade; } public int total() { return item.getPreco() * quantidade; }
Uma falha no teste pode ser causada por uma falha na classe Conta, na classe LinhaItem ou mesmo na classe Item.
Soluo:
Usar objetos mock Elimina a dependncia entre as classes (Conta e LinhaItem) Ao testarmos, ao invs de usar a classe LinhaItem, usaremos uma classe que finge ser a ela.
A classe LinhaItem passa a implementar uma interface, Linha, com um nico mtodo: total() Esse mtodo ser utilizado pela classe Conta.
public interface Linha{ int total(); }
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 parmetros: login e senha.
Usando Easymock
Criar um mock objeto para isso significa criar uma classe coma implementao desejada de getParameter() e uma implementao vazia ou mnima para todos os outros mtodos.
Soluo:
Usar APIs para gerar e manipular objetos mock. Ao invs de criarmos uma classe que implementa uma interface especfica, deixamos que o EasyMock faa isso por ns.
EasyMock
easymock.org
1 Passo)
2 Passo)
O mock objeto request ir esperar que alguma outra classe acesse o seu mtodo getParameter()
expect(requestMock.getParameter(login)). andReturn(Marilia); expect(requestMock.getParameter(senha)). andReturn(cefet);
3 Passo)
Precisamos informar ao mock que ele j no est mais sendo preparado, ou seja, hora da ao. Para isso usamos o mtodo replay(); A partir deste ponto o mock pode ser usado normalmente onde antes teria sido necessrio utilizar um objeto real da aplicao.
Observaes:
Os mtodos usados para programar mock ficam disponveis para a classe de testes atravs de um import esttico dos mtodos da classe EasyMock. necessrio usarmos java 5 ou superior
public class LoginServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream out = response.getOutputStream(); if(loginValido(request)) { out.println("Bem-vindo"); } else { out.println("Acesso negado"); } } public boolean loginValido(HttpServletRequest request) { if("Marilia".equals(request.getParameter("login")) && "cefet".equals(request.getParameter("senha"))) { return true; } return false; } }
} }
Junit:
EasyMock