Transcript
Page 1: BDD: Behaviour driven development

Francisco Souza

http://www.games-workshop.com/MEDIA_CustomProductCatalog/m1241904_99060105229_StormtrooperSergpowerswordmain_445x319.jpg

[email protected] franciscosouza.com.br

BDD: Behaviour-driven development

Uma introdução ao desenvolvimento guiado por comportamento

Page 2: BDD: Behaviour driven development

what the f**rancisco?!?!

● Giran Soluções e Ensino● Associação Python Brasil● Apaixonado por Python● Viciado em coding dojo● PMP

Page 3: BDD: Behaviour driven development

what the f**rancisco?!?!

● Giran Soluções e Ensino● Associação Python Brasil● Apaixonado por Python● Viciado em coding dojo● PMP

Professional Mario Player

Page 4: BDD: Behaviour driven development

Como desenvolvemos software?

Page 5: BDD: Behaviour driven development

http://www.flickr.com/photos/bibendum84/4721132699/

Page 6: BDD: Behaviour driven development

http://www.flickr.com/photos/3336/142845984/

Page 7: BDD: Behaviour driven development

Especificação

Page 8: BDD: Behaviour driven development

http://www.flickr.com/photos/drbethsnow/2194409454/

Page 9: BDD: Behaviour driven development

http://www.flickr.com/photos/drbethsnow/2194409454/

Page 10: BDD: Behaviour driven development

http://www.flickr.com/photos/enebish/2498232255/

Page 11: BDD: Behaviour driven development

Design

Page 12: BDD: Behaviour driven development
Page 13: BDD: Behaviour driven development
Page 14: BDD: Behaviour driven development
Page 15: BDD: Behaviour driven development
Page 16: BDD: Behaviour driven development

http://www.flickr.com/photos/drbethsnow/2194409454/

Page 17: BDD: Behaviour driven development
Page 18: BDD: Behaviour driven development

Especificação

Page 19: BDD: Behaviour driven development

http://www.flickr.com/photos/peterhellberg/4625578444/

Page 20: BDD: Behaviour driven development

http://www.flickr.com/photos/chernobylbob/4976837748/

Mas é tudo papel! o__O'

Page 21: BDD: Behaviour driven development

Design

Page 22: BDD: Behaviour driven development

http://1.bp.blogspot.com/_xuZyFxSS-UI/TLhIng0YnsI/AAAAAAAAH6g/dqcytiNO8Pc/s1600/image001111.jpg

Page 23: BDD: Behaviour driven development

http://test.ical.ly/wp-content/uploads/2010/03/tdd_cycle.jpg

TDDTest-driven development

Page 24: BDD: Behaviour driven development

http://test.ical.ly/wp-content/uploads/2010/03/tdd_cycle.jpg

TDDTest-driven development

http://3.bp.blogspot.com/_00az4KUgbFE/TGCEQ9pZmZI/AAAAAAAAAO8/cGXlQplTSbM/s1600/minesweeper_game_fail_windows_epic.jpg

Page 25: BDD: Behaviour driven development

Especificação

Page 26: BDD: Behaviour driven development

EspecificaçãoExecutável

Page 27: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_quantidade_votos(self): login_mock = self.mocker.mock(Login) login_mock.checa_logado(mocker.ARGS) self.mocker.result(True) self.mocker.replay() enquete = Enquete.objects.get_by_pk(1) votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Page 28: BDD: Behaviour driven development
Page 29: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_quantidade_votos(self): login_mock = self.mocker.mock(Login) login_mock.checa_logado(mocker.ARGS) self.mocker.result(True) self.mocker.replay() enquete = Enquete.objects.get_by_pk(1) votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Page 30: BDD: Behaviour driven development

http://www.flickr.com/photos/samnewman/201939659/

Page 31: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_quantidade_votos(self): login_mock = self.mocker.mock(Login) login_mock.checa_logado(mocker.ARGS) self.mocker.result(True) self.mocker.replay() enquete = Enquete.objects.get_by_pk(1) votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Page 32: BDD: Behaviour driven development

http://1.bp.blogspot.com/_36x37e5S95A/TE-v6kK1CAI/AAAAAAAABEI/eq-YbU9XbTg/s1600/jack_t_ripper.jpg

Vamos por partes...

Page 33: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_quantidade_votos(self): login_mock = self.mocker.mock(Login) login_mock.checa_logado(mocker.ARGS) self.mocker.result(True) self.mocker.replay() enquete = Enquete.objects.get_by_pk(1) votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Page 34: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): login_mock = self.mocker.mock(Login) login_mock.checa_logado(mocker.ARGS) self.mocker.result(True) self.mocker.replay() enquete = Enquete.objects.get_by_pk(1) votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Page 35: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): login_mock = self.mocker.mock(Login) login_mock.checa_logado(mocker.ARGS) self.mocker.result(True) self.mocker.replay() enquete = Enquete.objects.get_by_pk(1) votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Usuário logado...

Page 36: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado()

enquete = Enquete.objects.get_by_pk(1) votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Usuário logado...

Page 37: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado()

enquete = Enquete.objects.get_by_pk(1) votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Enquete cadastrada...

Page 38: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado()

self.e_que_existe_uma_enquete_cadastrada() votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Enquete cadastrada...

Page 39: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado()

self.e_que_existe_uma_enquete_cadastrada() votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Opção cadastrada...

Page 40: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado()

self.e_que_existe_uma_enquete_cadastrada() self.e_que_existe_uma_opcao_cadastrada()

votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Opção cadastrada...

Page 41: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado()

self.e_que_existe_uma_enquete_cadastrada() self.e_que_existe_uma_opcao_cadastrada()

votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Usuário vota na opção...

Page 42: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado()

self.e_que_existe_uma_enquete_cadastrada() self.e_que_existe_uma_opcao_cadastrada()

self.quando_ele_vota_na_opcao()

assert enquete.opcoes[2].votos == votos_desejados

Usuário vota na opção...

Page 43: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado()

self.e_que_existe_uma_enquete_cadastrada() self.e_que_existe_uma_opcao_cadastrada()

self.quando_ele_vota_na_opcao()

assert enquete.opcoes[2].votos == votos_desejados

Deve ter um voto a mais

Page 44: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado()

self.e_que_existe_uma_enquete_cadastrada() self.e_que_existe_uma_opcao_cadastrada()

self.quando_ele_vota_na_opcao()

self.entao_a_opcao_deve_ter_um_voto_a_mais()

Deve ter um voto a mais

Page 45: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

def test_quantidade_votos(self): login_mock = self.mocker.mock(Login) login_mock.checa_logado(mocker.ARGS) self.mocker.result(True) self.mocker.replay() enquete = Enquete.objects.get_by_pk(1) votos_desejados = enquete.opcoes[2].votos + 1 votador = Votador() votador.vota(enquete, 2) assert enquete.opcoes[2].votos == votos_desejados

Page 46: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

# outros métodos

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado() self.e_que_existe_uma_enquete_cadastrada()

self.e_que_existe_uma_opcao_cadastrada() self.quando_ele_vota_na_opcao()

self.entao_a_opcao_deve_ter_um_voto_a_mais()

Page 47: BDD: Behaviour driven development

Entrada

Processamento

Saída

Page 48: BDD: Behaviour driven development

Dado

Então

Quando

Page 49: BDD: Behaviour driven development

class TestEnquetes(mocker.MockerTestCase):

# outros métodos

def test_deve_incrementar_quantidade_de_votos(self): self.dado_que_existe_um_usuario_logado() self.e_que_existe_uma_enquete_cadastrada()

self.e_que_existe_uma_opcao_cadastrada() self.quando_ele_vota_na_opcao()

self.entao_a_opcao_deve_ter_um_voto_a_mais()

Page 50: BDD: Behaviour driven development

Dado que existe um usuário logado

E que existe uma enquete cadastrada

E que existe uma opção cadastrada

Quando o usuário vota nesta opção

Então a opção deve ter um voto a mais

Page 51: BDD: Behaviour driven development

http://www.flickr.com/photos/striatic/2145725302/

Page 52: BDD: Behaviour driven development

http://queroabracaromundo.files.wordpress.com/2009/12/o-contador-de-historias.jpg

Um pouco de história...

Page 53: BDD: Behaviour driven development

http://www.flickr.com/photos/scoop/1403808340/

Page 54: BDD: Behaviour driven development

http://www.flickr.com/photos/drics/3989109318/

Conceituando

Page 55: BDD: Behaviour driven development

História/Funcionalidade

http://www.stellman-greene.com/blog/wp-content/uploads/2009/05/search-and-replace-user-story-card.png

Page 56: BDD: Behaviour driven development

História/Funcionalidade

http://www.stellman-greene.com/blog/wp-content/uploads/2009/05/search-and-replace-user-story-card.png

Especificação?

Page 57: BDD: Behaviour driven development

http://www.flickr.com/photos/dhammza/132440085/

Cenários

Page 58: BDD: Behaviour driven development

Dado Given

Quando When

Então Then

Page 59: BDD: Behaviour driven development

Dado que existe um usuário logado

E que existe uma enquete cadastrada

E que existe uma opção cadastrada

Quando o usuário vota nesta opção

Então a opção deve ter um voto a mais

Page 60: BDD: Behaviour driven development

http://eggsonbread.com/wp-content/uploads/2009/07/bdd.png

Outside-in development

Page 61: BDD: Behaviour driven development

E no dia a dia?

Page 62: BDD: Behaviour driven development

Quero esse cadastro de

enquetes aí! :D

Tá sussa! :D

Page 63: BDD: Behaviour driven development
Page 64: BDD: Behaviour driven development

http://www.flickr.com/photos/bre/552152780/

Page 65: BDD: Behaviour driven development

JBehavecuke4duke

CucumberRSpec

RBehave

LettuceFreshenspecloud should-dsl

Page 66: BDD: Behaviour driven development

http://www.flickr.com/photos/ateliervanessamaurer/3177029046/

Gherkin Syntax

Page 67: BDD: Behaviour driven development

Feature: Manipulate strings In order to have some fun As a programming beginner I want to manipulate strings

Scenario: Uppercased strings Given I have the string "lettuce leaves" When I put it in upper case Then I see the string is "LETTUCE LEAVES"

http://lettuce.it

Page 68: BDD: Behaviour driven development

http://www.flickr.com/photos/pfv/2889794588/

Unbelievable!

Inacreditável!

Unglaublich!

Page 69: BDD: Behaviour driven development

http://eggsonbread.com/wp-content/uploads/2009/07/bdd.png

Outside-in development

Page 70: BDD: Behaviour driven development

http://slidesha.re/9Us7HL

ATDD

Page 71: BDD: Behaviour driven development

http://www.flickr.com/photos/quinnanya/4221482856/

Page 72: BDD: Behaviour driven development

Obrigado!

@franciscosouza

[email protected]

franciscosouza.com

franciscosouza.com.brDúvida

s? :)