BDD: Behaviour driven development

1.252 visualizações

Publicada em

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.

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
1.252
No SlideShare
0
A partir de incorporações
0
Número de incorporações
5
Ações
Compartilhamentos
0
Downloads
15
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no 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

×