BDD: Behaviour driven development

1,227 views
1,144 views

Published on

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.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,227
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
15
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

BDD: Behaviour driven development

  1. 1. BDD: Behaviour-driven development Uma introdução ao desenvolvimento guiado por comportamento Francisco Souza francisco@franciscosouza.net franciscosouza.com.brhttp://www.games-workshop.com/MEDIA_CustomProductCatalog/m1241904_99060105229_StormtrooperSergpowerswordmain_445x319.jpg
  2. 2. what the f**rancisco?!?! ● Giran Soluções e Ensino ● Associação Python Brasil ● Apaixonado por Python ● Viciado em coding dojo ● PMP
  3. 3. what the f**rancisco?!?! ● Giran Soluções e Ensino ● Associação Python Brasil ● Apaixonado por Python ● Viciado em coding dojo ● PMP Professional Mario Player
  4. 4. Como desenvolvemos software?
  5. 5. http://www.flickr.com/photos/bibendum84/4721132699/
  6. 6. http://www.flickr.com/photos/3336/142845984/
  7. 7. Especificação
  8. 8. http://www.flickr.com/photos/drbethsnow/2194409454/
  9. 9. http://www.flickr.com/photos/drbethsnow/2194409454/
  10. 10. http://www.flickr.com/photos/enebish/2498232255/
  11. 11. Design
  12. 12. http://www.flickr.com/photos/drbethsnow/2194409454/
  13. 13. Especificação
  14. 14. http://www.flickr.com/photos/peterhellberg/4625578444/
  15. 15. Mas é tudo papel! o__Ohttp://www.flickr.com/photos/chernobylbob/4976837748/
  16. 16. Design
  17. 17. http://1.bp.blogspot.com/_xuZyFxSS-UI/TLhIng0YnsI/AAAAAAAAH6g/dqcytiNO8Pc/s1600/image001111.jpg
  18. 18. TDD Test-driven developmenthttp://test.ical.ly/wp-content/uploads/2010/03/tdd_cycle.jpg
  19. 19. TDD Test-driven development http://3.bp.blogspot.com/_00az4KUgbFE/TGCEQ9pZmZI/AAAAAAAAAO8/cGXlQ plTSbM/s1600/minesweeper_game_fail_windows_epic.jpghttp://test.ical.ly/wp-content/uploads/2010/03/tdd_cycle.jpg
  20. 20. Especificação
  21. 21. Especificação Executável
  22. 22. 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
  23. 23. 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
  24. 24. http://www.flickr.com/photos/samnewman/201939659/
  25. 25. 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
  26. 26. http://1.bp.blogspot.com/_36x37e5S95A/TE-v6kK1CAI/AAAAAAAABEI/eq-YbU9XbTg/s1600/jack_t_ripper.jpg Vamos por partes...
  27. 27. 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
  28. 28. 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
  29. 29. 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...
  30. 30. 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...
  31. 31. 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...
  32. 32. 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...
  33. 33. 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...
  34. 34. 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...
  35. 35. 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...
  36. 36. 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...
  37. 37. 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
  38. 38. 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
  39. 39. 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
  40. 40. 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()
  41. 41. Entrada Processamento Saída
  42. 42. Dado Quando Então
  43. 43. 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()
  44. 44. Dado que existe um usuário logadoE que existe uma enquete cadastradaE que existe uma opção cadastradaQuando o usuário vota nesta opçãoEntão a opção deve ter um voto a mais
  45. 45. http://www.flickr.com/photos/striatic/2145725302/
  46. 46. http://queroabracaromundo.files.wordpress.com/2009/12/o-contador-de-historias.jpg Um pouco de história...
  47. 47. http://www.flickr.com/photos/scoop/1403808340/
  48. 48. Conceituandohttp://www.flickr.com/photos/drics/3989109318/
  49. 49. História/Funcionalidadehttp://www.stellman-greene.com/blog/wp-content/uploads/2009/05/search-and-replace-user-story-card.png
  50. 50. História/Funcionalidade Especificação?http://www.stellman-greene.com/blog/wp-content/uploads/2009/05/search-and-replace-user-story-card.png
  51. 51. Cenárioshttp://www.flickr.com/photos/dhammza/132440085/
  52. 52. Dado GivenQuando WhenEntão Then
  53. 53. Dado que existe um usuário logadoE que existe uma enquete cadastradaE que existe uma opção cadastradaQuando o usuário vota nesta opçãoEntão a opção deve ter um voto a mais
  54. 54. Outside-in developmenthttp://eggsonbread.com/wp-content/uploads/2009/07/bdd.png
  55. 55. E no dia a dia?
  56. 56. Tá sussa! :D Quero esse cadastro deenquetes aí! :D
  57. 57. http://www.flickr.com/photos/bre/552152780/
  58. 58. JBehavecuke4duke Cucumber RSpec RBehave Lettuce Freshen specloud should-dsl
  59. 59. http://www.flickr.com/photos/ateliervanessamaurer/3177029046/Gherkin Syntax
  60. 60. 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
  61. 61. Unbelievable! Inacreditável!Unglaublich! http://www.flickr.com/photos/pfv/2889794588/
  62. 62. Outside-in developmenthttp://eggsonbread.com/wp-content/uploads/2009/07/bdd.png
  63. 63. ATDDhttp://slidesha.re/9Us7HL
  64. 64. http://www.flickr.com/photos/quinnanya/4221482856/
  65. 65. Obrigado! s? :) i d a úv n et uza.D za sou iscoso cisco franc fran co@ @ nci s uza.com .br a fr o cos uza.com ncis oso fra isc fr anc

×