72
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

BDD: Behaviour driven development

Embed Size (px)

DESCRIPTION

Aborda conceitos básicos do BDD.Palestra apresentada na quarta edição do Liberdade Interativa, no dia 08 de dezembro de 2010, em Vitória no Espírito Santo.

Citation preview

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? :)