SlideShare ist ein Scribd-Unternehmen logo
1 von 49
Behavior-Driven Development (BDD) no mundo real Giovanni Bassi Lambda3 Lambda3 | MVP | Scrum Developer Trainer | Scrum Trainer giovanni@lambda3.com.br | unplugged.giggio.net | lambda3.com.br
Giovanni Bassi
Lambda3 www.Lambda3.com.br [email_address]
Online @ ,[object Object],[object Object]
 
“ Testes me deixam mais lento” “ Eu consigo entender meu código, não preciso de testes” “ Testadores é que devem testar” Devs reclamando
“ Programadores não sabem testar” “ Vou perder meu emprego” “ Você não entende nada de testes” Testers reclamando
Test Driven Development Assumption Driven Development Duas maneiras de desenhar a aplicação
Fluxo de teste
Código difícil de entender Testes são chatos de escrever Código que nunca é usado Acoplamento muito alto Big Design Up Front
Fluxo de TDD
Quem está falando em testar? TESTES???
 
 
<<perguntamos porque>>
Porque perguntamos porque?
Aumentar a receita Proteger a receita Gerenciar a despesa
 
Eu quero uma funcionalidade! Qual? Quem quer? Porque?
Nasce a user story Nome da história Enquanto <um papel> Eu quero <funcionalidade> Para que <valor para o negócio>
Nasce a user story Gherkin Nome da história Para que <valor para o negócio> Enquanto <um papel> Eu quero <funcionalidade>
Nasce a user story Trocar de senha Enquanto usuário Eu quero trocar de senha Para que eu possa garantir minha segurança
Linguagem Ubíqua!
 
Trocar de senha Enquanto usuário Eu quero trocar de senha Para que eu possa garantir minha segurança
Trocar de senha Dado... Quando... Então... Um usuário logado Solicito a troca de senha A senha é alterada E ativo E a nova senha é válida Um usuário logado Solicito a troca de senha A senha não é alterada E ativo E a nova senha é inválida Um usuário anônimo Solicito a troca de senha Um erro é lançado Cenário 1 Cenário 2 Cenário 3 Funcionalidade
E os meus casos de uso?
Context  Specification AAA Histórias Dizendo a mesma coisa de formas diferentes
 
 
Diz o que quer Captura de maneira abstrata Contribui com cenários concretos Escreve o código com BDD EN AN Dev T Feedback
 
 
Fotografia da cultura de testes e BDD .Net Java Ruby Principalmente NUNit e MSTest, para testes de unidade e de integração. Moq e RhinoMocks para Mocks. BDD com StoryQ, SpecFlow, NBehave e MSpec. Cultura de testes ainda é incipiente. jUnit para testes de unidade e de integração e Selenium para testes de aceitação. jBehave e Calopsita para BDD, mas é raro. jMock e Mockito para Mocks. Cultura de testes varia. TestUnit, RSpec, Cucumber e Shoulda são os mais usados. Testes de unidade e integrado ao longo de toda a stack. Não precisa de framework específico de Mocks. BDD faz parte da cultura de boa parte dos rubistas e testes são muito comuns.
Desenvolvendo de fora pra dentro
Um usuário logado Solicito a troca de senha A senha é alterada E ativo E a nova senha é válida Um usuário logado Solicito a troca de senha A senha não é alterada E ativo E a nova senha é inválida Um usuário anônimo Solicito a troca de senha Um erro é lançado Rendimentos decrescentes
Arquitetura
http://github.com/caelum/calopsita
public   class   UserStory  extends  DefaultStory  { @Test       public   void  signUpWithANewUser() {          given .theUserDoesntExist( &quot;ceci&quot; );          given .iAmOnTheRootPage();          when .iSignUpAs( &quot;ceci&quot; );          then .iMustBeLoggedInAs( &quot;ceci&quot; );      } }
public   class   GivenContexts  {      public   void  iAmOnTheRootPage() {          browser.open( &quot;/calopsita&quot; );      }      public   void  theUserDoesntExist( String  name) { session.createQuery( &quot;delete from User u where u.name = :name&quot; )              .setParameter( &quot;name&quot; , name)              .executeUpdate();      } }
public   class   WhenActions  { public   void  iSignUpAs( String  login) { iClickOn( &quot;Sign Up&quot; ); Form form = browser.currentPage().form( &quot;signUp&quot; ); form.field( &quot;user.name&quot; ).type(login); form.field( &quot;user.login&quot; ).type(login); form.field( &quot;user.email&quot; ).type(login +  &quot;@caelum.com.br&quot; ); form.field( &quot;user.password&quot; ).type(login); form.field( &quot;user.confirmation&quot; ).type(login); form.submit(); } }
public   class   ThenAsserts  { public   void  iMustBeLoggedInAs( String  login) { ContentTag div = div( &quot;user&quot; ); assertThat(div, allOf( containsText(login), containsText( &quot;Logout&quot; ))); } }
 
   public   abstract   class   AccountSpecs   {      protected   static   Account  fromAccount;      protected   static   Account  toAccount;      Establish  context =()=>     {       fromAccount =  new   Account  {Balance = 1m};       toAccount =  new   Account  {Balance = 1m};     };   }    [ Subject ( typeof ( Account ),  &quot;Funds transfer&quot; )]    public   class   when_transferring_between_two_accounts     :  AccountSpecs   {      Because  of = () =>       fromAccount.Transfer(1m, toAccount);      It  should_debit_the_from_account_by_the_amount_transferred = () =>       fromAccount.Balance.ShouldEqual(0m);      It  should_credit_the_to_account_by_the_amount_transferred = () =>       toAccount.Balance.ShouldEqual(2m);   }
 
 
 
Online @ ,[object Object],[object Object]

Weitere ähnliche Inhalte

Andere mochten auch

Land Taxation and Land Tenure Ethics
Land Taxation and Land Tenure EthicsLand Taxation and Land Tenure Ethics
Land Taxation and Land Tenure EthicsJohnAndrewAinsley
 
Chaos in Context: Informed Design Through Analytics
Chaos in Context: Informed Design Through AnalyticsChaos in Context: Informed Design Through Analytics
Chaos in Context: Informed Design Through AnalyticsMichael Fienen
 
I Reubzaet Cinop Oeb 2009v1
I Reubzaet Cinop Oeb 2009v1I Reubzaet Cinop Oeb 2009v1
I Reubzaet Cinop Oeb 2009v1Ireubzaet
 
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare BiscuitCeramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare BiscuitPMI Inc
 
Social Media For Small Business 5 10 11
Social Media For Small Business   5 10 11Social Media For Small Business   5 10 11
Social Media For Small Business 5 10 11mythicgroup
 
T Vs Everywhere Telco Asia 2010
T Vs Everywhere Telco Asia 2010T Vs Everywhere Telco Asia 2010
T Vs Everywhere Telco Asia 2010miguelvinagre
 

Andere mochten auch (16)

Land Taxation and Land Tenure Ethics
Land Taxation and Land Tenure EthicsLand Taxation and Land Tenure Ethics
Land Taxation and Land Tenure Ethics
 
Seul e learning week 2010 (2)
Seul e learning week 2010 (2)Seul e learning week 2010 (2)
Seul e learning week 2010 (2)
 
Obligatoriedad de antecedentes policiales
Obligatoriedad de antecedentes policialesObligatoriedad de antecedentes policiales
Obligatoriedad de antecedentes policiales
 
Chaos in Context: Informed Design Through Analytics
Chaos in Context: Informed Design Through AnalyticsChaos in Context: Informed Design Through Analytics
Chaos in Context: Informed Design Through Analytics
 
Zer da kp aurkezpena
Zer da kp aurkezpenaZer da kp aurkezpena
Zer da kp aurkezpena
 
I Reubzaet Cinop Oeb 2009v1
I Reubzaet Cinop Oeb 2009v1I Reubzaet Cinop Oeb 2009v1
I Reubzaet Cinop Oeb 2009v1
 
Trout
TroutTrout
Trout
 
6 kontekstual
6 kontekstual6 kontekstual
6 kontekstual
 
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare BiscuitCeramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
 
Mammals
MammalsMammals
Mammals
 
Social Media For Small Business 5 10 11
Social Media For Small Business   5 10 11Social Media For Small Business   5 10 11
Social Media For Small Business 5 10 11
 
T Vs Everywhere Telco Asia 2010
T Vs Everywhere Telco Asia 2010T Vs Everywhere Telco Asia 2010
T Vs Everywhere Telco Asia 2010
 
Oosah
OosahOosah
Oosah
 
Mammals
MammalsMammals
Mammals
 
Question Matrix
Question MatrixQuestion Matrix
Question Matrix
 
Benchmarking Article
Benchmarking ArticleBenchmarking Article
Benchmarking Article
 

Ähnlich wie BDD no mundo real

Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Corcioli
 
Core rest edgarsilva_v1
Core rest edgarsilva_v1Core rest edgarsilva_v1
Core rest edgarsilva_v1Edgar Silva
 
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le webMix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le webChristophe Lauer
 
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиковCodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиковCodeFest
 
ADO.NET Entity Framework 4
ADO.NET Entity Framework 4ADO.NET Entity Framework 4
ADO.NET Entity Framework 4Raffaele Fanizzi
 
Une application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuveUne application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuvePhilippe Gamache
 
Tech conf2009 eiji_shinohara
Tech conf2009 eiji_shinoharaTech conf2009 eiji_shinohara
Tech conf2009 eiji_shinoharaEiji Shinohara
 
Chico-UI en escuela DaVinci
Chico-UI en escuela DaVinciChico-UI en escuela DaVinci
Chico-UI en escuela DaVinciNatan Santolo
 
初学者向けセミナー資料
初学者向けセミナー資料初学者向けセミナー資料
初学者向けセミナー資料Kenichi Kanai
 
Komplexe Sites sauber aufbauen
Komplexe Sites sauber aufbauenKomplexe Sites sauber aufbauen
Komplexe Sites sauber aufbauenJens Grochtdreis
 
Lecture1
Lecture1Lecture1
Lecture1orgil
 
Boostのあるプログラミング生活
Boostのあるプログラミング生活Boostのあるプログラミング生活
Boostのあるプログラミング生活Akira Takahashi
 

Ähnlich wie BDD no mundo real (16)

Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.Aspetos gerais de desenvolvimento web.
Aspetos gerais de desenvolvimento web.
 
Soa for DEVs
Soa for DEVsSoa for DEVs
Soa for DEVs
 
Core rest edgarsilva_v1
Core rest edgarsilva_v1Core rest edgarsilva_v1
Core rest edgarsilva_v1
 
Rails iPhone App
Rails iPhone AppRails iPhone App
Rails iPhone App
 
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le webMix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
Mix Paris 2007 - CLaueR - Optimisez l'impact de vos services sur le web
 
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиковCodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
CodeFest 2010. Желтов А. — Погружение в Internet Explorer 9 для разработчиков
 
Türsteher für Bohnen
Türsteher für BohnenTürsteher für Bohnen
Türsteher für Bohnen
 
ADO.NET Entity Framework 4
ADO.NET Entity Framework 4ADO.NET Entity Framework 4
ADO.NET Entity Framework 4
 
Une application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de MainsonneuveUne application en une heure avec symfony - Collège de Mainsonneuve
Une application en une heure avec symfony - Collège de Mainsonneuve
 
Wordpress avançat
Wordpress avançatWordpress avançat
Wordpress avançat
 
Tech conf2009 eiji_shinohara
Tech conf2009 eiji_shinoharaTech conf2009 eiji_shinohara
Tech conf2009 eiji_shinohara
 
Chico-UI en escuela DaVinci
Chico-UI en escuela DaVinciChico-UI en escuela DaVinci
Chico-UI en escuela DaVinci
 
初学者向けセミナー資料
初学者向けセミナー資料初学者向けセミナー資料
初学者向けセミナー資料
 
Komplexe Sites sauber aufbauen
Komplexe Sites sauber aufbauenKomplexe Sites sauber aufbauen
Komplexe Sites sauber aufbauen
 
Lecture1
Lecture1Lecture1
Lecture1
 
Boostのあるプログラミング生活
Boostのあるプログラミング生活Boostのあるプログラミング生活
Boostのあるプログラミング生活
 

Mehr von Giovanni Bassi

O que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosO que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosGiovanni Bassi
 
Analisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETAnalisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETGiovanni Bassi
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraGiovanni Bassi
 
Conhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesConhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesGiovanni Bassi
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Giovanni Bassi
 
C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8Giovanni Bassi
 
Engenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployEngenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployGiovanni Bassi
 
Entrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresEntrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresGiovanni Bassi
 
.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2Giovanni Bassi
 
.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux.NET com contêineres Windows e Linux
.NET com contêineres Windows e LinuxGiovanni Bassi
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraGiovanni Bassi
 
Compartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsCompartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsGiovanni Bassi
 
Construindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsConstruindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsGiovanni Bassi
 
Um mergulho nos containers windows
Um mergulho nos containers windowsUm mergulho nos containers windows
Um mergulho nos containers windowsGiovanni Bassi
 
Por dentro do .NET Core
Por dentro do .NET CorePor dentro do .NET Core
Por dentro do .NET CoreGiovanni Bassi
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com dockerGiovanni Bassi
 
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Giovanni Bassi
 

Mehr von Giovanni Bassi (20)

O que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosO que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviços
 
Sendo ágil com git
Sendo ágil com gitSendo ágil com git
Sendo ágil com git
 
Analisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETAnalisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NET
 
Novidades do c# 7 e 8
Novidades do c# 7 e 8Novidades do c# 7 e 8
Novidades do c# 7 e 8
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agora
 
Conhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesConhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetes
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
 
C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8
 
Engenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployEngenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deploy
 
Entrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresEntrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineres
 
.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2
 
.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agora
 
Compartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsCompartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.js
 
Construindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsConstruindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.js
 
O Futuro do C#: C#8
O Futuro do C#: C#8O Futuro do C#: C#8
O Futuro do C#: C#8
 
Um mergulho nos containers windows
Um mergulho nos containers windowsUm mergulho nos containers windows
Um mergulho nos containers windows
 
Por dentro do .NET Core
Por dentro do .NET CorePor dentro do .NET Core
Por dentro do .NET Core
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com docker
 
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
 

BDD no mundo real

  • 1. Behavior-Driven Development (BDD) no mundo real Giovanni Bassi Lambda3 Lambda3 | MVP | Scrum Developer Trainer | Scrum Trainer giovanni@lambda3.com.br | unplugged.giggio.net | lambda3.com.br
  • 4.
  • 5.  
  • 6. “ Testes me deixam mais lento” “ Eu consigo entender meu código, não preciso de testes” “ Testadores é que devem testar” Devs reclamando
  • 7. “ Programadores não sabem testar” “ Vou perder meu emprego” “ Você não entende nada de testes” Testers reclamando
  • 8. Test Driven Development Assumption Driven Development Duas maneiras de desenhar a aplicação
  • 10. Código difícil de entender Testes são chatos de escrever Código que nunca é usado Acoplamento muito alto Big Design Up Front
  • 12. Quem está falando em testar? TESTES???
  • 13.  
  • 14.  
  • 17. Aumentar a receita Proteger a receita Gerenciar a despesa
  • 18.  
  • 19. Eu quero uma funcionalidade! Qual? Quem quer? Porque?
  • 20. Nasce a user story Nome da história Enquanto <um papel> Eu quero <funcionalidade> Para que <valor para o negócio>
  • 21. Nasce a user story Gherkin Nome da história Para que <valor para o negócio> Enquanto <um papel> Eu quero <funcionalidade>
  • 22. Nasce a user story Trocar de senha Enquanto usuário Eu quero trocar de senha Para que eu possa garantir minha segurança
  • 24.  
  • 25. Trocar de senha Enquanto usuário Eu quero trocar de senha Para que eu possa garantir minha segurança
  • 26. Trocar de senha Dado... Quando... Então... Um usuário logado Solicito a troca de senha A senha é alterada E ativo E a nova senha é válida Um usuário logado Solicito a troca de senha A senha não é alterada E ativo E a nova senha é inválida Um usuário anônimo Solicito a troca de senha Um erro é lançado Cenário 1 Cenário 2 Cenário 3 Funcionalidade
  • 27. E os meus casos de uso?
  • 28. Context Specification AAA Histórias Dizendo a mesma coisa de formas diferentes
  • 29.  
  • 30.  
  • 31. Diz o que quer Captura de maneira abstrata Contribui com cenários concretos Escreve o código com BDD EN AN Dev T Feedback
  • 32.  
  • 33.  
  • 34. Fotografia da cultura de testes e BDD .Net Java Ruby Principalmente NUNit e MSTest, para testes de unidade e de integração. Moq e RhinoMocks para Mocks. BDD com StoryQ, SpecFlow, NBehave e MSpec. Cultura de testes ainda é incipiente. jUnit para testes de unidade e de integração e Selenium para testes de aceitação. jBehave e Calopsita para BDD, mas é raro. jMock e Mockito para Mocks. Cultura de testes varia. TestUnit, RSpec, Cucumber e Shoulda são os mais usados. Testes de unidade e integrado ao longo de toda a stack. Não precisa de framework específico de Mocks. BDD faz parte da cultura de boa parte dos rubistas e testes são muito comuns.
  • 35. Desenvolvendo de fora pra dentro
  • 36. Um usuário logado Solicito a troca de senha A senha é alterada E ativo E a nova senha é válida Um usuário logado Solicito a troca de senha A senha não é alterada E ativo E a nova senha é inválida Um usuário anônimo Solicito a troca de senha Um erro é lançado Rendimentos decrescentes
  • 39. public class UserStory extends DefaultStory { @Test      public void signUpWithANewUser() {         given .theUserDoesntExist( &quot;ceci&quot; );         given .iAmOnTheRootPage();         when .iSignUpAs( &quot;ceci&quot; );         then .iMustBeLoggedInAs( &quot;ceci&quot; );     } }
  • 40. public   class   GivenContexts  {      public   void  iAmOnTheRootPage() {          browser.open( &quot;/calopsita&quot; );      }      public   void  theUserDoesntExist( String  name) { session.createQuery( &quot;delete from User u where u.name = :name&quot; )              .setParameter( &quot;name&quot; , name)              .executeUpdate();      } }
  • 41. public class WhenActions { public void iSignUpAs( String login) { iClickOn( &quot;Sign Up&quot; ); Form form = browser.currentPage().form( &quot;signUp&quot; ); form.field( &quot;user.name&quot; ).type(login); form.field( &quot;user.login&quot; ).type(login); form.field( &quot;user.email&quot; ).type(login + &quot;@caelum.com.br&quot; ); form.field( &quot;user.password&quot; ).type(login); form.field( &quot;user.confirmation&quot; ).type(login); form.submit(); } }
  • 42. public class ThenAsserts { public void iMustBeLoggedInAs( String login) { ContentTag div = div( &quot;user&quot; ); assertThat(div, allOf( containsText(login), containsText( &quot;Logout&quot; ))); } }
  • 43.  
  • 44.    public   abstract   class   AccountSpecs   {      protected   static   Account  fromAccount;      protected   static   Account  toAccount;      Establish  context =()=>     {       fromAccount =  new   Account  {Balance = 1m};       toAccount =  new   Account  {Balance = 1m};     };   }    [ Subject ( typeof ( Account ),  &quot;Funds transfer&quot; )]    public   class   when_transferring_between_two_accounts     :  AccountSpecs   {      Because  of = () =>       fromAccount.Transfer(1m, toAccount);      It  should_debit_the_from_account_by_the_amount_transferred = () =>       fromAccount.Balance.ShouldEqual(0m);      It  should_credit_the_to_account_by_the_amount_transferred = () =>       toAccount.Balance.ShouldEqual(2m);   }
  • 45.  
  • 46.  
  • 47.
  • 48.  
  • 49.

Hinweis der Redaktion

  1. 7 minutos até aqui
  2. Com ADD, você assume que: Vai precisar do código que está escrevendo Sabe o que o cliente precisa Sabe que o código funciona
  3. Não tem nada a ver com testes...
  4. Porque chamamos de testes se não estamos fazendo isso para os testes? BDD é uma nova maneira de ver as coisas Podíamos fazer tudo com TDD antes, mas o mindset impedia Dan North criou o BDD para resolver o problema de mindset 12 minutos
  5. BDD != TDD principalmente porque o vemos de forma diferente
  6. Porque perguntamos o porque
  7. Convite à discussão
  8. Estamos falando de lucro e de ROI
  9. Voltando ao fluxo...
  10. 16 minutos
  11. Acerte as palavras também vale na linguagem com o cliente BDD vai te obrigar a pensar no negócio, modelar o negócio
  12. Nada melhor que DDD pra isso
  13. 19 minutos
  14. Nivel de detalhe dos cenários Não deve virar um caso de uso, com regras, etc
  15. Dev e Tester pareiam, etc... EN: Especialista de negócio DEV: desenvolvedor T: Testador AN: Analista de negócio 27 minutos
  16. Dan North diz que tem que ser unitários O mercado usa muito testes integrados Sugestão: mix de ambos, busque sua maneira, busque o que se adeque melhor à tecnologia que vc está usando De qualquer forma, o foco não é testar
  17. Dan North diz que é pra testar interações, usando mocks Martin Fowler diz que é pra estar estado, usando stubs somente
  18. Não pensamos ainda no que está no meio Conhecemos os cenários, que estão fora Paramos de desenvolver as coisas do meio quando os cenários são atendidos Sempre trabalhando com mocks Nunca acessar infra a partir de negócio
  19. Evolui naturalmente Discutida ao longo do projeto 37 minu tos até aqui