Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Tdd Com Mock e Orientação a Objetos (PyNE 2015)

688 views

Published on

Palestra apresentada na Python Nordeste de 2015 em Natal, Rio Grande do Norte. A palestra fala sobre a estratégia de desenvolver projetos com orientação a objetos sendo estruturados a partir dos testes utilizando a estratégia de mocking.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Tdd Com Mock e Orientação a Objetos (PyNE 2015)

  1. 1. PyNE 2015 TDD com Mock e Orientação a Objetos Bernardo Fontes Natal/RN 16 de Maio de 2015
  2. 2. Só para dizer um oi! twitter.com/bbfontes github.com/berinhard garimpo.fm pessoas.cc bernardoxhc@gmail.com
  3. 3. github.com/berinhard/talks
  4. 4. Obrigado, Turicas!
  5. 5. Obrigado, Turicas!
  6. 6. Roteiro Básicos de Orientação a Objetos Test-driven Development (TDD) TDD Com Mocks Dúvidas
  7. 7. Básicos de Orientação a Objetos Não é fazer getter e setter
  8. 8. Orientação a Objetos? Estratégia de Design Definição de Estado Encapsulamento Colaboração com troca de Mensagens
  9. 9. S.O.L.I.D.
  10. 10. Exemplo Python fromdatetimeimportdate classTicket(object): def__init__(self,buyer,price,schedule_date): self.buyer=buyer self.price=price self.schedule_date=schedule_date defhas_expired(self): returndate.today()>self.schedule_date ############################# ticket=Ticket("Bernardo",10,date(2015,10,10)) ifnotticket.has_expired(): #processaticketválido
  11. 11. Referências
  12. 12. Object Mentor
  13. 13. Test-driven Development (TDD)
  14. 14. Primeiro o teste classTicket(TestCase): deftest_3_returns_fizz(self): self.assertEqual("fizz",fizz(3))
  15. 15. Primeira implementação deffoo(number): return"fizz" classTicket(TestCase): deftest_3_returns_fizz(self): self.assertEqual("fizz",fizz(3))
  16. 16. Coding Dojo!!!
  17. 17. Processo de Design
  18. 18. Design Emergente Refatoração Remoção de Acoplamentos Duplicidade
  19. 19. Exploração e Descoberta cansativo...
  20. 20. Sem Evidência do Design classTestTicketManager(TestCase): deftest_expire_ticket(self): ticket=Ticket.objects.create(id=30) self.assertFalse(ticket.expired) manager=TicketManager() manager.expire_ticket(ticket_id=30) ticket=Ticket.objects.get(id=30) self.assertTrue(ticket.expired)
  21. 21. Difícil de começar a testar no alto nível Infra vs Domínio
  22. 22. Referências
  23. 23. Curso TDD - J. B. Rainsberger
  24. 24. TDD com Mock
  25. 25. Mock Simulam funcionamento de objetos Respeitam API dos objetos Viabilizam maneira de fazer asserções
  26. 26. Foco do Domíno nas Mensagens Menos Estado e mais Colaboração
  27. 27. Implementação de Testes Top- Down
  28. 28. Need-Driven Development Código criado só se necessário
  29. 29. TODO List Recuperar Ingresso Expirá-lo Notificar Usuário
  30. 30. Entry Point classTestTicketManager(TestCase): deftest_expire_ticket(self): manager=TicketManager() manager.expire_ticket(ticket_id=30)
  31. 31. Recuperar Ingresso frommockimportMock classTestTicketManager(TestCase): deftest_expire_ticket(self): tickets_repository=Mock(TicketsRepository) tickets_repository.get_by_id.return_value=Ticket() manager=TicketManager(tickets_repository) manager.expire_ticket(ticket_id=30) tickets_repository.get_by_id.assert_called_once_with(30)
  32. 32. classTicketManager(object): def__init__(self,tickets_repository): self.repository=tickets_repository defexpire_ticket(self,ticket_id): self.repository.get_by_id(ticket_id) classTicket(object): pass classTicketsRepository(object): defget_by_id(self,id): "MustreturnaTicketobject" pass
  33. 33. Expirar Ingresso frommockimportMock classTestTicketManager(TestCase): deftest_expire_ticket(self): ticket=Mock(Ticket) tickets_repository=Mock(TicketsRepository) tickets_repository.get_by_id.return_value=ticket manager=TicketManager(tickets_repository) manager.expire_ticket(ticket_id=30) tickets_repository.get_by_id.assert_called_once_with(30) ticket.expire.assert_called_once_with()
  34. 34. classTicketManager(object): def__init__(self,tickets_repository): self.repository=tickets_repository defexpire_ticket(self,ticket_id): ticket=self.repository.get_by_id(ticket_id) ticket.expire() classTicket(object): defexpire(self): pass classTicketsRepository(object): defget_by_id(self,id): "MustreturnaTicketobject"
  35. 35. Notificar Usuário frommockimportMock classTestTicketManager(TestCase): deftest_expire_ticket(self): ticket=Mock(Ticket) tickets_repository=Mock(TicketsRepository) tickets_repository.get_by_id.return_value=ticket notificator=Mock(TicketNotificator) manager=TicketManager(tickets_repository,notificator) manager.expire_ticket(ticket_id=30) tickets_repository.get_by_id.assert_called_once_with(30) ticket.expire.assert_called_once_with() notificator.notify_expired.assert_called_once_with(ticket)
  36. 36. classTicketManager(object): def__init__(self,tickets_repository,notificator): self.repository=tickets_repository self.notificator=notificator defexpire_ticket(self,ticket_id): ticket=self.repository.get_by_id(ticket_id) ticket.expire() self.notificator.notify_expired(ticket) classTicket(object): defexpire(self): pass classTicketsRepository(object):
  37. 37. Respeito ao contrato é tudo Comportamentos de Entrada Comportamentos de Saída
  38. 38. Novos testes para garantir contrato e funcionamento unitário dos componentes
  39. 39. Referências
  40. 40. Mock Roles, not Objects
  41. 41. GOOS Guided By Tests
  42. 42. pip install mock
  43. 43. Dúvidas?
  44. 44. Obrigado! Bernardo Fontes twitter.com/bbfontes github.com/berinhard garimpo.fm pessoas.cc bernardoxhc@gmail.com

×