SlideShare ist ein Scribd-Unternehmen logo
1 von 40
29ª Reunião Lisboa - 26/05/2012   http://netponto.org




   Utilização de Mock Objects em Testes Unitários
                                      Nuno Caneco
Patrocinador “GOLD”
Patrocinadores “Silver”
Nuno Caneco
Consultor Sénior na |create|it|

Áreas de interesse:
• SOA e Integração
• WCF
• desenvolvimento core
• Dependency Injection.
Agenda
•   Unit tests
•   Mocking frameworks
•   Demo
•   Considerações de arquitectura
•   Dicas
Testes e mais testes…
Testes de performance     Testes de sistema

   Testes de carga      Testes de usabilidade

 Testes de aceitação      Testes funcionais

   Testes unitários     Testes de segurança

 Testes de integração
Testes unitários
• Objectivo:
  – Testar a lógica de um método de forma isolada, tendo
    em conta os vários inputs possíveis e tendo em
    atenção casos de fronteira e valores inválidos.

• Características:
  – Repetíveis
  – Idempotentes
  – Não depender de outros testes
  – Inócuos
Exemplo
 [TestClass]
 public class SaleRecordsReaderTest
 {
     private SaleRecordsReader GetReader()
     {
         return new SaleRecordsReader();
     }

     [TestMethod]
     public void ListSaleRecordTest()
     {
         var reader = GetReader();

         var saleRecords = reader.ListSaleRecords();

         Assert.IsNotNull(saleRecords);
         Assert.IsTrue(saleRecords.Count > 0);
     }
 }
Alguns impedimentos e dificuldades
• UI: É difícil de testar código de interface
   – HTML/Javascript
• Acessibilidade
   – dos métodos: private, protected
   – da classe: internal
• Dependências
   – Persistência: BD, Lista de SharePoint
   – Sistemas externos
   – Utilização de providers: Membership providers, …
• Classes binded a determinados contextos
   – Ex.: CodeBehind de páginas .ASPX
Mitos
• “O meu código é perfeito!! Não é preciso testar.”

• “Não vale a pena fazer testes unitários. Basta clicar naquele link e
  pronto… Está testado!”

• “O projecto precisa de tempo para fazer testes unitários”

• “Eh pá… tenho que ter uma BD com dados de teste…”

• “Tenho muitas dependências. Não é possível abstrair-me dos
  sistemas externos”
Mitos
• “O meu código é perfeito!! Não é preciso testar.”

• “Não vale a pena fazer testes unitários. Basta clicar naquele link e
  pronto… Está testado!”

• “O projecto precisa de tempo para fazer testes unitários”

• “Eh pá… tenho que ter uma BD com dados de teste…”

• “Tenho muitas dependências. Não é possível abstrair-me dos
  sistemas externos”
Motivação
   Sistema
                                      Serviços



                                      Business



                                      DAL/RAL




                  Sistemas externos
             BD
Mocks com unit tests
In object-oriented programming, mock objects are
simulated objects that mimic the behavior of real
objects in controlled ways.

A computer programmer typically creates a mock object to test the
behavior of some other object, in much the same way that a car
designer uses a crash test dummy to simulate the dynamic behavior of
a human in vehicle impacts.



                        http://en.wikipedia.org/wiki/Mock_object
Estratégia de implementação
1.     Gerar mock
     – Usar framework de mocking para gerar mocks das dependências da classe a
       testar

2.     Substituir dependência pelo mock
     – Inicializar classe a ser testada com o mock em substituição da implementação
       “real”

3.     Programa o comportamento do mock
     – Programar os mocks para retornar determinados outputs em função dos inputs
         • Valores de retorno
         • Excepções

4.     Aferir o comportamento da classe em teste
E que tal um exemplo?
                   CustomerManager




       ICustomerReader           IInvoiceReader



       CustomerReader            InvoiceReader
E que tal um exemplo?
                   CustomerManager




       ICustomerReader           IInvoiceReader



       CustomerReader            InvoiceReader
E que tal um exemplo?
                   CustomerManager




       ICustomerReader           IInvoiceReader



       CustomerReader            InvoiceReader
E que tal um exemplo?
                   CustomerManager




       ICustomerReader           IInvoiceReader



       CustomerReader            InvoiceReader
E que tal um exemplo?
 CustomerManagerTest               CustomerManager




                       ICustomerReader           IInvoiceReader



                       CustomerReader            InvoiceReader
E que tal um exemplo?
    CustomerManagerTest               CustomerManager




                          ICustomerReader           IInvoiceReader


CustomerReaderMock        CustomerReader            InvoiceReader    invoiceReaderMock
E que tal um exemplo?
    CustomerManagerTest               CustomerManager




                          ICustomerReader           IInvoiceReader


CustomerReaderMock        CustomerReader            InvoiceReader    invoiceReaderMock
E que tal um exemplo?
    CustomerManagerTest               CustomerManager




                          ICustomerReader           IInvoiceReader


CustomerReaderMock        CustomerReader            InvoiceReader    invoiceReaderMock
E que tal um exemplo?
    CustomerManagerTest               CustomerManager




                          ICustomerReader           IInvoiceReader


CustomerReaderMock        CustomerReader            InvoiceReader       invoiceReaderMock




Os mocks substituem as classes reais no contexto de um teste unitário
O objectivo
• Evitar dependências
  – Dados (base-de-dados, configuração, …)
  – Estado de sistemas externos (CRM, ERP, …)
  – Contas de utilizador
  – Setup de ambientes com dados de teste

• Testar vários cenários de negócio e condições de
  fronteira
  – Nulos, valores inválidos, decisões em função de valores
    específicos
Aplicabilidade
• A todo o código C# que seja testável
  –Serviços WCF
  –Aplicações MVC
  –Aplicações WPF
  –…
Frameworks de mocking
•   Microsoft Moles (Fakes no VS11)
•   NMock
•   EasyMock.NET
•   TypeMock Isolator (Commercial / Paid)
•   Rhino Mocks
•   Moq
•   NSubstitute
•   JustMock (Commercial / Paid)
•   FakeItEasy
Caso de uso
https://github.com/nmcc/unit-test-mock-demo
Questões?
Considerações de arquitectura
• É necessário fazer override do método .Equals() para os
  objectos de input dos métodos

• Construtor que receba as interfaces das dependências

• Todas as dependências devem ser declaradas como
  interfaces
   – Usar “Ctrl+R, I” para gerar interfaces automaticamente

• É conveniente que os testes herdem de uma classe base
  que contém os mocks
Dependency Injection
• Substituição das dependências é
  automática

• Evita múltiplos construtores das classes a
  testar

• Código de inicialização do container fica na
  classe base de testes
Técnica:
Mocks de dependências directas
    CustomerManagerTest               CustomerManager




                          ICustomerReader           IInvoiceReader


CustomerReaderMock        CustomerReader            InvoiceReader    InvoiceReaderMock
Técnica:
Mock das fronteiras
    Sistema
                                          Serviços



                                          Business



                                          DAL/RAL




                      Sistemas externos
              BD
Dicas
• Classe de teste junto à classe testada
   – Ajuda a lembrar que existem testes
   – Utilizar #if para não compilar testes em Release

• Mock das fronteiras da aplicação
   – Permite atingir coverage elevada com menor número de testes

• Usar uma classe base para declarar os mocks

• Usar dependency injection
   – Permite injectar automaticamente os mocks numa classe base
   – Evitando a repetição da criação dos mocks pelas várias classes de teste
Prós e contras

  + confiança no código             Testes têm que ser mantidos
  + confiança em                    O código pode ter que ser
   refactorizações                    estruturado para ser testável
  Minimiza testes funcionais        Nem todo o código é testável
  Utilização de mocks
   “descomplica” testes unitários
  Execução automatizada com
   integração contínua
Referências
Rhino mocks
  – http://hibernatingrhinos.com/open-source/rhino-mocks


Demo
  – https://github.com/nmcc/unit-test-mock-demo
Patrocinador “GOLD”
Patrocinadores “Silver”
Questões?
Próximas reuniões presenciais
• 26-05-2012 – Maio
• 02-06-2012 – Junho (Coimbra)
• 16-06-2012 – Junho
• 21-07-2012 – Julho

Reserva estes dias na agenda! :)
Obrigado!
Nuno Caneco
Mail/MSN: nuno.caneco@create.pt
Blog: http://blogit.create.pt/blogs/nunocaneco/
Twitter: @NunoCaneco
Gamertag: nunocaneco

Weitere ähnliche Inhalte

Ähnlich wie Mock Objects em Testes Unitários

Palestra GUTS - Viabilidade da Automacao Teste Software e Demo QTP
Palestra GUTS - Viabilidade da Automacao Teste Software e Demo QTPPalestra GUTS - Viabilidade da Automacao Teste Software e Demo QTP
Palestra GUTS - Viabilidade da Automacao Teste Software e Demo QTPPriscila Coelho S. Blauth
 
[Karla e Larissa] Agile Brazil 2018
[Karla e Larissa] Agile Brazil 2018[Karla e Larissa] Agile Brazil 2018
[Karla e Larissa] Agile Brazil 2018Larissa Soares
 
Cobertura de Código: Testes de Unidade
Cobertura de Código: Testes de UnidadeCobertura de Código: Testes de Unidade
Cobertura de Código: Testes de UnidadeThiago Bertuzzi
 
Agile Brazil 2018
Agile Brazil 2018Agile Brazil 2018
Agile Brazil 2018Karla Silva
 
ERES 2018 - Microserviços: Desafios para Lidar com a Qualidade
ERES 2018 - Microserviços: Desafios para Lidar com a QualidadeERES 2018 - Microserviços: Desafios para Lidar com a Qualidade
ERES 2018 - Microserviços: Desafios para Lidar com a QualidadeAndré Abe Vicente
 
BaixadaTech 2012 - Qualidade de Software
BaixadaTech 2012 - Qualidade de SoftwareBaixadaTech 2012 - Qualidade de Software
BaixadaTech 2012 - Qualidade de SoftwareAdriano Bertucci
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifaguestea329c
 
Automação de Teste - BRATESTE 2010
Automação de Teste - BRATESTE 2010Automação de Teste - BRATESTE 2010
Automação de Teste - BRATESTE 2010Elias Nogueira
 
Construindo um micro-serviço Java 100% funcional em 15 minutos
Construindo um micro-serviço Java 100% funcional em 15 minutosConstruindo um micro-serviço Java 100% funcional em 15 minutos
Construindo um micro-serviço Java 100% funcional em 15 minutosRafael Chaves
 
Testes Unitários - 1 Sessão beiraJUG
Testes Unitários - 1 Sessão beiraJUGTestes Unitários - 1 Sessão beiraJUG
Testes Unitários - 1 Sessão beiraJUGbeiraJUG
 
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu SoftwareDevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu SoftwareAndré Dias
 
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...minastestingconference
 
Importância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsImportância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsSamanta Cicilia
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...Isaac de Souza
 
Automação de testes - uma introdução sobre estratégias
Automação de testes - uma introdução sobre estratégiasAutomação de testes - uma introdução sobre estratégias
Automação de testes - uma introdução sobre estratégiasKleitor Franklint Correa Araujo
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Softwarejamersonlima
 

Ähnlich wie Mock Objects em Testes Unitários (20)

Palestra GUTS - Viabilidade da Automacao Teste Software e Demo QTP
Palestra GUTS - Viabilidade da Automacao Teste Software e Demo QTPPalestra GUTS - Viabilidade da Automacao Teste Software e Demo QTP
Palestra GUTS - Viabilidade da Automacao Teste Software e Demo QTP
 
[Karla e Larissa] Agile Brazil 2018
[Karla e Larissa] Agile Brazil 2018[Karla e Larissa] Agile Brazil 2018
[Karla e Larissa] Agile Brazil 2018
 
Cobertura de Código: Testes de Unidade
Cobertura de Código: Testes de UnidadeCobertura de Código: Testes de Unidade
Cobertura de Código: Testes de Unidade
 
Agile Brazil 2018
Agile Brazil 2018Agile Brazil 2018
Agile Brazil 2018
 
ERES 2018 - Microserviços: Desafios para Lidar com a Qualidade
ERES 2018 - Microserviços: Desafios para Lidar com a QualidadeERES 2018 - Microserviços: Desafios para Lidar com a Qualidade
ERES 2018 - Microserviços: Desafios para Lidar com a Qualidade
 
BaixadaTech 2012 - Qualidade de Software
BaixadaTech 2012 - Qualidade de SoftwareBaixadaTech 2012 - Qualidade de Software
BaixadaTech 2012 - Qualidade de Software
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Automação de Teste - BRATESTE 2010
Automação de Teste - BRATESTE 2010Automação de Teste - BRATESTE 2010
Automação de Teste - BRATESTE 2010
 
Construindo um micro-serviço Java 100% funcional em 15 minutos
Construindo um micro-serviço Java 100% funcional em 15 minutosConstruindo um micro-serviço Java 100% funcional em 15 minutos
Construindo um micro-serviço Java 100% funcional em 15 minutos
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
Testes Unitários - 1 Sessão beiraJUG
Testes Unitários - 1 Sessão beiraJUGTestes Unitários - 1 Sessão beiraJUG
Testes Unitários - 1 Sessão beiraJUG
 
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu SoftwareDevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
DevOps Summit Brasil: +10 Ferramentas para Melhorar a Qualidade do seu Software
 
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
Samanta Cicilia - MTC - Importância de Testes Automatizados para Continuous D...
 
Importância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOpsImportância de Testes Automatizados para Continuous Delivery & DevOps
Importância de Testes Automatizados para Continuous Delivery & DevOps
 
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
O que seus testes garantem, o funcionamento do código ou das funcionalidades ...
 
Asp.Net Mvc Dev Days09 V3 Pt
Asp.Net Mvc Dev Days09 V3 PtAsp.Net Mvc Dev Days09 V3 Pt
Asp.Net Mvc Dev Days09 V3 Pt
 
Automação de testes - uma introdução sobre estratégias
Automação de testes - uma introdução sobre estratégiasAutomação de testes - uma introdução sobre estratégias
Automação de testes - uma introdução sobre estratégias
 
Arquitetura de Software
Arquitetura de SoftwareArquitetura de Software
Arquitetura de Software
 
Macro Arquitetura de Software
Macro Arquitetura de SoftwareMacro Arquitetura de Software
Macro Arquitetura de Software
 

Mehr von Comunidade NetPonto

Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Comunidade NetPonto
 
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Comunidade NetPonto
 
MVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaMVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaComunidade NetPonto
 
Deep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaDeep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaComunidade NetPonto
 
The power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloThe power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloComunidade NetPonto
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoComunidade NetPonto
 
NoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazNoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazComunidade NetPonto
 
De Zero a Produção - João Jesus
De Zero a Produção - João JesusDe Zero a Produção - João Jesus
De Zero a Produção - João JesusComunidade NetPonto
 
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComo deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComunidade NetPonto
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsComunidade NetPonto
 
Aspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpAspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpComunidade NetPonto
 
Dinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoDinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoComunidade NetPonto
 
KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realComunidade NetPonto
 
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
 
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteWindows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteComunidade NetPonto
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8Comunidade NetPonto
 

Mehr von Comunidade NetPonto (20)

Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
 
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
 
MVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaMVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara Silva
 
Deep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaDeep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo Costa
 
The power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloThe power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno Cancelo
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis Paulino
 
ASP.NET Signal R - Glauco Godoi
ASP.NET Signal R - Glauco GodoiASP.NET Signal R - Glauco Godoi
ASP.NET Signal R - Glauco Godoi
 
NoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazNoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor Tomaz
 
HTML5 - Pedro Rosa
HTML5 - Pedro RosaHTML5 - Pedro Rosa
HTML5 - Pedro Rosa
 
De Zero a Produção - João Jesus
De Zero a Produção - João JesusDe Zero a Produção - João Jesus
De Zero a Produção - João Jesus
 
OData – Super Cola W3
OData – Super Cola W3OData – Super Cola W3
OData – Super Cola W3
 
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComo deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store Apps
 
Aspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpAspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharp
 
Dinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoDinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de Projecto
 
KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida real
 
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
 
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteWindows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
Como não entalar os dedos nas janelas: Finger-based apps no Windows 8
 

Mock Objects em Testes Unitários

  • 1. 29ª Reunião Lisboa - 26/05/2012 http://netponto.org Utilização de Mock Objects em Testes Unitários Nuno Caneco
  • 4. Nuno Caneco Consultor Sénior na |create|it| Áreas de interesse: • SOA e Integração • WCF • desenvolvimento core • Dependency Injection.
  • 5. Agenda • Unit tests • Mocking frameworks • Demo • Considerações de arquitectura • Dicas
  • 6. Testes e mais testes… Testes de performance Testes de sistema Testes de carga Testes de usabilidade Testes de aceitação Testes funcionais Testes unitários Testes de segurança Testes de integração
  • 7. Testes unitários • Objectivo: – Testar a lógica de um método de forma isolada, tendo em conta os vários inputs possíveis e tendo em atenção casos de fronteira e valores inválidos. • Características: – Repetíveis – Idempotentes – Não depender de outros testes – Inócuos
  • 8. Exemplo [TestClass] public class SaleRecordsReaderTest { private SaleRecordsReader GetReader() { return new SaleRecordsReader(); } [TestMethod] public void ListSaleRecordTest() { var reader = GetReader(); var saleRecords = reader.ListSaleRecords(); Assert.IsNotNull(saleRecords); Assert.IsTrue(saleRecords.Count > 0); } }
  • 9. Alguns impedimentos e dificuldades • UI: É difícil de testar código de interface – HTML/Javascript • Acessibilidade – dos métodos: private, protected – da classe: internal • Dependências – Persistência: BD, Lista de SharePoint – Sistemas externos – Utilização de providers: Membership providers, … • Classes binded a determinados contextos – Ex.: CodeBehind de páginas .ASPX
  • 10. Mitos • “O meu código é perfeito!! Não é preciso testar.” • “Não vale a pena fazer testes unitários. Basta clicar naquele link e pronto… Está testado!” • “O projecto precisa de tempo para fazer testes unitários” • “Eh pá… tenho que ter uma BD com dados de teste…” • “Tenho muitas dependências. Não é possível abstrair-me dos sistemas externos”
  • 11. Mitos • “O meu código é perfeito!! Não é preciso testar.” • “Não vale a pena fazer testes unitários. Basta clicar naquele link e pronto… Está testado!” • “O projecto precisa de tempo para fazer testes unitários” • “Eh pá… tenho que ter uma BD com dados de teste…” • “Tenho muitas dependências. Não é possível abstrair-me dos sistemas externos”
  • 12. Motivação Sistema Serviços Business DAL/RAL Sistemas externos BD
  • 13. Mocks com unit tests In object-oriented programming, mock objects are simulated objects that mimic the behavior of real objects in controlled ways. A computer programmer typically creates a mock object to test the behavior of some other object, in much the same way that a car designer uses a crash test dummy to simulate the dynamic behavior of a human in vehicle impacts. http://en.wikipedia.org/wiki/Mock_object
  • 14. Estratégia de implementação 1. Gerar mock – Usar framework de mocking para gerar mocks das dependências da classe a testar 2. Substituir dependência pelo mock – Inicializar classe a ser testada com o mock em substituição da implementação “real” 3. Programa o comportamento do mock – Programar os mocks para retornar determinados outputs em função dos inputs • Valores de retorno • Excepções 4. Aferir o comportamento da classe em teste
  • 15. E que tal um exemplo? CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  • 16. E que tal um exemplo? CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  • 17. E que tal um exemplo? CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  • 18. E que tal um exemplo? CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  • 19. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  • 20. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReader CustomerReaderMock CustomerReader InvoiceReader invoiceReaderMock
  • 21. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReader CustomerReaderMock CustomerReader InvoiceReader invoiceReaderMock
  • 22. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReader CustomerReaderMock CustomerReader InvoiceReader invoiceReaderMock
  • 23. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReader CustomerReaderMock CustomerReader InvoiceReader invoiceReaderMock Os mocks substituem as classes reais no contexto de um teste unitário
  • 24. O objectivo • Evitar dependências – Dados (base-de-dados, configuração, …) – Estado de sistemas externos (CRM, ERP, …) – Contas de utilizador – Setup de ambientes com dados de teste • Testar vários cenários de negócio e condições de fronteira – Nulos, valores inválidos, decisões em função de valores específicos
  • 25. Aplicabilidade • A todo o código C# que seja testável –Serviços WCF –Aplicações MVC –Aplicações WPF –…
  • 26. Frameworks de mocking • Microsoft Moles (Fakes no VS11) • NMock • EasyMock.NET • TypeMock Isolator (Commercial / Paid) • Rhino Mocks • Moq • NSubstitute • JustMock (Commercial / Paid) • FakeItEasy
  • 29. Considerações de arquitectura • É necessário fazer override do método .Equals() para os objectos de input dos métodos • Construtor que receba as interfaces das dependências • Todas as dependências devem ser declaradas como interfaces – Usar “Ctrl+R, I” para gerar interfaces automaticamente • É conveniente que os testes herdem de uma classe base que contém os mocks
  • 30. Dependency Injection • Substituição das dependências é automática • Evita múltiplos construtores das classes a testar • Código de inicialização do container fica na classe base de testes
  • 31. Técnica: Mocks de dependências directas CustomerManagerTest CustomerManager ICustomerReader IInvoiceReader CustomerReaderMock CustomerReader InvoiceReader InvoiceReaderMock
  • 32. Técnica: Mock das fronteiras Sistema Serviços Business DAL/RAL Sistemas externos BD
  • 33. Dicas • Classe de teste junto à classe testada – Ajuda a lembrar que existem testes – Utilizar #if para não compilar testes em Release • Mock das fronteiras da aplicação – Permite atingir coverage elevada com menor número de testes • Usar uma classe base para declarar os mocks • Usar dependency injection – Permite injectar automaticamente os mocks numa classe base – Evitando a repetição da criação dos mocks pelas várias classes de teste
  • 34. Prós e contras  + confiança no código  Testes têm que ser mantidos  + confiança em  O código pode ter que ser refactorizações estruturado para ser testável  Minimiza testes funcionais  Nem todo o código é testável  Utilização de mocks “descomplica” testes unitários  Execução automatizada com integração contínua
  • 35. Referências Rhino mocks – http://hibernatingrhinos.com/open-source/rhino-mocks Demo – https://github.com/nmcc/unit-test-mock-demo
  • 39. Próximas reuniões presenciais • 26-05-2012 – Maio • 02-06-2012 – Junho (Coimbra) • 16-06-2012 – Junho • 21-07-2012 – Julho Reserva estes dias na agenda! :)
  • 40. Obrigado! Nuno Caneco Mail/MSN: nuno.caneco@create.pt Blog: http://blogit.create.pt/blogs/nunocaneco/ Twitter: @NunoCaneco Gamertag: nunocaneco

Hinweis der Redaktion

  1. Questões à audiência:Quemjá usou testes unitários?Quem AINDA usa testes unitários?Os testes unitários do projecto estão a passar?Quem usa técnicas de mocking?
  2. Passamos a vida a testar as nossas aplicaçõesTestes dependem deDimensão da aplicaçãoCriticidade para o negócioExposição da aplicação…
  3. Testes unitários:“quando entra o porco, sai a salsicha”Testes unitários: isolados, completos e condições de fronteiraTestes unitários vs testes de integração vsframework de testes unitários
  4. Com certeza estão familiarizados, mas para dar enquadramento:
  5. Levantar discussão sobre os mitos “Os mocks vêm ajudar”“pelo menos nos que não envolvem o ego dos programadores )PERGUNTA À AUDIÊNCIA: Revêem-se nestas afirmações?Preparar para motivação dos mocks
  6. Levantar discussão sobre os mitos “Os mocks vêm ajudar”“pelo menos nos que não envolvem o ego dos programadores )PERGUNTA À AUDIÊNCIA: Revêem-se nestas afirmações?Preparar para motivação dos mocks
  7. Passando a falar em mocksEstamos a construir um sistemaP.ex. 3 camadasQue necessita de componentes externasConstruimos classesE relações entre elasQueremos testar uma classeTestes unitários: testar a classe de forma isolada
  8. O objectivo dos mocks é substituir dependências por objectos simulados que imitam uma dependência real
  9. Preparar para demo
  10. REFERIR QUE DEMO ESTÁ NO GITHUB
  11. O teste unitário de cada classe utilizar mocks das dependências directas dessa classe.Abordagem mais purista
  12. Mockar as fronteiras do sistema permite maximizar a coverageImplementar testes nas camadas superiores da aplicaçãoImplementar menor número de testes
  13. Estas dicas são discutíveisResultam da minha experiência pessoalNão são verdade absoluta