Successfully reported this slideshow.
29ª Reunião Lisboa - 26/05/2012   http://netponto.org   Utilização de Mock Objects em Testes Unitários                    ...
Patrocinador “GOLD”
Patrocinadores “Silver”
Nuno CanecoConsultor Sénior na |create|it|Áreas de interesse:• SOA e Integração• WCF• desenvolvimento core• Dependency Inj...
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 ac...
Testes unitários• Objectivo:  – Testar a lógica de um método de forma isolada, tendo    em conta os vários inputs possívei...
Exemplo [TestClass] public class SaleRecordsReaderTest {     private SaleRecordsReader GetReader()     {         return ne...
Alguns impedimentos e dificuldades• UI: É difícil de testar código de interface   – HTML/Javascript• Acessibilidade   – do...
Mitos• “O meu código é perfeito!! Não é preciso testar.”• “Não vale a pena fazer testes unitários. Basta clicar naquele li...
Mitos• “O meu código é perfeito!! Não é preciso testar.”• “Não vale a pena fazer testes unitários. Basta clicar naquele li...
Motivação   Sistema                                      Serviços                                      Business           ...
Mocks com unit testsIn object-oriented programming, mock objects aresimulated objects that mimic the behavior of realobjec...
Estratégia de implementação1.     Gerar mock     – Usar framework de mocking para gerar mocks das dependências da classe a...
E que tal um exemplo?                   CustomerManager       ICustomerReader           IInvoiceReader       CustomerReade...
E que tal um exemplo?                   CustomerManager       ICustomerReader           IInvoiceReader       CustomerReade...
E que tal um exemplo?                   CustomerManager       ICustomerReader           IInvoiceReader       CustomerReade...
E que tal um exemplo?                   CustomerManager       ICustomerReader           IInvoiceReader       CustomerReade...
E que tal um exemplo? CustomerManagerTest               CustomerManager                       ICustomerReader           II...
E que tal um exemplo?    CustomerManagerTest               CustomerManager                          ICustomerReader       ...
E que tal um exemplo?    CustomerManagerTest               CustomerManager                          ICustomerReader       ...
E que tal um exemplo?    CustomerManagerTest               CustomerManager                          ICustomerReader       ...
E que tal um exemplo?    CustomerManagerTest               CustomerManager                          ICustomerReader       ...
O objectivo• Evitar dependências  – Dados (base-de-dados, configuração, …)  – Estado de sistemas externos (CRM, ERP, …)  –...
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)...
Caso de usohttps://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• Con...
Dependency Injection• Substituição das dependências é  automática• Evita múltiplos construtores das classes a  testar• Cód...
Técnica:Mocks de dependências directas    CustomerManagerTest               CustomerManager                          ICust...
Técnica:Mock das fronteiras    Sistema                                          Serviços                                  ...
Dicas• Classe de teste junto à classe testada   – Ajuda a lembrar que existem testes   – Utilizar #if para não compilar te...
Prós e contras  + confiança no código             Testes têm que ser mantidos  + confiança em                    O cód...
ReferênciasRhino mocks  – http://hibernatingrhinos.com/open-source/rhino-mocksDemo  – https://github.com/nmcc/unit-test-mo...
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 – JulhoRese...
Obrigado!Nuno CanecoMail/MSN: nuno.caneco@create.ptBlog: http://blogit.create.pt/blogs/nunocaneco/Twitter: @NunoCanecoGame...
Upcoming SlideShare
Loading in …5
×

Utilização de Mock Objects em Testes Unitários

3,438 views

Published on

Apresentação do Nuno Caneco sobre Utilização de Mock Objects em Testes Unitários na 29a Reunião Presencial da Comunidade NetPonto em Lisboa (http://netponto.org).

Published in: Technology
  • Be the first to comment

Utilização de Mock Objects em Testes Unitários

  1. 1. 29ª Reunião Lisboa - 26/05/2012 http://netponto.org Utilização de Mock Objects em Testes Unitários Nuno Caneco
  2. 2. Patrocinador “GOLD”
  3. 3. Patrocinadores “Silver”
  4. 4. Nuno CanecoConsultor Sénior na |create|it|Áreas de interesse:• SOA e Integração• WCF• desenvolvimento core• Dependency Injection.
  5. 5. Agenda• Unit tests• Mocking frameworks• Demo• Considerações de arquitectura• Dicas
  6. 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. 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. 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. 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. 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. 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. 12. Motivação Sistema Serviços Business DAL/RAL Sistemas externos BD
  13. 13. Mocks com unit testsIn object-oriented programming, mock objects aresimulated objects that mimic the behavior of realobjects in controlled ways.A computer programmer typically creates a mock object to test thebehavior of some other object, in much the same way that a cardesigner uses a crash test dummy to simulate the dynamic behavior ofa human in vehicle impacts. http://en.wikipedia.org/wiki/Mock_object
  14. 14. Estratégia de implementação1. Gerar mock – Usar framework de mocking para gerar mocks das dependências da classe a testar2. 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ções4. Aferir o comportamento da classe em teste
  15. 15. E que tal um exemplo? CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  16. 16. E que tal um exemplo? CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  17. 17. E que tal um exemplo? CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  18. 18. E que tal um exemplo? CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  19. 19. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReader CustomerReader InvoiceReader
  20. 20. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReaderCustomerReaderMock CustomerReader InvoiceReader invoiceReaderMock
  21. 21. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReaderCustomerReaderMock CustomerReader InvoiceReader invoiceReaderMock
  22. 22. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReaderCustomerReaderMock CustomerReader InvoiceReader invoiceReaderMock
  23. 23. E que tal um exemplo? CustomerManagerTest CustomerManager ICustomerReader IInvoiceReaderCustomerReaderMock CustomerReader InvoiceReader invoiceReaderMockOs mocks substituem as classes reais no contexto de um teste unitário
  24. 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. 25. Aplicabilidade• A todo o código C# que seja testável –Serviços WCF –Aplicações MVC –Aplicações WPF –…
  26. 26. Frameworks de mocking• Microsoft Moles (Fakes no VS11)• NMock• EasyMock.NET• TypeMock Isolator (Commercial / Paid)• Rhino Mocks• Moq• NSubstitute• JustMock (Commercial / Paid)• FakeItEasy
  27. 27. Caso de usohttps://github.com/nmcc/unit-test-mock-demo
  28. 28. Questões?
  29. 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. 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. 31. Técnica:Mocks de dependências directas CustomerManagerTest CustomerManager ICustomerReader IInvoiceReaderCustomerReaderMock CustomerReader InvoiceReader InvoiceReaderMock
  32. 32. Técnica:Mock das fronteiras Sistema Serviços Business DAL/RAL Sistemas externos BD
  33. 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. 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. 35. ReferênciasRhino mocks – http://hibernatingrhinos.com/open-source/rhino-mocksDemo – https://github.com/nmcc/unit-test-mock-demo
  36. 36. Patrocinador “GOLD”
  37. 37. Patrocinadores “Silver”
  38. 38. Questões?
  39. 39. Próximas reuniões presenciais• 26-05-2012 – Maio• 02-06-2012 – Junho (Coimbra)• 16-06-2012 – Junho• 21-07-2012 – JulhoReserva estes dias na agenda! :)
  40. 40. Obrigado!Nuno CanecoMail/MSN: nuno.caneco@create.ptBlog: http://blogit.create.pt/blogs/nunocaneco/Twitter: @NunoCanecoGamertag: nunocaneco

×