SlideShare une entreprise Scribd logo
1  sur  24
Testando o difícil e o quase “impossível”
EDER NOGUEIRA
GEORGE FREIRE
IMD0028 - FERRAMENTAS PARA AUTOMAÇÃO DE TESTES
RESIDÊ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 outros
componentes, frameworks, etc;
◦ São automatizados para executá-los quantas
vezes for necessário;
◦ Precisam ser testados com a segurança
necessá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
Test
Test Class
Class Under
Test
Test Class
Unit Testing: Fáceis x Difíceis
 Para testes difíceis, removemos as
dependências usando os objetos mock;
Class Under
Test
Test 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” surgiu
dentro 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 das
chamadas, verificando se foram atendidas;
◦ Usam as mesmas interfaces do objeto real;
◦ Realizam verificações de estado e de
comportamento;
O que são Mocks?
 Situações reais: Se um objeto tem alguma das
características a seguir, é provável que um objeto
mock possa ser utilizado em seu lugar:
◦ Gera resultados não determinísticos (e.g. a hora ou
temperatura 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 ser
inicializado 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ção
real).
◦ Mapeamento Objeto-Relacional (ORM): Quando
trabalhamos com ORM, os mock-object nos auxiliam a
testar as operações de forma desconectada e validar se
as 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étodos
está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 interno
do objeto testado.
 3rd Party:
◦ O PowerMock oferece suporte a bibliotecas de mock existentes,
como EasyMock e Mockito, além das ferramentas de teste
TestNG e JUnit, possuindo a vantagem de se utilizar de um menor
nú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 ou
Mockito: Devido a limitação destas ferramentas, deve-se usar as
extensões do PowerMock para um conjunto de funcionalidades mais
completo;
◦ Além dos testes unitários, pode ser utilizado em testes de
integração (e.g. @PowerMockIgnore ({“org.xml.*”,”javax.xml.*”} faz
com que o carregador de classes do PowerMock ignore estes pacotes)
 Quando Não Usar:
◦ Quando não possuir o modelo preciso do comportamento/estado
do objeto que está querendo ser simulado;
◦ PowerMock foi desenvolvido por experts em teste unitário. Portanto, seu
uso não é indicado para desenvolvedores principiantes;
◦ Quando usa-se outras ferramentas de testes que não seja o JUnit
ou o TestNG.
Metendo a mão na massa
1. Configuração do Ambiente:
◦ Acesse a página:
https://code.google.com/p/powermock/downloa
ds/list e faça do download do arquivo que
conté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 e
testar uma situação com classe e métodos com
marcação final:
 Relembrando: Classes com atributos final não
poder ser herdadas; métodos com esta marcação
não podem ser reescritos; e variáveis com este
adjetivo geralmente representam valores
constantes;
 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 seu
colaborador;
III. StateFormatterTest.java
 O teste propriamente dito;
IV. Propósito:
 Mostrar que o Powermock tem a capacidade
de criar um mock do colaborador, mesmo
que seja final, e esperar chamadas de
mé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 state
return 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 {
@Test
public 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 PowerMock
cria um fake
“StateHolder”
O Powermock
ajuda a simular o
estado do
servidor;
Aqui, o PowerMock
prepara a classe
para teste por meior
de manipulação de
bytecode
Metendo a mão na massa
@Test
public 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 dentro
do seu projeto e execute o teste;
4. Todos os testes devem ocorrer sem falha:
Conclusões
 O PowerMock contém um rico conjunto de
funcionalidades que bibliotecas
tradicionais de teste unitário não
possuem;
 O PowerMock lhe ajudar a escrever o
melhor código, portanto, deve ser objeto
de estudo de qualquer desenvolvedor
Java;
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_objec
ts
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/

Contenu connexe

Tendances

Testes de Unidade - Unidade II
Testes de Unidade - Unidade IITestes de Unidade - Unidade II
Testes de Unidade - Unidade IIJoão Lourenço
 
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIProgramação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIFabio Moura Pereira
 
Nem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot FrameworkNem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot FrameworkRodrigo Matola
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitAdolfo Neto
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitRobinson Castilho
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComunidade NetPonto
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnitelliando dias
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDDDextra
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - IFabio Moura Pereira
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Excecoes
ExcecoesExcecoes
ExcecoesEMSNEWS
 
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
 

Tendances (18)

Testes de Unidade - Unidade II
Testes de Unidade - Unidade IITestes de Unidade - Unidade II
Testes de Unidade - Unidade II
 
Programação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte IIProgramação Concorrente - Gerenciamento de Threads - Parte II
Programação Concorrente - Gerenciamento de Threads - Parte II
 
Nem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot FrameworkNem tudo é Pepino: Cucumber x Robot Framework
Nem tudo é Pepino: Cucumber x Robot Framework
 
Desenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com JunitDesenvolvimento Dirigido por Testes com Junit
Desenvolvimento Dirigido por Testes com Junit
 
Palestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnitPalestra Testes Unidade Com JUnit
Palestra Testes Unidade Com JUnit
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
OOP Java
OOP JavaOOP Java
OOP Java
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
 
Palestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnitPalestra Testes De Unidade Com JUnit
Palestra Testes De Unidade Com JUnit
 
Aula5
Aula5Aula5
Aula5
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Moq - Tips and Tricks
Moq - Tips and TricksMoq - Tips and Tricks
Moq - Tips and Tricks
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
Excecoes
ExcecoesExcecoes
Excecoes
 
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
 
Junit
JunitJunit
Junit
 

Similaire à Testando código difícil com PowerMock

Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidiMasters
 
Mock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasMock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasDenis L Presciliano
 
Utilizando JMeter para realizar testes de carga em aplicações WEB
Utilizando JMeter para realizar testes de carga em aplicações WEBUtilizando JMeter para realizar testes de carga em aplicações WEB
Utilizando JMeter para realizar testes de carga em aplicações WEBFreedom DayMS
 
Utiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuraçãoUtiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuraçãoJaguaraci Silva
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - SubalgoritmosCarlos Santos
 
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...Eduardo de Lucena Falcão
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04Carlos Santos
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Anderson Araújo
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosEmbarcados
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Frameworkelliando dias
 
O framework spring
O framework springO framework spring
O framework springBruno Catão
 

Similaire à Testando código difícil com PowerMock (20)

Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps Android
 
Mock objects - Teste de código com dependências
Mock objects - Teste de código com dependênciasMock objects - Teste de código com dependências
Mock objects - Teste de código com dependências
 
J Meter
J MeterJ Meter
J Meter
 
Utilizando JMeter para realizar testes de carga em aplicações WEB
Utilizando JMeter para realizar testes de carga em aplicações WEBUtilizando JMeter para realizar testes de carga em aplicações WEB
Utilizando JMeter para realizar testes de carga em aplicações WEB
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Utiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuraçãoUtiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuração
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?
 
Robotium_Sikuli
Robotium_SikuliRobotium_Sikuli
Robotium_Sikuli
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
Tutorial java swing
Tutorial java swingTutorial java swing
Tutorial java swing
 
Cucumber
CucumberCucumber
Cucumber
 
Webinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcadosWebinar: Arquitetura de software para sistemas embarcados
Webinar: Arquitetura de software para sistemas embarcados
 
Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
O framework spring
O framework springO framework spring
O framework spring
 

Plus de Eder Nogueira

DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII Eder Nogueira
 
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YIIDETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YIIEder Nogueira
 
Títulos de Renda Fixa
Títulos de Renda FixaTítulos de Renda Fixa
Títulos de Renda FixaEder Nogueira
 
HIstóricos e Causas da Inflação
HIstóricos e Causas da InflaçãoHIstóricos e Causas da Inflação
HIstóricos e Causas da InflaçãoEder Nogueira
 
Kant e a Ética do Dever
Kant e a Ética do DeverKant e a Ética do Dever
Kant e a Ética do DeverEder Nogueira
 
Projeto Político Pedagógico - Parte I - Versão FULL
Projeto Político Pedagógico - Parte I - Versão FULLProjeto Político Pedagógico - Parte I - Versão FULL
Projeto Político Pedagógico - Parte I - Versão FULLEder Nogueira
 
PROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLAR
PROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLARPROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLAR
PROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLAREder Nogueira
 
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTES
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTESATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTES
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTESEder Nogueira
 
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAIS
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAISATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAIS
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAISEder Nogueira
 
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOS
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOSAPRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOS
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOSEder Nogueira
 
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLA
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLAAPRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLA
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLAEder Nogueira
 
CERTIFICAÇÃO DE QUALIDADE: ISO
CERTIFICAÇÃO DE QUALIDADE: ISOCERTIFICAÇÃO DE QUALIDADE: ISO
CERTIFICAÇÃO DE QUALIDADE: ISOEder Nogueira
 
Ferramentas Colaborativas
Ferramentas ColaborativasFerramentas Colaborativas
Ferramentas ColaborativasEder Nogueira
 
Tutorial JBoss Seam
Tutorial JBoss Seam Tutorial JBoss Seam
Tutorial JBoss Seam Eder Nogueira
 
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...Eder Nogueira
 
Padrão de Projeto Mediator
Padrão de Projeto MediatorPadrão de Projeto Mediator
Padrão de Projeto MediatorEder Nogueira
 
JAVA MEDIA FRAMEWORK
JAVA MEDIA FRAMEWORKJAVA MEDIA FRAMEWORK
JAVA MEDIA FRAMEWORKEder Nogueira
 
PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...
PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...
PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...Eder Nogueira
 
JavaFX - Uma visão Geral
JavaFX - Uma visão GeralJavaFX - Uma visão Geral
JavaFX - Uma visão GeralEder Nogueira
 

Plus de Eder Nogueira (20)

COBIT 5
COBIT 5 COBIT 5
COBIT 5
 
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
 
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YIIDETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
DETRAN MAIS FÁCIL: CONSTRUÇÃO DE APP WEB USANDO O FRAMEWORK ÁGIL YII
 
Títulos de Renda Fixa
Títulos de Renda FixaTítulos de Renda Fixa
Títulos de Renda Fixa
 
HIstóricos e Causas da Inflação
HIstóricos e Causas da InflaçãoHIstóricos e Causas da Inflação
HIstóricos e Causas da Inflação
 
Kant e a Ética do Dever
Kant e a Ética do DeverKant e a Ética do Dever
Kant e a Ética do Dever
 
Projeto Político Pedagógico - Parte I - Versão FULL
Projeto Político Pedagógico - Parte I - Versão FULLProjeto Político Pedagógico - Parte I - Versão FULL
Projeto Político Pedagógico - Parte I - Versão FULL
 
PROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLAR
PROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLARPROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLAR
PROJETO POLÍTICO PEDAGÓGICO - DIAGNÓSTICO ESCOLAR
 
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTES
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTESATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTES
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - DOCENTES
 
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAIS
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAISATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAIS
ATENDIMENTO EDUCACIONAL ESPECIALIZADO - PAIS
 
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOS
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOSAPRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOS
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ALUNOS
 
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLA
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLAAPRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLA
APRESENTAÇÃO DO PPP ESCOLA MUN. PROF. LUIZ MARANHÃO FILHO PARTE I - ESCOLA
 
CERTIFICAÇÃO DE QUALIDADE: ISO
CERTIFICAÇÃO DE QUALIDADE: ISOCERTIFICAÇÃO DE QUALIDADE: ISO
CERTIFICAÇÃO DE QUALIDADE: ISO
 
Ferramentas Colaborativas
Ferramentas ColaborativasFerramentas Colaborativas
Ferramentas Colaborativas
 
Tutorial JBoss Seam
Tutorial JBoss Seam Tutorial JBoss Seam
Tutorial JBoss Seam
 
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
UTILIZANDO O FRAMEWORK JBOSS SEAM PARA ACELERAR O DESENVOLVIMENTO DE APLICAÇÕ...
 
Padrão de Projeto Mediator
Padrão de Projeto MediatorPadrão de Projeto Mediator
Padrão de Projeto Mediator
 
JAVA MEDIA FRAMEWORK
JAVA MEDIA FRAMEWORKJAVA MEDIA FRAMEWORK
JAVA MEDIA FRAMEWORK
 
PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...
PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...
PROGRAMAÇÃO DECLARATIVA COM JAVAFX: UM PARADIGMA NA CONSTRUÇÃO DE INTERFACES ...
 
JavaFX - Uma visão Geral
JavaFX - Uma visão GeralJavaFX - Uma visão Geral
JavaFX - Uma visão Geral
 

Testando código difícil com PowerMock

  • 1. Testando o difícil e o quase “impossível” EDER NOGUEIRA GEORGE FREIRE IMD0028 - FERRAMENTAS PARA AUTOMAÇÃO DE TESTES RESIDÊNCIA EM ENGENHARIA DE SOFTWARE INSTITUTO METRÓPOLE DIGITAL/ UFRN
  • 2. 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;
  • 3. 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 outros componentes, frameworks, etc; ◦ São automatizados para executá-los quantas vezes for necessário; ◦ Precisam ser testados com a segurança necessária; ◦ Resumindo: CÓDIGO FÁCIL DE SER TESTADO É CÓDIGO ISOLADO,SEGURO E AUTOMATIZADO.
  • 4. Unit Testing: Fáceis x Difíceis  Easy Tests:  Hard Tests: Class Under Test Test Class Class Under Test Test Class
  • 5. Unit Testing: Fáceis x Difíceis  Para testes difíceis, removemos as dependências usando os objetos mock; Class Under Test Test Class m o c k m o c k m o c km o c k
  • 6. O que são Mocks?  Segundo os especialistas: ◦ Martin Fowler: O termo “mock object” surgiu dentro 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;
  • 7. O que são Mocks?  Sendo mais claro, os objetos mock: ◦ Simulam objetos reais; ◦ Modularizam melhor os testes; ◦ Gravam e examinam as expectativas das chamadas, verificando se foram atendidas; ◦ Usam as mesmas interfaces do objeto real; ◦ Realizam verificações de estado e de comportamento;
  • 8. O que são Mocks?  Situações reais: Se um objeto tem alguma das características a seguir, é provável que um objeto mock possa ser utilizado em seu lugar: ◦ Gera resultados não determinísticos (e.g. a hora ou temperatura 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 ser inicializado 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ção real). ◦ Mapeamento Objeto-Relacional (ORM): Quando trabalhamos com ORM, os mock-object nos auxiliam a testar as operações de forma desconectada e validar se as operações estão sendo chamadas a contento;
  • 9. 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;
  • 10. 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;
  • 11. 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/
  • 12. 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/
  • 13. Porque o PowerMock?  Open-Source;  Performance: ◦ Carregador de classes e de bytecode personalizado; ◦ Injeção de Dependência é muito custoso com chamadas a métodos está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 interno do objeto testado.  3rd Party: ◦ O PowerMock oferece suporte a bibliotecas de mock existentes, como EasyMock e Mockito, além das ferramentas de teste TestNG e JUnit, possuindo a vantagem de se utilizar de um menor número de métodos e anotações e oferecendo recursos extras; ◦ Integração com o Spring e Maven;
  • 14. 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 ou Mockito: Devido a limitação destas ferramentas, deve-se usar as extensões do PowerMock para um conjunto de funcionalidades mais completo; ◦ Além dos testes unitários, pode ser utilizado em testes de integração (e.g. @PowerMockIgnore ({“org.xml.*”,”javax.xml.*”} faz com que o carregador de classes do PowerMock ignore estes pacotes)  Quando Não Usar: ◦ Quando não possuir o modelo preciso do comportamento/estado do objeto que está querendo ser simulado; ◦ PowerMock foi desenvolvido por experts em teste unitário. Portanto, seu uso não é indicado para desenvolvedores principiantes; ◦ Quando usa-se outras ferramentas de testes que não seja o JUnit ou o TestNG.
  • 15. Metendo a mão na massa 1. Configuração do Ambiente: ◦ Acesse a página: https://code.google.com/p/powermock/downloa ds/list e faça do download do arquivo que conté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;
  • 16. Metendo a mão na massa 2. Conhecendo o projeto FinalMocking:  Neste exemplo, mostraremos como simular e testar uma situação com classe e métodos com marcação final:  Relembrando: Classes com atributos final não poder ser herdadas; métodos com esta marcação não podem ser reescritos; e variáveis com este adjetivo geralmente representam valores constantes;  Classes do Projeto: StateHolder.java, StateFormatter.java e StateFormatterTest.java
  • 17. 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 seu colaborador; III. StateFormatterTest.java  O teste propriamente dito; IV. Propósito:  Mostrar que o Powermock tem a capacidade de criar um mock do colaborador, mesmo que seja final, e esperar chamadas de métodos, embora também seja final;
  • 18. 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 state return null; } public final void setState(String state) { // Imagine that we store the state in a database. } }
  • 19. 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; } }
  • 20. Metendo a mão na massa @RunWith(PowerMockRunner.class) @PrepareForTest(StateHolder.class) public class StateFormatterTest { @Test public 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 PowerMock cria um fake “StateHolder” O Powermock ajuda a simular o estado do servidor; Aqui, o PowerMock prepara a classe para teste por meior de manipulação de bytecode
  • 21. Metendo a mão na massa @Test public 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); } }
  • 22. Metendo a mão na massa 3. Copie o código das 3 classes para dentro do seu projeto e execute o teste; 4. Todos os testes devem ocorrer sem falha:
  • 23. Conclusões  O PowerMock contém um rico conjunto de funcionalidades que bibliotecas tradicionais de teste unitário não possuem;  O PowerMock lhe ajudar a escrever o melhor código, portanto, deve ser objeto de estudo de qualquer desenvolvedor Java;
  • 24. 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_objec ts 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/