bdd: behaviour driven development
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.TRANSCRIPT
![Page 1: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/1.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/2.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/3.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/4.jpg)
Como desenvolvemos software?
![Page 5: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/5.jpg)
http://www.flickr.com/photos/bibendum84/4721132699/
![Page 6: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/6.jpg)
http://www.flickr.com/photos/3336/142845984/
![Page 7: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/7.jpg)
Especificação
![Page 8: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/8.jpg)
http://www.flickr.com/photos/drbethsnow/2194409454/
![Page 9: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/9.jpg)
http://www.flickr.com/photos/drbethsnow/2194409454/
![Page 10: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/10.jpg)
http://www.flickr.com/photos/enebish/2498232255/
![Page 11: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/11.jpg)
Design
![Page 12: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/12.jpg)
![Page 13: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/13.jpg)
![Page 14: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/14.jpg)
![Page 15: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/15.jpg)
![Page 16: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/16.jpg)
http://www.flickr.com/photos/drbethsnow/2194409454/
![Page 17: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/17.jpg)
![Page 18: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/18.jpg)
Especificação
![Page 19: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/19.jpg)
http://www.flickr.com/photos/peterhellberg/4625578444/
![Page 20: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/20.jpg)
http://www.flickr.com/photos/chernobylbob/4976837748/
Mas é tudo papel! o__O'
![Page 21: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/21.jpg)
Design
![Page 22: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/22.jpg)
http://1.bp.blogspot.com/_xuZyFxSS-UI/TLhIng0YnsI/AAAAAAAAH6g/dqcytiNO8Pc/s1600/image001111.jpg
![Page 23: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/23.jpg)
http://test.ical.ly/wp-content/uploads/2010/03/tdd_cycle.jpg
TDDTest-driven development
![Page 24: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/24.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/25.jpg)
Especificação
![Page 26: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/26.jpg)
EspecificaçãoExecutável
![Page 27: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/27.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/28.jpg)
![Page 29: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/29.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/30.jpg)
http://www.flickr.com/photos/samnewman/201939659/
![Page 31: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/31.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/32.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/33.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/34.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/35.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/36.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/37.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/38.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/39.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/40.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/41.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/42.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/43.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/44.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/45.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/46.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/47.jpg)
Entrada
Processamento
Saída
![Page 48: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/48.jpg)
Dado
Então
Quando
![Page 49: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/49.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/50.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/51.jpg)
http://www.flickr.com/photos/striatic/2145725302/
![Page 52: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/52.jpg)
http://queroabracaromundo.files.wordpress.com/2009/12/o-contador-de-historias.jpg
Um pouco de história...
![Page 53: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/53.jpg)
http://www.flickr.com/photos/scoop/1403808340/
![Page 54: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/54.jpg)
http://www.flickr.com/photos/drics/3989109318/
Conceituando
![Page 55: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/55.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/56.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/57.jpg)
http://www.flickr.com/photos/dhammza/132440085/
Cenários
![Page 58: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/58.jpg)
Dado Given
Quando When
Então Then
![Page 59: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/59.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/60.jpg)
http://eggsonbread.com/wp-content/uploads/2009/07/bdd.png
Outside-in development
![Page 61: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/61.jpg)
E no dia a dia?
![Page 62: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/62.jpg)
Quero esse cadastro de
enquetes aí! :D
Tá sussa! :D
![Page 63: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/63.jpg)
![Page 64: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/64.jpg)
http://www.flickr.com/photos/bre/552152780/
![Page 65: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/65.jpg)
JBehavecuke4duke
CucumberRSpec
RBehave
LettuceFreshenspecloud should-dsl
![Page 66: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/66.jpg)
http://www.flickr.com/photos/ateliervanessamaurer/3177029046/
Gherkin Syntax
![Page 67: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/67.jpg)
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](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/68.jpg)
http://www.flickr.com/photos/pfv/2889794588/
Unbelievable!
Inacreditável!
Unglaublich!
![Page 69: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/69.jpg)
http://eggsonbread.com/wp-content/uploads/2009/07/bdd.png
Outside-in development
![Page 70: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/70.jpg)
http://slidesha.re/9Us7HL
ATDD
![Page 71: BDD: Behaviour driven development](https://reader034.vdocuments.com.br/reader034/viewer/2022052214/54b6caf94a7959b5318b4571/html5/thumbnails/71.jpg)
http://www.flickr.com/photos/quinnanya/4221482856/