Mare de Agilidade - BDD e TDD
-
Upload
milfont-consulting -
Category
Technology
-
view
4.448 -
download
0
description
Transcript of Mare de Agilidade - BDD e TDD
Behaviour and Test Driven Development [BDD | TDD]
Desenvolvimento guiado a comportamento e testes
Christiano MilfontMaré de Agilidade 2009, FortalezaCopyleft 2009 Milfont.org
Testes
Requirements
Design
Implementation
Testing
Maintenance
Deployment
Waterfall
Requirements
Design
Implementation
Testing
Maintenance
Deployment
Waterfall
Testes
Testes
Requirements
Design
Implementation
Testing
Maintenance
Deployment
Waterfall
Requirements
Design
Implementation
Testing
Maintenance
Deployment
Test First
Requirements
Design
Implementation
Testing
Maintenance
Deployment
Test First
Requirements
Design Implementation
Testing
Maintenance
Deployment
Test First
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
User Story
• Card [cartão]• Conversation [conversação]• Confirmation [confirmação]
“Ron Jeffries, 2001”
User Story• Independente• Negociável• Valioso ao comprador• Estimável• Small [Pequena]• Testável
User Stories Applied
Mike Cohn
Story Card
Story Card
Story Card
Linguagem Ubíqua
"A language structured around the domain model and used by all team members to connect all the activities of the team with the software."
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
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
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
Story Card• As a… • I want…• so that…
“BDD fornece uma linguagem ubíqua
para análise”Dan North
Story Card• As a [X]• I want [Y]• so that [Z]Onde: Y é alguma funcionalidade ou característica, Z é o benefício ou valor dessa funcionalidade e X é a pessoa ou perfil/papel beneficiado
Story Card• As a [role]• I want to [activity]• To do [a task]
• In order to [business value]• As a [role]• I want to [activity]
Story Card• As a “membro do projeto”• I want “Criar uma issue”• so that “Eu possa acompanhar a resolução”
• As a “gerente do projeto”• I want “aceitar a entrada de uma issue”• so that “seja descartada ou resolvida apenas
com minha permissão”
Behaviour Driven Development
Acceptance CriteriaGiven [dado]When [quando]Then [então]
Acceptance CriteriaGiven uma issue preenchida e um projeto
informadoWhen um membro requisitar o cadastroThen garantir que ela seja armazenada no
sistema And uma mensagem seja informadaAnd a issue esteja na lista de não-confirmadas
Acceptance CriteriaGiven uma issue preenchida
And um projeto informado And um membro autorizado
When um membro requisitar o cadastroThen garantir que ela seja armazenada no sistema
And uma mensagem seja informadaAnd a issue esteja na lista de "novas issues" a serem resolvidas
Titulo: Cadastrar IssuesAs a membro do projetoI want criar uma issueSo that eu possa acompanhar a resolução do mesmo.Cenário 1Given uma issue preenchida e um projeto informadoWhen um membro requisitar o cadastroThen garantir que ela seja armazenada no sistema
And uma mensagem seja informada And a issue esteja na lista de não-confirmadas
Cenário 2Given um nome e um tipo e um nivel e um sumario a um projetoWhen o membro requisitar o cadastroThen 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
Given um nome e um tipo e um nivel e um sumario a um projetoWhen o membro requisitar o cadastroThen 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
@Given("a $name and a $type and a $level and a $summary and a $project")public void relatar(String name…) throws IllegalArgumentIssueException {
throw new IllegalArgumentIssueException("erro");}
Given um nome e um tipo e um nivel e um sumario a um projetoWhen o membro requisitar o cadastroThen 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
@Given("a $name and a $type and a $level and a $summary and a $project")
public void relatar(String name…) throws IllegalArgumentIssueException {Issue issue = member
.createIssue(name)
.withType(type)
.withLevel(level)
.withSummary(summary)
.toProject(project);ensureThat(issue.getStatus(), equalTo(Status.UNCONFIRMED));…
}
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 cadastroEntã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 adequadamenteQuando o cliente requisitar o cadastroEntã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
Test Driven Development
“Desenvolvimento guiado por testes é um caminho de gerenciamento
do medo durante a programação.”Kent Beck - Test Driven
Development by Example
Test Driven DevelopmentStandup Meeting @ 9h
Pair Up
Test First [Prática]
Code Refactor
Integrar ou Disponibilizar
Ir para casa @ 17h
Test Driven Development
O ritmo em 3 A’s• Arrange [Criar um objeto]• Act [Invocar um método]• Assert [Verificar o resultado]
Refactoring Workbook, Bill Wake
Test Driven Development
1.Escreva um teste que não funciona.2.Escreva o código e faço-o funcionar.3.Refatore e elimine o código repetitivo.
RED-GREEN-REFACTOR
Test Double• Dummy• Fake• Stubs• Spies• Mocks
Fixture Setup• Setup• Tear Down
@Beforepublic void setUp() throws Exception {
Connection conn;try {
... IDatabaseConnection connection =
new DatabaseConnection(conn); DatabaseOperation.INSERT.execute(connection,
new FlatXmlDataSet(new FileInputStream( “issuetrackr.xml")));
conn.close();} catch (Exception exc) { ... }
}
http://en.wikipedia.org/wiki/Dexter_Morgan
Perguntas?