
Desenvolvimento guiado pelo comportamento da aplicação é o que todos deveriam fazer sempre, de forma bastante resumida é definir com o cliente como a aplicação deve se comportar, escrever um teste automatizado para verificar este comportamento e depois escrever código suficiente para fazer o comportamento da aplicação ficar de acordo com o que o cliente deseja.
A diferença básica do Behaviour Driven Development (de agora em diante simplesmente BDD) para o desenvolvimento orientado por testes, é que o BDD coloca em foco o valor para o negócio que o software vai adicionar. Parece ser uma diferença puramente conceitual mas não é, por exemplo:
A tela inicial deve listar todos os clientes
Não é a mesma coisa que
O método HomeController.index precisa popular a variável @clientes
Claro que não são só estas diferenças, trabalhando mais com BDD percebe-se que ele poupa muito mais trabalho do que o TDD simples (Não que TDD seja simples de se adotar). BDD tem todas as vantagens de TDD e mais algumas, veja as duas listas abaixo:
Test Driven Development:
Behavior Driven Development:
Ou seja, alem de gerar um código com mais qualidade, o BDD poupa trabalho de toda a equipe e o principal, melhora a comunicação, que tanto para quem trabalha com metodologias ágeis quanto para quem não trabalha é extremamente importante e a falta dela é um problema gravíssimo que leva diversos projetos ao fracasso. Na minha opinião, só o fato de melhorar a comunicação já é motivo o suficiente para testar BDD.
Claro que alguns dos benefícios que eu citei dependem do suporte de ferramentas, para ser mais preciso, as User Stories serem o código executável dos testes de aceitação depende de uma ferramenta para ser verdade, e a ferramenta que eu escolhi para isto é o Cucumber, do qual eu vou começar a falar com mais freqüência aqui no blog.
Eu pessoalmente encaro o BDD como uma evolução do TDD, eu sempre tive dificuldades em escrever testes unitários antes do código da aplicação, claro que para bibliotecas é fácil, mas para a interface com o usuário que consome boa parte do código da aplicação é bem complicado escrever testes estilo XUnit, mas quando as user stories se tornaram o código executável dos testes de aceitação da UI (pelo menos os básicos desconsiderando o layout) um novo mundo se abriu para mim e tudo passou a fazer sentido.
para quem não percebeu este sub-titulo é uma brincadeira com a tradução da palavra cucumber que quer dizer pepino
Cucumber é uma ferramenta que torna possível executar histórias em texto puro, ele é uma ferramenta escrita em Ruby que veio para substituir o RSpec Story Runner, e tem diversas vantagens sobre este.
O Cucumber, utiliza Ruby e expressões regulares para definir o que qualquer expressão quer dizer, mas antes de entrar nestes pormenores vamos entender um pouquinho da estrutura básica que o Cucumber define para as User Stories.
Para que seja possível executar uma User Storie utilizando o Cucumber, ela precisa ter uma estrutura básica.
Esta é uma forma de definir a estrutura básica de um arquivo .feature do Cucumber, claro que explicando desta forma estas definições se encaixam em muita coisa, então vamos ser um pouco mais especificos.
O Cucumber define algumas palavras chave para cada uma destas sessões, estas palavras chave podem ser traduzidas para diversas linguas, o primeiro exemplo eu vou colocar em ingês, depois vou mostrar o equivalente em portugues, mais adiante quando entrarmos na parte de configurações do cucumber vamos ver melhor como selecionar a lingua utilizada, e como customizar isto, mas por enquanto fiquemos com as configurações padrão.
Feature: Simple math In order to avoid silly mistakes As a math idiot I want to be told the result of simple math operations Scenario: adition Given I have entered 50 into the calculator And I have entered 70 into the calculator When I press add Then I should see 120 on the screen Scenario: subtraction Given I have entered 60 into the calculator And I have entered 30 into the calculator When I press sub Then I should see 30 on the screen
Este é o exemplo de uma história bem simples que o cucumber pode interpretar, as palavras chave apresentadas são:
Estas mesmas palavras podem ser traduzidas para o portugues como:
Utilizando estas palavras chave, seria possível escrever esta história assim em portugues:
Funcionalidade: Matemática Simples Para evitar erros idiotas Como um completo ignorante em matemática Eu quero que operações simples de matemática sejam resolvidas para mim Cenário: adição Dado que eu digite 50 na calculadora E que eu digite 70 na calculadora Quando eu precionar "Adicione" Então eu devo ver 120 na tela Cenário: subtração Dado que eu digite 60 na calculadora E que eu digite 30 na calculadora Quando eu precionar "Subtraia" Então eu devo ver 30 na tela
O legal é que esta histórinha poderia ser escrita por um usuário, as únicas regras reais são:
A estrutura que utilizei na descrição da funcionalidade não esta descrita em palavras chave por que ela não é interpretada pelo cucumber, é apenas uma descrição e o formato pode variar um pouco.
Mas por que utilizar esta ferramenta para testes em vez de qualquer outra?
Por que utilizar o cucumber como ferramenta de testes vai viabilizar uma abordagem BDD no desenvolvimento do seu sistema, e que isto vai te poupar muito dinheiro.
Acho que era isto, falei um pouco de BDD, um monte de Cucumber e acho que consegui mostrar a idéia geral, mas isto vai ficar um pouco mais claro nos próximos posts sobre o Cucumber.
PS.: parabéns pela paciência se você leu até aqui
Belo post, Uruba!
Além de ter ensinado a se virar com o Cucumber ainda deu de lambuja vários argumentos que serão necessários para vencer a resistência aos testes dentro da empresa. Parabéns!
Sabe me dizer como eu posso usar o Cucumber com projetos .Net?
Existe a documentação no site do Cucumber mão não entendi.
Tem mais de uma forma de fazer isto tem o Cuke4Duke que eu não gostei muito, mas também pode ser feito via Selenium ou Watir (prefiro fazer com o Watir, mas o selenium é uma boa pedida também).
Vou escrever um post sobre isto daqui a um tempo, acho que na semana que vem sai o primeiro
Opa, o do .NET é Cuke4Nuke Cuke4Duke é para java e eu também não curti muito
Legal,
Então para .Net você prefere Selenium ou Watir no lugar do Cucumber para testes de comportamento?
yeap, qualquer uma das duas opções ta valendo
Se usar o Watir tem um adapter do webrat que permite utilizar praticamente a mesma sintaxe usada nos testes do Rails
Muito bom! bastante objetivo e didático. Parabéns!!!!!
Mmm.. interessante!
No caso, usando o Watir (que roda em Ruby) ele pode testar a aplicação .Net. Ele seria “chamado” pelo MSBuild, por exemplo?
Poderia então ser integrado ao Subversion que cria uma build ao fazer commit? Ou usando um sistema de integração contínua como o Cruise Control?
o MSBuild não chama o cucumber não, pelo menos não sei como fazer isto, mas uma coisa não influencia na outra.
Estou considerando que você esta falando de uma aplicação Web caso contrario a única solução seria o Cuke4Nuke mesmo.
Se o teu subversion for integrado com algum sistema de CI ele pode sim disparar o build mas isto n”ao tem muito a ver com o cucumber, o cucumber seria só um passo do build que foi disparado pelo Cruise Control por exemplo.
Bacanasso o post!
Tenho buscado passar as idéias de TDD e implementa-las de forma sustentável não apenas no Rails, mas no PHP por exemplo, e vários pontos e argumentações foram muito bem colocadas para situar o BDD como uma evolução sensata ao TDD.
Parabenzasso!
[...] Cucumber e BDD – Vantagens para a empresa (Argumentos para o gerente, para o arquiteto, para o pre… [...]
[...] Desenvolvimento Guiado pelo Comportamento (BDD – Behaviour Driven Development) – Urubatan (Blog do Urubatan); [...]
[...] Desenvolvimento Guiado pelo Comportamento (BDD – Behaviour Driven Development) – Urubatan (Blog do Urubatan); [...]
[...] Texto do blog do Urubatam: http://www.urubatan.com.br/cucumber-e-bdd-vantagens-para-a-empresa-argumentos-para-o-gerente-para-o-... [...]