A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

(baseado em slides de ex-alunos)

Apresentações semelhantes


Apresentação em tema: "(baseado em slides de ex-alunos)"— Transcrição da apresentação:

1 (baseado em slides de ex-alunos)
TQS - Teste e Qualidade de Software (Software Testing and Quality) Mock Objects João Pascoal Faria (baseado em slides de ex-alunos)

2 Índice Definição Quando usar Detalhes técnicos Exemplo prático
Frameworks Exemplo com jMock 2

3 Definição Objectos simulados que imitam o comportamento de objectos reais de um modo controlado [wikipedia] Criam-se para fazer testes ao comportamento de outros objectos Tal como os crash test dummies são usados nos testes de automóveis

4 Quando usar Quando o objecto real... ainda não existe
retorna um resultado não determinístico Hora Actual, Temperatura Actual tem estados difíceis de atingir um erro da rede precisa de incluir informação e métodos exclusivamente para uso nos testes e não para a sua tarefa é lento uma base de dados completa que tenha que ser inicializada antes do teste

5 Detalhes técnicos Permitir que o objecto que o invoca não saiba se está a usar um objecto real ou um mock object Têm a mesma interface que os objectos que simulam Ambos implementam a mesma interface Mock object estende objecto real

6 Resultado não determinístico
Exemplo prático public class Convert { public static double getTemperatureInCelcius(City city){ double tempF; Sensor sensor = city.getSensor(); tempF = sensor.getCurrentTemperature(); //Convert Fahreneit to Celsius degrees return (tempF-32.0)*(5.0/9.0); } Classe City não existe Resultado não determinístico

7 Exemplo prático (continuação)
public class Convert { public static double getTemperatureInCelcius(City city){ double tempF; Sensor sensor = city.getSensor(); tempF = sensor.getCurrentTemperature(); return (tempF-32.0)*(5.0/9.0); } public class MockSensor extends Sensor { public double getCurrentTemperature() { //MOCK return 72.5; } Resultado conhecido (=22.5ºC)

8 Exemplo prático (continuação)
public class Convert { public static double getTemperatureInCelcius(City city){ double tempF; Sensor sensor = city.getSensor(); tempF = sensor.getCurrentTemperature(); return (tempF-32.0)*(5.0/9.0); } public class MockCity implements City { private Sensor curSensor; public Sensor getSensor() { //MOCK return curSensor; } public void setSensor(Sensor s){ this.curSensor = s; Escrever método para controlar valor de retorno

9 Exemplo prático (continuação)
public class TestConvert extends TestCase { public void testGetTemperatureInCelcius() { MockCity city = new MockCity(); MockSensor sensor = new MockSensor(); city.setSensor(sensor); assertEquals(22.5, Convert.getTemperatureInCelcius(city)); }

10 Em suma… Escrever classes mock Estender classe real
Implementar interface Implementar todos os seus métodos Reescrever (overwrite) os métodos a simular Criar e executar teste

11 Frameworks Facilitam e tornam mais rápida a criação dos Mock Objects
Não é necessário escrever o código das classes mock Permitem criação a partir de: Interfaces Classes Permitem definir expectativas flexíveis Número de chamadas a métodos Valores de retorno Valores dos parâmetros Lançamento de excepções Integram com JUnit (Java), NUnit (.Net), etc. Fornecem normalmente APIs extensíveis

12 Frameworks Java C# jMock (http://www.jmock.org)
EasyMock ( rMock ( MockCreator ( MockLib ( C# MockLib ( Rhino Mocks ( NMock (

13 Frameworks Ruby Outras linguagens Mocha (http://mocha.rubyforge.org)
RSpec ( FlexMock ( Outras linguagens C++ Javascript Perl Python ActionScript

14 Exemplo com jMock 2 – código a testar
Classe City não existe public class Convert { public static double getTemperatureInCelcius(City city){ double tempF; Sensor sensor = city.getSensor(); tempF = sensor.getCurrentTemperature(); //Convert Fahreneit to Celsius degrees return (tempF-32.0)*(5.0/9.0); } Resultado não determinístico public interface City { Sensor getSensor(); } Não implementados! // Nesta versão de jMock só faz "mocks" de interfaces public interface Sensor {double getCurrentTemperature();}

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 Exercício 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. Repetir usando um framework como o jMock, em vez de criar uma mock class

17 Referências e mais informação


Carregar ppt "(baseado em slides de ex-alunos)"

Apresentações semelhantes


Anúncios Google