BDD: Behaviour driven development

  • View
    972

  • Download
    5

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.

Text of BDD: Behaviour driven development

  • 1. BDD: Behaviour-driven development Uma introduo ao desenvolvimentoguiado por comportamentoFrancisco Souzafrancisco@franciscosouza.netfranciscosouza.com.brhttp://www.games-workshop.com/MEDIA_CustomProductCatalog/m1241904_99060105229_StormtrooperSergpowerswordmain_445x319.jpg

2. what the f**rancisco?!?!Giran Solues e EnsinoAssociao Python BrasilApaixonado por PythonViciado em coding dojoPMP 3. what the f**rancisco?!?!Giran Solues e EnsinoAssociao Python BrasilApaixonado por PythonViciado em coding dojoPMPProfessional Mario Player 4. Como desenvolvemossoftware? 5. http://www.flickr.com/photos/bibendum84/4721132699/ 6. http://www.flickr.com/photos/3336/142845984/ 7. Especificao 8. http://www.flickr.com/photos/drbethsnow/2194409454/ 9. http://www.flickr.com/photos/drbethsnow/2194409454/ 10. http://www.flickr.com/photos/enebish/2498232255/ 11. Design 12. http://www.flickr.com/photos/drbethsnow/2194409454/ 13. Especificao 14. http://www.flickr.com/photos/peterhellberg/4625578444/ 15. Mas tudo papel! o__Ohttp://www.flickr.com/photos/chernobylbob/4976837748/ 16. Design 17. http://1.bp.blogspot.com/_xuZyFxSS-UI/TLhIng0YnsI/AAAAAAAAH6g/dqcytiNO8Pc/s1600/image001111.jpg 18. TDD Test-driven developmenthttp://test.ical.ly/wp-content/uploads/2010/03/tdd_cycle.jpg 19. TDD Test-driven developmenthttp://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. Especificao 21. Especificao Executvel 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. 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. http://www.flickr.com/photos/samnewman/201939659/ 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. http://1.bp.blogspot.com/_36x37e5S95A/TE-v6kK1CAI/AAAAAAAABEI/eq-YbU9XbTg/s1600/jack_t_ripper.jpg Vamos porpartes... 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 + 1votador = Votador()votador.vota(enquete, 2)assert enquete.opcoes[2].votos == votos_desejados 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 + 1votador = Votador()votador.vota(enquete, 2)assert enquete.opcoes[2].votos == votos_desejados 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 + 1votador = Votador()votador.vota(enquete, 2)assert enquete.opcoes[2].votos == votos_desejadosUsurio logado... 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 + 1votador = Votador()votador.vota(enquete, 2)assert enquete.opcoes[2].votos == votos_desejadosUsurio logado... 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 + 1votador = Votador()votador.vota(enquete, 2)assert enquete.opcoes[2].votos == votos_desejadosEnquete cadastrada... 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 + 1votador = Votador()votador.vota(enquete, 2)assert enquete.opcoes[2].votos == votos_desejadosEnquete cadastrada... 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 + 1votador = Votador()votador.vota(enquete, 2)assert enquete.opcoes[2].votos == votos_desejadosOpo cadastrada... 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_desejadosOpo cadastrada... 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_desejadosUsurio vota na opo... 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_desejadosUsurio vota na opo... 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. 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. 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. class TestEnquetes(mocker.MockerTestCase):# outros mtodosdef 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. Entrada Processamento Sada 42. Dado QuandoEnto 43. class TestEnquetes(mocker.MockerTestCase):# outros mtodosdef 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. Dado que existe um usurio logadoE que existe uma enquete cadastradaE que existe uma opo cadastradaQuando o usurio vota nesta opoEnto a opo deve ter um voto a mais 45. http://www.flickr.com/photos/striatic/2145725302/ 46. http://queroabracaromundo.files.wordpress.com/2009/12/o-contador-de-historias.jpg Um pouco de histria... 47. http://www.flickr.com/photos/scoop/1403808340/ 48. Conceituandohttp://www.flickr.com/photos/drics/3989109318/ 49. Histria/Funcionalidadehttp://www.stellman-greene.com/blog/wp-content/uploads/2009/05/search-and-replace-user-story-card.png 50. Histria/Funcionalidade Especificao?http://www.stellman-greene.com/blog/wp-content/uploads/2009/05/search-and-replace-user-story-card.png 51. Cenrioshttp://www.flickr.com/photos/dhammza/132440085/ 52. DadoGivenQuando WhenEnto Then 53. Dado que existe um usurio logadoE que existe uma enquete cadastradaE que existe uma opo cadastradaQuando o usurio vota nesta opoEnto a opo deve ter um voto a mais 54. Outside-in developmenthttp://eggsonbread.com/wp-content/uploads/2009/07/bdd.png 55. E no dia a dia? 56. T sussa! :D Quero esse cadastro deenquetes a! :D 57. http://www.flickr.com/photos/bre/552152780/ 58. JBehavecuke4dukeCucumber RSpec RBehave Lettuce Freshen specloud should-dsl 59. http://www.flickr.com/photos/ateliervanessamaurer/3177029046/Gherkin Syntax 60. Feature: Manipulate stringsIn order to have some funAs a programming beginnerI 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. Unbelievable! Inacreditvel!Unglaublich!http://www.flickr.com/photos/pfv/2889794588/ 62. Outside-in developmenthttp://eggsonbread.com/wp-content/uploads/2009/07/bdd.png 63. ATDDhttp://