SlideShare ist ein Scribd-Unternehmen logo
1 von 47
Downloaden Sie, um offline zu lesen
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
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
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("fizz",fizz(3))
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)
self.assertFalse(ticket.expired)
manager=TicketManager()
manager.expire_ticket(ticket_id=30)
ticket=Ticket.objects.get(id=30)
self.assertTrue(ticket.expired)
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(ticket_id=30)
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)
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
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()
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"
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)
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):
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

Weitere ähnliche Inhalte

Mehr von Bernardo Fontes

Melhorando Testes No Django Com O Model Mommy
Melhorando Testes No Django Com O Model MommyMelhorando Testes No Django Com O Model Mommy
Melhorando Testes No Django Com O Model MommyBernardo Fontes
 
Crawleando a web feito gente grande com o scrapy
Crawleando a web feito gente grande com o scrapyCrawleando a web feito gente grande com o scrapy
Crawleando a web feito gente grande com o scrapyBernardo Fontes
 
Aprenda a programar direito: pergunte-me como ii
Aprenda a programar direito:  pergunte-me como iiAprenda a programar direito:  pergunte-me como ii
Aprenda a programar direito: pergunte-me como iiBernardo Fontes
 
Django: um framework web para perfeccionistas com prazo
Django: um framework web para perfeccionistas com prazoDjango: um framework web para perfeccionistas com prazo
Django: um framework web para perfeccionistas com prazoBernardo Fontes
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Bernardo Fontes
 

Mehr von Bernardo Fontes (6)

Melhorando Testes No Django Com O Model Mommy
Melhorando Testes No Django Com O Model MommyMelhorando Testes No Django Com O Model Mommy
Melhorando Testes No Django Com O Model Mommy
 
Crawleando a web feito gente grande com o scrapy
Crawleando a web feito gente grande com o scrapyCrawleando a web feito gente grande com o scrapy
Crawleando a web feito gente grande com o scrapy
 
Aprenda a programar direito: pergunte-me como ii
Aprenda a programar direito:  pergunte-me como iiAprenda a programar direito:  pergunte-me como ii
Aprenda a programar direito: pergunte-me como ii
 
Django: um framework web para perfeccionistas com prazo
Django: um framework web para perfeccionistas com prazoDjango: um framework web para perfeccionistas com prazo
Django: um framework web para perfeccionistas com prazo
 
Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?Testando Aplicações Django: Quando, Como e Onde?
Testando Aplicações Django: Quando, Como e Onde?
 
ForkinRio
ForkinRioForkinRio
ForkinRio
 

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