TQS -  Teste e Qualidade de Software ( Software Testing and Quality )   Mock Objects João Pascoal Faria [email_address]   ...
Índice <ul><li>Definição </li></ul><ul><li>Quando usar </li></ul><ul><li>Detalhes técnicos </li></ul><ul><li>Exemplo práti...
Definição <ul><li>Objectos simulados que imitam o comportamento de objectos reais de um modo controlado [wikipedia] </li><...
Quando usar <ul><li>Quando o objecto real... </li></ul><ul><ul><li>ainda não existe  </li></ul></ul><ul><ul><li>retorna um...
Detalhes técnicos <ul><li>Permitir que o objecto que o invoca não saiba se está a usar um objecto real ou um  mock object ...
Exemplo prático <ul><li>public   class  Convert { </li></ul><ul><li>… </li></ul><ul><ul><li>public   static   double  getT...
Exemplo prático (continuação) <ul><li>public   class  Convert { </li></ul><ul><li>… </li></ul><ul><ul><li>public   static ...
Exemplo prático (continuação) <ul><li>public   class  Convert { </li></ul><ul><li>… </li></ul><ul><ul><li>public   static ...
Exemplo prático (continuação) <ul><li>public   class  TestConvert  extends  TestCase { </li></ul><ul><ul><li>public   void...
Em suma… <ul><li>Escrever classes  mock </li></ul><ul><li>Estender classe real </li></ul><ul><li>Implementar interface </l...
Frameworks <ul><li>Facilitam e tornam mais rápida a criação dos Mock Objects </li></ul><ul><ul><li>Não é necessário escrev...
Frameworks <ul><li>Java </li></ul><ul><ul><li>jMock ( http://www.jmock.org ) </li></ul></ul><ul><ul><li>EasyMock ( http://...
Frameworks <ul><li>Ruby </li></ul><ul><ul><li>Mocha ( http://mocha.rubyforge.org ) </li></ul></ul><ul><ul><li>RSpec ( http...
Exemplo com jMock 2 – código a testar <ul><li>public   class  Convert { </li></ul><ul><ul><li>public   static   double  ge...
Exemplo com jMock 2 – código de teste import  org.jmock.integration.junit3.MockObjectTestCase; import  org.jmock.Expectati...
Exercício <ul><li>Com base na rotina de conversão de um número para extenso (ver “Extensos.java”), desenvolver (segundo a ...
Referências e mais informação <ul><li>www.jmock.org </li></ul><ul><li>www.mockobjects.com   </li></ul>
Próximos SlideShares
Carregando em…5
×

Mock Objects

1.790 visualizações

Publicada em

TQS - Teste e Qualidade de Software (Software Testing and Quality)

Publicada em: Tecnologia, Educação
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.790
No SlideShare
0
A partir de incorporações
0
Número de incorporações
10
Ações
Compartilhamentos
0
Downloads
40
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Mock Objects

  1. 1. TQS - Teste e Qualidade de Software ( Software Testing and Quality ) Mock Objects João Pascoal Faria [email_address] www.fe.up.pt / ~jpf (baseado em slides de ex-alunos)
  2. 2. Índice <ul><li>Definição </li></ul><ul><li>Quando usar </li></ul><ul><li>Detalhes técnicos </li></ul><ul><li>Exemplo prático </li></ul><ul><li>Frameworks </li></ul><ul><li>Exemplo com jMock 2 </li></ul>
  3. 3. Definição <ul><li>Objectos simulados que imitam o comportamento de objectos reais de um modo controlado [wikipedia] </li></ul><ul><li>Criam-se para fazer testes ao comportamento de outros objectos </li></ul><ul><ul><li>Tal como os crash test dummies são usados nos testes de automóveis </li></ul></ul>
  4. 4. Quando usar <ul><li>Quando o objecto real... </li></ul><ul><ul><li>ainda não existe </li></ul></ul><ul><ul><li>retorna um resultado não determinístico </li></ul></ul><ul><ul><ul><li>Hora Actual, Temperatura Actual </li></ul></ul></ul><ul><ul><li>tem estados difíceis de atingir </li></ul></ul><ul><ul><ul><li>um erro da rede </li></ul></ul></ul><ul><ul><li>precisa de incluir informação e métodos exclusivamente para uso nos testes e não para a sua tarefa </li></ul></ul><ul><ul><li>é lento </li></ul></ul><ul><ul><ul><li>uma base de dados completa que tenha que ser inicializada antes do teste </li></ul></ul></ul>
  5. 5. Detalhes técnicos <ul><li>Permitir que o objecto que o invoca não saiba se está a usar um objecto real ou um mock object </li></ul><ul><li>Têm a mesma interface que os objectos que simulam </li></ul><ul><ul><li>Ambos implementam a mesma interface </li></ul></ul><ul><ul><li>Mock object estende objecto real </li></ul></ul>
  6. 6. Exemplo prático <ul><li>public class Convert { </li></ul><ul><li>… </li></ul><ul><ul><li>public static double getTemperatureInCelcius(City city){ </li></ul></ul><ul><ul><ul><li>double tempF; </li></ul></ul></ul><ul><ul><ul><li>Sensor sensor = city.getSensor(); </li></ul></ul></ul><ul><ul><ul><li>tempF = sensor.getCurrentTemperature(); </li></ul></ul></ul><ul><ul><ul><li>//Convert Fahreneit to Celsius degrees </li></ul></ul></ul><ul><ul><ul><li>return (tempF-32.0)*(5.0/9.0); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>… </li></ul></ul><ul><li>} </li></ul>Resultado não determinístico Classe City não existe
  7. 7. Exemplo prático (continuação) <ul><li>public class Convert { </li></ul><ul><li>… </li></ul><ul><ul><li>public static double getTemperatureInCelcius(City city){ </li></ul></ul><ul><ul><li>double tempF; </li></ul></ul><ul><ul><li>Sensor sensor = city.getSensor(); </li></ul></ul><ul><ul><li>tempF = sensor.getCurrentTemperature(); </li></ul></ul><ul><ul><li>return (tempF-32.0)*(5.0/9.0); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>… </li></ul><ul><li>} </li></ul><ul><li>public class MockSensor extends Sensor { </li></ul><ul><li>… </li></ul><ul><ul><li>public double getCurrentTemperature() { </li></ul></ul><ul><ul><ul><li>//MOCK </li></ul></ul></ul><ul><ul><ul><li>return 72.5; </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>Resultado conhecido (=22.5ºC)
  8. 8. Exemplo prático (continuação) <ul><li>public class Convert { </li></ul><ul><li>… </li></ul><ul><ul><li>public static double getTemperatureInCelcius(City city){ </li></ul></ul><ul><ul><li>double tempF; </li></ul></ul><ul><ul><li>Sensor sensor = city.getSensor(); </li></ul></ul><ul><ul><li>tempF = sensor.getCurrentTemperature(); </li></ul></ul><ul><ul><li>return (tempF-32.0)*(5.0/9.0); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>… </li></ul><ul><li>} </li></ul>Escrever método para controlar valor de retorno <ul><li>public class MockCity implements City { </li></ul><ul><li>… </li></ul><ul><ul><li>private Sensor curSensor ; </li></ul></ul><ul><ul><li>public Sensor getSensor() { </li></ul></ul><ul><ul><ul><li>//MOCK </li></ul></ul></ul><ul><ul><ul><li>return curSensor ; </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>public void setSensor(Sensor s){ </li></ul></ul><ul><ul><li>//MOCK </li></ul></ul><ul><ul><li>this . curSensor = s; </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  9. 9. Exemplo prático (continuação) <ul><li>public class TestConvert extends TestCase { </li></ul><ul><ul><li>public void testGetTemperatureInCelcius() { </li></ul></ul><ul><ul><ul><li>MockCity city = new MockCity(); </li></ul></ul></ul><ul><ul><ul><li>MockSensor sensor = new MockSensor(); </li></ul></ul></ul><ul><ul><ul><li>city.setSensor(sensor); </li></ul></ul></ul><ul><ul><ul><li>assertEquals (22.5, Convert. getTemperatureInCelcius (city)); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>
  10. 10. Em suma… <ul><li>Escrever classes mock </li></ul><ul><li>Estender classe real </li></ul><ul><li>Implementar interface </li></ul><ul><ul><li>Implementar todos os seus métodos </li></ul></ul><ul><li>Reescrever ( overwrite ) os métodos a simular </li></ul><ul><li>Criar e executar teste </li></ul>
  11. 11. Frameworks <ul><li>Facilitam e tornam mais rápida a criação dos Mock Objects </li></ul><ul><ul><li>Não é necessário escrever o código das classes mock </li></ul></ul><ul><li>Permitem criaç ão a partir de: </li></ul><ul><ul><li>Interfaces </li></ul></ul><ul><ul><li>Classes </li></ul></ul><ul><li>Permitem definir expectativas flexíveis </li></ul><ul><ul><li>Número de chamadas a métodos </li></ul></ul><ul><ul><li>Valores de retorno </li></ul></ul><ul><ul><li>Valores dos parâmetros </li></ul></ul><ul><ul><li>Lançamento de excepç ões </li></ul></ul><ul><li>Integram com JUnit (Java), NUnit (.Net), etc. </li></ul><ul><li>Fornecem normalmente APIs extens íveis </li></ul>
  12. 12. Frameworks <ul><li>Java </li></ul><ul><ul><li>jMock ( http://www.jmock.org ) </li></ul></ul><ul><ul><li>EasyMock ( http://www.easymock.org ) </li></ul></ul><ul><ul><li>rMock ( http://rmock.sourceforge.net ) </li></ul></ul><ul><ul><li>MockCreator ( http://mockcreator.sourceforge.net ) </li></ul></ul><ul><ul><li>MockLib ( http://mocklib.sourceforge.net ) </li></ul></ul><ul><li>C# </li></ul><ul><ul><li>MockLib ( http://sourceforge.net/projects/mocklib ) </li></ul></ul><ul><ul><li>Rhino Mocks ( http://www.ayende.com /) </li></ul></ul><ul><ul><li>NMock ( http://nmock.org ) </li></ul></ul>
  13. 13. Frameworks <ul><li>Ruby </li></ul><ul><ul><li>Mocha ( http://mocha.rubyforge.org ) </li></ul></ul><ul><ul><li>RSpec ( http://rspec.rubyforge.org ) </li></ul></ul><ul><ul><li>FlexMock ( http://onestepback.org/software/flexmock ) </li></ul></ul><ul><li>Outras linguagens </li></ul><ul><ul><li>C++ </li></ul></ul><ul><ul><li>Javascript </li></ul></ul><ul><ul><li>Perl </li></ul></ul><ul><ul><li>Python </li></ul></ul><ul><ul><li>ActionScript </li></ul></ul><ul><ul><li>… </li></ul></ul>
  14. 14. Exemplo com jMock 2 – código a testar <ul><li>public class Convert { </li></ul><ul><ul><li>public static double getTemperatureInCelcius(City city){ </li></ul></ul><ul><ul><ul><li>double tempF; </li></ul></ul></ul><ul><ul><ul><li>Sensor sensor = city.getSensor(); </li></ul></ul></ul><ul><ul><ul><li>tempF = sensor.getCurrentTemperature(); </li></ul></ul></ul><ul><ul><ul><li>//Convert Fahreneit to Celsius degrees </li></ul></ul></ul><ul><ul><ul><li>return (tempF-32.0)*(5.0/9.0); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>Resultado não determinístico Classe City não existe public interface City { Sensor getSensor(); } // Nesta versão de jMock só faz &quot;mocks&quot; de interfaces public interface Sensor { double getCurrentTemperature();} Não implementados!
  15. 15. Exemplo com jMock 2 – código de teste import org.jmock.integration.junit3.MockObjectTestCase; import org.jmock.Expectations; public class JMockTestConvert extends MockObjectTestCase { // set up final City mockCity = mock(City. class ) ; final Sensor mockSensor = mock(Sensor. class ); public void testGetTemperatureInCelcius() { // expectations checking( new Expectations() {{ one( mockCity ).getSensor(); will(returnValue( mockSensor )); one( mockSensor ).getCurrentTemperature(); will(returnValue(72.5)) ; }}); // execute double result = Convert. getTemperatureInCelcius ( mockCity ); // test assertEquals (22.5, result); } }
  16. 16. Exercício <ul><li>Com base na rotina de conversão de um número para extenso (ver “Extensos.java”), desenvolver (segundo a abordagem TDD) na mesma classe Extensos uma método estático MoneyExt(double m, Currency c) para converter um valor monetário m para extenso em maiúsculas. O 2º argumento é uma instância de uma interface que define métodos para obter a designação por extenso da unidade monetária e fracções no singular e plural (exemplo: euro, euros, cêntimo, cêntimos), bem como o número de dígitos a usar na parte fraccionária (exemplo: 2), de acordo com a seguinte sintaxe (em Java usar String em vez de string): public interface Currency { string getCurrencyNamePlural(); string getCurrencyNameSingular(); string getFractionsNameSingular(); string getFractionsNamePlural(); int getFractionsDigits(); } Criar uma mock class MockCurrency que implementa a interface Currency só para efeitos de teste. </li></ul><ul><li>Repetir usando um framework como o jMock, em vez de criar uma mock class </li></ul>
  17. 17. Referências e mais informação <ul><li>www.jmock.org </li></ul><ul><li>www.mockobjects.com </li></ul>

×