power mock

Post on 02-Jul-2015

167 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

PowerMock - Ferramenta Mock para JAVA

TRANSCRIPT

Testando o difícil e o quase “impossível”

EDER NOGUEIRAGEORGE FREIRE

IMD0028 - FERRAMENTAS PARA AUTOMAÇÃO DE TESTESRESIDÊNCIA EM ENGENHARIA DE SOFTWARE

INSTITUTO METRÓPOLE DIGITAL/ UFRN

Agenda

Unit Testing: Fáceis x Difíceis

O que são os Mocks?

Cenário das Ferramentas Mock;

Porque o PowerMock;

Quando Usar x Quando Não Usar;

Metendo a mão na massa;

Conclusões;

Referências Bibliográficas;

Unit Testing: Fáceis x Difíceis

Testes unitários são fáceis quando:◦ Seu código não depende de nada: Sem arquivos

de sistema, conexões com bancos de dados,web services, sockets;

◦ Não possua dependências com outroscomponentes, frameworks, etc;

◦ São automatizados para executá-los quantasvezes for necessário;

◦ Precisam ser testados com a segurançanecessária;

◦ Resumindo:

CÓDIGO FÁCIL DE SER TESTADO É CÓDIGO ISOLADO,SEGURO E AUTOMATIZADO.

Unit Testing: Fáceis x Difíceis

Easy Tests:

Hard Tests:

Class Under

TestTest Class

Class Under

TestTest Class

Unit Testing: Fáceis x Difíceis

Para testes difíceis, removemos as dependências usando os objetos mock;

Class Under

TestTest Class

m

o

c

k

m

o

c

k

m

o

c

km

o

c

k

O que são Mocks?

Segundo os especialistas:

◦ Martin Fowler: O termo “mock object” surgiudentro da comunidade XP e:

“...tornou-se popular para descrever um caso especial de objetos que imitam objetos reais para teste”.

◦ Gerard Meszaro: Os mocks são:“...objetos pré-programados com informações que formam uma especificação das chamadas que esperam receber”. Fazem parte de uma classe de objetos falsos usados para propósito de testes, na qual ainda fazem parte os objetos

dummy, fake e stubs;

O que são Mocks?

Sendo mais claro, os objetos mock:

◦ Simulam objetos reais;

◦ Modularizam melhor os testes;

◦ Gravam e examinam as expectativas daschamadas, verificando se foram atendidas;

◦ Usam as mesmas interfaces do objeto real;

◦ Realizam verificações de estado e decomportamento;

O que são Mocks?

Situações reais: Se um objeto tem alguma dascaracterísticas a seguir, é provável que um objetomock possa ser utilizado em seu lugar:

◦ Gera resultados não determinísticos (e.g. a hora outemperatura atual);

◦ Tem estados que são difíceis de criar ou reproduzir (e.g.erro de comunicação da rede);

◦ É lento (e.g. um banco de dados completo que precisa serinicializado antes do teste);

◦ Ainda não existe ou pode ter comportamento alterado;◦ Teriam que adicionar informações e métodos

exclusivamente para os testes (e não para sua funçãoreal).

◦ Mapeamento Objeto-Relacional (ORM): Quandotrabalhamos com ORM, os mock-object nos auxiliam atestar as operações de forma desconectada e validar seas operações estão sendo chamadas a contento;

O que são Mocks?

Exemplo: Testar um sistema que envia SMS

◦ Solução Tradicional: ◦ Criar um teste unitário que teste o envio utilizando o

próprio provedor de SMS;

◦ Problema da Solução: Para cada SMS enviado, terá que ser pago as tarifas do SMS;

◦ Conclusão: QUANTO MAIOR O Nº DE TESTES, MAIOR O CUSTO;

O que são Mocks?

Exemplo: Testar um sistema que envia SMS

◦ Solução com objetos Mock:

Os objetos Mock simularão o comportamento dos objetos “reais” da aplicação, de forma controlada pelo desenvolvedor;

Este objeto será idêntico, ou seja, conterá os mesmos métodos e parâmetros do original, que não fará efetivamente o envio;

Logo, os testes poderão ser realizados sem custo e ainda poderá ser simulado outras situações, como a queda do serviço por parte da operadora;

Cenário das Ferramentas Mock

Ruby◦ Mocha: http://mocha.rubyforge.org/

◦ Rspec: http://rspec.rubyforge.org/

◦ FlexMock: http://onestepback.org/software/flexmock/

.NET◦ Rhino Mocks: http://www.ayende.com/projects/rhino-mocks.aspx

◦ Nmock: http://nmock.org/

◦ Moq: http://code.google.com/p/moq/

◦ TypeMock: http://www.typemock.com/

◦ Attach: http://www.codeplex.com/attach

C++◦ MockPP: http://mockpp.sf.net/

◦ Amop: http://code.google.com/p/amop

ActionScript: ◦ As2lib Mock Object: http://www.as2lib.org/

PHP◦ SimpleTest: http://simpletest.org/

◦ Yay! Mock: http://yaymock.googlecode.com/

Cenário das Ferramentas Mock

JAVA

◦ jMock: http://www.jmock.org/

◦ rMock: http://rmock.sourceforge.net/

◦ SevenMock: http://seven-mock.sourceforge.net/

◦ EasyMock: http://www.easymock.org/

◦ Mockito: http://code.google.com/p/mockito/

◦ PowerMock: https://code.google.com/p/powermock/

Porque o PowerMock?

Open-Source;

Performance:◦ Carregador de classes e de bytecode personalizado;

◦ Injeção de Dependência é muito custoso com chamadas a métodosestáticos. PowerMock permite a simulação destes métodos;

Design:◦ Possibilidade de simular métodos estáticos, privados, inicializadores

estáticos, final classes, que outras bibliotecas não possuem;

◦ Inclui muitas ferramentas que simplificam o uso de reflection,especialmente úteis para testes e facilitam o acesso ao estado internodo objeto testado.

3rd Party:◦ O PowerMock oferece suporte a bibliotecas de mock existentes,

como EasyMock e Mockito, além das ferramentas de testeTestNG e JUnit, possuindo a vantagem de se utilizar de um menornúmero de métodos e anotações e oferecendo recursos extras;

◦ Integração com o Spring e Maven;

Quando Usar x Quando Não Usar

Quando Usar:

◦ Padrões Singleton ou Factory Method estático;

◦ Quando possuir um legado de testes escritos em EasyMock ouMockito: Devido a limitação destas ferramentas, deve-se usar asextensões do PowerMock para um conjunto de funcionalidades maiscompleto;

◦ Além dos testes unitários, pode ser utilizado em testes deintegração (e.g. @PowerMockIgnore ({“org.xml.*”,”javax.xml.*”} fazcom que o carregador de classes do PowerMock ignore estes pacotes)

Quando Não Usar:

◦ Quando não possuir o modelo preciso do comportamento/estadodo objeto que está querendo ser simulado;

◦ PowerMock foi desenvolvido por experts em teste unitário. Portanto, seuuso não é indicado para desenvolvedores principiantes;

◦ Quando usa-se outras ferramentas de testes que não seja o JUnitou o TestNG.

Metendo a mão na massa

1. Configuração do Ambiente:

◦ Acesse a página:https://code.google.com/p/powermock/downloads/list e faça do download do arquivo quecontém o powermock-easymock-junit-X.X.X;

◦ No exemplo a seguir, usaremos a IDE Eclipse + plugin do JUnit 4;

◦ Crie um Java Project e adicione os .jars do arquivo baixado para dentro do projeto.

◦ Para usuários Maven, JUnit, TestNG ou Mockito, há outras bibliotecas disponíveis para este tipo de projeto;

Metendo a mão na massa

2. Conhecendo o projeto FinalMocking:

Neste exemplo, mostraremos como simular etestar uma situação com classe e métodos commarcação final:

Relembrando: Classes com atributos final nãopoder ser herdadas; métodos com esta marcaçãonão podem ser reescritos; e variáveis com esteadjetivo geralmente representam valoresconstantes;

Classes do Projeto: StateHolder.java,StateFormatter.java e StateFormatterTest.java

Metendo a mão na massa

I. StateHolder.java: Classe auxiliar da classe StateFormatter que

contém as marcações final;II. StateFormatter.java

Simples classe que interage com seucolaborador;

III. StateFormatterTest.java O teste propriamente dito;

IV. Propósito: Mostrar que o Powermock tem a capacidade

de criar um mock do colaborador, mesmoque seja final, e esperar chamadas demétodos, embora também seja final;

Metendo a mão na massa

public final class StateHolder {

/*** @return The current state.*/

public final String getState() {

// Imagine that we query a database for statereturn null;

}

public final void setState(String state) {

// Imagine that we store the state in a database.

}}

Metendo a mão na massa

public class StateFormatter {

private final StateHolder stateHolder;

public StateFormatter(StateHolder stateHolder) {this.stateHolder = stateHolder;

}public String getFormattedState() {

String safeState =“Sem informação do estado do servidor.";final String actualState = stateHolder.getState();

if (actualState != null) {safeState = actualState;

}

return safeState;}

}

Metendo a mão na massa

@RunWith(PowerMockRunner.class)@PrepareForTest(StateHolder.class)public class StateFormatterTest {

@Testpublic void testGetFormattedState_actualStateExists() throws Exception {

final String expectedState = “servidor online";StateHolder stateHolderMock = createMock(StateHolder.class);StateFormatter tested = new StateFormatter(stateHolderMock);

expect(stateHolderMock.getState()).andReturn(expectedState);

replay(stateHolderMock);

final String actualState = tested.getFormattedState();

verify(stateHolderMock);

assertEquals(expectedState, actualState);}

O PowerMockcria um fake

“StateHolder”

O Powermockajuda a simular o

estado do servidor;

Aqui, o PowerMock prepara a classe

para teste por meiorde manipulação de

bytecode

Metendo a mão na massa

@Testpublic void testGetFormattedState_noStateExists() throws Exception {

final String expectedState = "Sem informação do estado do servidor.";

StateHolder stateHolderMock = createMock(StateHolder.class);StateFormatter tested = new StateFormatter(stateHolderMock);

expect(stateHolderMock.getState()).andReturn(null);

replay(stateHolderMock);

final String actualState = tested.getFormattedState();

verify(stateHolderMock);

assertEquals(expectedState, actualState);}

}

Metendo a mão na massa

3. Copie o código das 3 classes para dentrodo seu projeto e execute o teste;

4. Todos os testes devem ocorrer sem falha:

Conclusões

O PowerMock contém um rico conjunto defuncionalidades que bibliotecastradicionais de teste unitário nãopossuem;

O PowerMock lhe ajudar a escrever omelhor código, portanto, deve ser objetode estudo de qualquer desenvolvedorJava;

Refererências Bibliográficas

1. Freeman, Steve;Pryce, Nat; Growing Object-Oriented Software Guided by Tests [Paperback]; Addison-Wesley Professional;

2. https://code.google.com/p/powermock/

3. http://www.mockobjects.com/

4. http://pt.wikipedia.org/wiki/Mock_Object

5. http://martinfowler.com/articles/mocksArentStubs.html

6. http://xunitpatterns.com/

7. http://desenvolvimentoagil.com.br/xp/praticas/tdd/mock_objects

8. http://imasters.com.br/artigo/8982/linguagens/conheca-os-objetos-mock/

9. http://pt.slideshare.net/dodozhang21/mockito-presentation-8319579

10.https://blog.42.nl/articles/mockito-powermock-vs-jmockit/

11.https://groups.google.com/forum/#!forum/powermock

12.http://www.jayway.com/tag/powermock/

top related