O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Mare de Agilidade - BDD e TDD

3.334 visualizações

Publicada em

Publicada em: Tecnologia, Negócios

Mare de Agilidade - BDD e TDD

  1. 1. Behaviour and Test Driven Development [BDD | TDD] Desenvolvimento guiado a comportamento e testes Christiano Milfont Maré de Agilidade 2009, Fortaleza Copyleft 2009 Milfont.org
  2. 2. Testes
  3. 3. Requirements Design Implementation Testing Maintenance Deployment Waterfall
  4. 4. Requirements Design Implementation Testing Maintenance Deployment Waterfall
  5. 5. Testes
  6. 6. Testes
  7. 7. Requirements Design Implementation Testing Maintenance Deployment Waterfall
  8. 8. Requirements Design Implementation Testing Maintenance Deployment Test First
  9. 9. Requirements Design Implementation Testing Maintenance Deployment Test First
  10. 10. Requirements Design Implementation Testing Maintenance Deployment Test First
  11. 11. Use Case Um caso de uso captura um contrato entre os interessados de um sistema sobre seus comportamentos . Writing Effective Use Cases Alistair Cockburn User Story Uma estoria descreve funcionalmente o que será valioso para os usuários e aos compradores de um software . User Stories Applied Mike Cohn Behaviour Driven Development
  12. 12. <ul><li>User Story </li></ul><ul><ul><ul><li>Card [cartão] </li></ul></ul></ul><ul><ul><ul><li>Conversation [conversação] </li></ul></ul></ul><ul><ul><ul><li>Confirmation [confirmação] </li></ul></ul></ul><ul><li>“ Ron Jeffries, 2001” </li></ul>
  13. 13. <ul><li>User Story </li></ul><ul><li>I ndependente </li></ul><ul><li>N egociável </li></ul><ul><li>V alioso ao comprador </li></ul><ul><li>E stimável </li></ul><ul><li>S mall [Pequena] </li></ul><ul><li>T estável </li></ul><ul><li>User Stories Applied </li></ul><ul><li>Mike Cohn </li></ul>
  14. 14. Story Card
  15. 15. Story Card
  16. 16. Story Card
  17. 17. Linguagem Ubíqua &quot;A language structured around the domain model and used by all team members to connect all the activities of the team with the software .&quot;
  18. 18. Um Membro do projeto cadastra uma “Issue” no sistema. Um Gerente de projetos aceita ou rejeita a entrada de Issues para serem trabalhadas. Um Funcionário do hospital dar entrada do Paciente na Emergência. O Cenário de entrada por pacientes depende do Login do usuário com ROLE Admin na Action antes do forward. Um funcionário atende uma solicitação de saída de medicamento pelo prontuário do paciente com limite do cardápio do médico. A Tabela TB_ITEMS tem ligação com a Tabela TB_NOTAS
  19. 19. Um Membro do projeto cadastra uma “Issue” no sistema. Um Gerente de projetos aceita ou rejeita a entrada de Issues para serem trabalhadas. Um Funcionário do hospital dar entrada do Paciente na Emergência. O Cenário de entrada por pacientes depende do Login do usuário com ROLE Admin na Action antes do forward. Um funcionário atende uma solicitação de saída de medicamento pelo prontuário do paciente com limite do cardápio do médico. A Tabela TB_ITEMS tem ligação com a Tabela TB_NOTAS
  20. 20. Um Membro do projeto cadastra uma “ Issue ” no sistema. Um Gerente de projetos aceita ou rejeita a entrada de Issues para serem trabalhadas. Um Funcionário do hospital dar entrada do Paciente na Emergência . O Cenário de entrada por pacientes depende do Login do usuário com ROLE Admin na Action antes do forward. Um funcionário atende uma solicitação de saída de medicamento pelo prontuário do paciente com limite do cardápio do médico. A Tabela TB_ITEMS tem ligação com a Tabela TB_NOTAS
  21. 21. <ul><li>Story Card </li></ul><ul><li>As a… </li></ul><ul><li>I want… </li></ul><ul><li>so that… </li></ul>“ BDD fornece uma linguagem ubíqua para análise” Dan North
  22. 22. <ul><li>Story Card </li></ul><ul><li>As a [X] </li></ul><ul><li>I want [Y] </li></ul><ul><li>so that [Z] </li></ul><ul><li>Onde: </li></ul><ul><li>Y é alguma funcionalidade ou característica, </li></ul><ul><li>Z é o benefício ou valor dessa funcionalidade e </li></ul><ul><li>X é a pessoa ou perfil/papel beneficiado </li></ul>
  23. 23. <ul><li>Story Card </li></ul><ul><li>As a [role] </li></ul><ul><li>I want to [activity] </li></ul><ul><li>To do [a task] </li></ul><ul><li>In order to [business value] </li></ul><ul><li>As a [role] </li></ul><ul><li>I want to [activity] </li></ul>
  24. 24. <ul><li>Story Card </li></ul><ul><li>As a “ membro do projeto ” </li></ul><ul><li>I want “ Criar uma issue ” </li></ul><ul><li>so that “ Eu possa acompanhar a resolução ” </li></ul><ul><li>As a “ gerente do projeto ” </li></ul><ul><li>I want “ aceitar a entrada de uma issue ” </li></ul><ul><li>so that “ seja descartada ou resolvida apenas com minha permissão ” </li></ul>
  25. 25. Behaviour Driven Development Acceptance Criteria Given [dado] When [quando] Then [então]
  26. 26. Acceptance Criteria Given uma issue preenchida e um projeto informado When um membro requisitar o cadastro Then garantir que ela seja armazenada no sistema And uma mensagem seja informada And a issue esteja na lista de não-confirmadas
  27. 27. Acceptance Criteria Given uma issue preenchida And um projeto informado And um membro autorizado When um membro requisitar o cadastro Then garantir que ela seja armazenada no sistema And uma mensagem seja informada And a issue esteja na lista de &quot;novas issues&quot; a serem resolvidas
  28. 28. Titulo: Cadastrar Issues As a membro do projeto I want criar uma issue So that eu possa acompanhar a resolução do mesmo. Cenário 1 Given uma issue preenchida e um projeto informado When um membro requisitar o cadastro Then garantir que ela seja armazenada no sistema And uma mensagem seja informada And a issue esteja na lista de não-confirmadas Cenário 2 Given um nome e um tipo e um nivel e um sumario a um projeto When o membro requisitar o cadastro Then garantir que seja criada uma issue And armazenada no sistema And uma mensagem seja informada And a issue esteja na lista de não-confirmadas
  29. 29. <ul><li>Given um nome e um tipo e um nivel e um sumario a um projeto </li></ul><ul><li>When o membro requisitar o cadastro </li></ul><ul><li>Then garantir que seja criada uma issue </li></ul><ul><li> And armazenada no sistema </li></ul><ul><li> And uma mensagem seja informada </li></ul><ul><li> And a issue esteja na lista de não-confirmadas </li></ul><ul><li>@Given (&quot;a $name and a $type and a $level and a $summary and a $project &quot;)‏ </li></ul><ul><li>public void relatar(String name… ) throws IllegalArgumentIssueException { </li></ul><ul><ul><ul><li>throw new IllegalArgumentIssueException(&quot;erro&quot;); </li></ul></ul></ul><ul><li>} </li></ul>
  30. 30. <ul><li>Given um nome e um tipo e um nivel e um sumario a um projeto </li></ul><ul><li>When o membro requisitar o cadastro </li></ul><ul><li>Then garantir que seja criada uma issue </li></ul><ul><li> And armazenada no sistema </li></ul><ul><li> And uma mensagem seja informada </li></ul><ul><li> And a issue esteja na lista de não-confirmadas </li></ul><ul><li>@Given (&quot;a $name and a $type and a $level and a $summary and a $project &quot;)‏ </li></ul><ul><li>public void relatar(String name… ) throws IllegalArgumentIssueException { </li></ul><ul><ul><ul><li>Issue issue = member </li></ul></ul></ul><ul><ul><ul><ul><li>.createIssue( name )‏ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>.withType( type )‏ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>.withLevel( level )‏ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>.withSummary( summary )‏ </li></ul></ul></ul></ul><ul><ul><ul><ul><li>.toProject( project) ; </li></ul></ul></ul></ul><ul><ul><ul><li>ensureThat(issue .getStatus(), equalTo(Status. UNCONFIRMED )); </li></ul></ul></ul><ul><ul><ul><li>… </li></ul></ul></ul><ul><li>} </li></ul>
  31. 31. Declarativo vs Imperativo Dado um nome preenchido com “Erro tal” E um sumário preenchido com “bla bla bla” E um nível selecionado como “PENDENTE” E um projeto selecionado com o nome “Projeto Novo” Quando o cliente requisitar o cadastro Então garantir que seja criada uma issue E armazenada no sistema E uma mensagem seja informada E a issue esteja na lista de não-confirmadas Dado uma Issue preenchida adequadamente Quando o cliente requisitar o cadastro Então garantir que seja criada uma issue E armazenada no sistema E uma mensagem seja informada E a issue esteja na lista de não-confirmadas
  32. 32. Test Driven Development “ Desenvolvimento guiado por testes é um caminho de gerenciamento do medo durante a programação.” Kent Beck - Test Driven Development by Example
  33. 33. Test Driven Development Standup Meeting @ 9h Pair Up Test First [Prática] Code Refactor Integrar ou Disponibilizar Ir para casa @ 17h
  34. 34. Test Driven Development <ul><li>O ritmo em 3 A’s </li></ul><ul><li>Arrange [Criar um objeto] </li></ul><ul><li>Act [Invocar um método] </li></ul><ul><li>Assert [Verificar o resultado] </li></ul><ul><li>Refactoring Workbook, Bill Wake </li></ul>
  35. 35. Test Driven Development <ul><li>Escreva um teste que não funciona. </li></ul><ul><li>Escreva o código e faço-o funcionar. </li></ul><ul><li>Refatore e elimine o código repetitivo. </li></ul>RED - GREEN - REFACTOR
  36. 36. <ul><li>Test Double </li></ul><ul><li>Dummy </li></ul><ul><li>Fake </li></ul><ul><li>Stubs </li></ul><ul><li>Spies </li></ul><ul><li>Mocks </li></ul>
  37. 37. <ul><li>Fixture Setup </li></ul><ul><li>Setup </li></ul><ul><li>Tear Down </li></ul>@Before public void setUp() throws Exception { Connection conn; try { ... IDatabaseConnection connection = new DatabaseConnection(conn); DatabaseOperation.INSERT.execute(connection, new FlatXmlDataSet( new FileInputStream( “ issuetrackr.xml&quot;))); conn.close(); } catch (Exception exc) { ... } }
  38. 38. http://en.wikipedia.org/wiki/Dexter_Morgan Perguntas?

×