Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
PyNE 2015
TDD com Mock e Orientação a Objetos
Bernardo Fontes
Natal/RN
16 de Maio de 2015
Só para dizer um oi!
twitter.com/bbfontes
github.com/berinhard
garimpo.fm
pessoas.cc
bernardoxhc@gmail.com
github.com/berinhard/talks
Obrigado, Turicas!
Obrigado, Turicas!
Roteiro
Básicos de Orientação a
Objetos
Test-driven Development
(TDD)
TDD Com Mocks
Dúvidas
Básicos de Orientação a
Objetos
Não é fazer getter e setter
Orientação a
Objetos?
Estratégia de Design
Definição de Estado
Encapsulamento
Colaboração com troca de
Mensagens
S.O.L.I.D.
Exemplo Python
fromdatetimeimportdate
classTicket(object):
def__init__(self,buyer,price,schedule_date):
self.buyer=buyer
s...
Referências
Object Mentor
Test-driven Development (TDD)
Primeiro o teste
classTicket(TestCase):
deftest_3_returns_fizz(self):
self.assertEqual("fizz",fizz(3))
Primeira implementação
deffoo(number):
return"fizz"
classTicket(TestCase):
deftest_3_returns_fizz(self):
self.assertEqual(...
Coding Dojo!!!
Processo de Design
Design Emergente
Refatoração
Remoção de Acoplamentos
Duplicidade
Exploração e Descoberta
cansativo...
Sem Evidência do Design
classTestTicketManager(TestCase):
deftest_expire_ticket(self):
ticket=Ticket.objects.create(id=30)...
Difícil de começar a testar no
alto nível
Infra vs Domínio
Referências
Curso TDD - J. B. Rainsberger
TDD com Mock
Mock
Simulam funcionamento de objetos
Respeitam API dos objetos
Viabilizam maneira de fazer asserções
Foco do Domíno nas
Mensagens
Menos Estado e mais Colaboração
Implementação de Testes Top-
Down
Need-Driven Development
Código criado só se necessário
TODO List
Recuperar Ingresso
Expirá-lo
Notificar Usuário
Entry Point
classTestTicketManager(TestCase):
deftest_expire_ticket(self):
manager=TicketManager()
manager.expire_ticket(t...
Recuperar Ingresso
frommockimportMock
classTestTicketManager(TestCase):
deftest_expire_ticket(self):
tickets_repository=Mo...
classTicketManager(object):
def__init__(self,tickets_repository):
self.repository=tickets_repository
defexpire_ticket(self...
Expirar Ingresso
frommockimportMock
classTestTicketManager(TestCase):
deftest_expire_ticket(self):
ticket=Mock(Ticket)
tic...
classTicketManager(object):
def__init__(self,tickets_repository):
self.repository=tickets_repository
defexpire_ticket(self...
Notificar Usuário
frommockimportMock
classTestTicketManager(TestCase):
deftest_expire_ticket(self):
ticket=Mock(Ticket)
ti...
classTicketManager(object):
def__init__(self,tickets_repository,notificator):
self.repository=tickets_repository
self.noti...
Respeito ao contrato é tudo
Comportamentos de Entrada
Comportamentos de Saída
Novos testes para garantir
contrato e funcionamento
unitário dos componentes
Referências
Mock Roles, not Objects
GOOS Guided By Tests
pip install mock
Dúvidas?
Obrigado!
Bernardo Fontes
twitter.com/bbfontes
github.com/berinhard
garimpo.fm
pessoas.cc
bernardoxhc@gmail.com
Tdd Com Mock e Orientação a Objetos (PyNE 2015)
Tdd Com Mock e Orientação a Objetos (PyNE 2015)
Tdd Com Mock e Orientação a Objetos (PyNE 2015)
Prochain SlideShare
Chargement dans…5
×

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

725 vues

Publié le

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.

Publié dans : Technologie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

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

×