junho 20th, 2011PHP com BDD
Olá,
Nesse Post vou mostrar um pouco de desenvolvimento PHP usando BDD (Behaviour-Driven Development).
O BDD é uma prática ágil que tem como objetivo facilitar o desenvolvimento orientado a testes,
onde o software é direcionados por comportamentos, trazendo para o contexto de destes os casos de uso ou historias da aplicação.
Enquanto em TDD (Test Driven Development) testamos a aplicação de forma granular em um ambiente micro
no BDD os testes são globais voltados para a Funcionalidade, Casos de uso, Comportamentos, etc..
Como se em TDD testamos a aplicação de dentro para fora e já em BDD a aplicação é testada de fora para dentro.
Existe muito material sobre esse assunto p\ ai e muita gente mais preparada que eu para abordar esse assunto de forma teorica,
Então nesse Post vou mostrar na pratica um pouco de desenvolvimento PHP usando o Behat

Behat é um framework BDD em PHP 5.3 construindo sobre de componentes do Symfony2.
Behat foi inspirado no Cucumber do Rails e especialmente a parte da sintaxe das features.
A instalação do Behat pode ser feita baixando diretalente pelo git diretamente pelo do git: http://github.com/Behat/Behat
Ou instalando através do pear :
$ pear channel-discover pear.behat.org $ pear install behat/behat
Se tudo der certo o Behat esta instalado
A versão atualmente disponível no pear é a 1.1.9
Para verificar se esta correto e ver a versão instalada execute :
$ behat -V
Behat version 1.1.9Depois de concluir a instalação o Behat esta pronto para ser usado.
para isso vamos inicializar o projeto de testes com o Behat
$ cd path-to-my-app $ behat --init
O comando behat –init vai criara a estruturar de diretórios usada p\ organizar os teste do Behat
|-- features |-- steps ##Diretório dos arquivos que contem os cenários de testes |-- steps.php |-- support ##Configurações, requires e configs de ambiente |-- bootstrap.php |-- env.php
A definição de um historias e cenários de teste é bem simples.
Utilizando algumas palavras chaves : Feature, Scenario, Given, When, Then, But or And
Os cenários são escritos em arquivos .feature que serão interpretados pelo Behat
features/contacts.feature
Feature: Contacts Registration
In order to demonstrate the framework
As a SouDev using BDD
I want to register contacts
Scenario: Add new contact
Given a contact named "Fabio B. Silva" using the email "fabio.bat.silva@gmail.com"
And the phone "xx xxxx-xxxx"
When press save
Then everything will be saved
Com a historia escrita podemos executar o Behat dentro da aplicação
O Behat vai interpretar os arquivos .feature
e mostrar quais funções vc tem que implementar para poder rodas o teste
$ cd path-to-my-app $ behat 1 scenario (1 undefined) 4 steps (4 undefined) 0m0.03s You can implement step definitions for undefined steps with these snippets: $steps->Given('/^a contact named "([^"]*)" using the email "([^"]*)"$/', function($world, $arg1, $arg2) { throw new \Behat\Behat\Exception\Pending(); }); $steps->And('/^the phone "([^"]*)"$/', function($world, $arg1) { throw new \Behat\Behat\Exception\Pending(); }); $steps->When('/^press save$/', function($world) { throw new \Behat\Behat\Exception\Pending(); }); $steps->Then('/^everything will be saved$/', function($world) { throw new \Behat\Behat\Exception\Pending(); });
Essa definição dos steps que o Behat lançou pode ser copiada para um arquivo de steps.php o que facilita bastante a implementação dos teste..
Porem escrever historias em inglês pode ser meio confuso, mais o tem suporte a i18n oq nos permite escrever as historias em português.
para isso basta adicionar # language: pt_BR no inicio do arquivo .feature
com isso ganhamos as palavras chaves em português : Funcionalidade,Cenario, Scenario, Quando, Então, Entao, Dado, Mas, E
features/contacts.feature
# language: pt_BR
Funcionalidade: Cadastro de contatos
Para demostrar o funcionamento do framework
Como SouDev que usa BDD
Desejo cadastrar contatos
Cenario: Adicionar um novo contato
Dado um usuário chamado "Fabio B. Silva" usando o email "fabio.bat.silva@gmail.com"
E com o telefone "xx xxxx-xxxx"
Quando pressionar salvar
Entao os dados serão salvos
E ao executar novamente o Behat a implementação dos teste agora também vem em português :
$ cd path-to-my-app $ behat 1 scenario (1 undefined) 4 steps (4 undefined) 0m0.03s You can implement step definitions for undefined steps with these snippets: $steps->Dado('/^um usuário chamado "([^"]*)" usando o email "([^"]*)"$/', function($world, $arg1, $arg2) { throw new \Behat\Behat\Exception\Pending(); }); $steps->E('/^com o telefone "([^"]*)"$/', function($world, $arg1) { throw new \Behat\Behat\Exception\Pending(); }); $steps->Quando('/^pressionar salvar$/', function($world) { throw new \Behat\Behat\Exception\Pending(); }); $steps->Entao('/^todos os dados serão salvos$/', function($world) { throw new \Behat\Behat\Exception\Pending(); });
Com essa definição a implementação dos testes para essa feature pode ser feita
features/contacts_steps.php
use App\Entities\Contact, App\Entities\Phone, App\Services\ContactService; $steps->Dado('/^um usuário chamado "([^"]*)" usando o email "([^"]*)"$/', function($world, $arg1, $arg2) { $contact = new Contact(); $contact->setName($arg1); $contact->setEmail($arg2); $world->contact = $contact; }); $steps->E('/^com o telefone "([^"]*)"$/', function($world, $arg1) { $world->contact->addPhone(new Phone($arg1)); }); $steps->Quando('/^pressionar salvar$/', function($world) { $world->saveReturn = ContactService::getInstance()->save($world->contact); }); $steps->Entao('/^todos os dados serão salvos$/', function($world) { assertTrue($world->saveReturn); });
O BDD e TDD são ferramentas essenciais para um software bem feito,
Infeliz mente muitos “desenvolvedores” ainda tem resistência a aderir ao teste e por achar perda de tempo, tedioso, etc..
O fato é que uma suite de testes bem feita vai tornar sua aplicação muito mais estável e vai lhe economizar tempo e cabelos ao longo do projeto. rsrsGostei bastante do Behat é um projeto muito bem estruturado e em constante evolução a versão 2.0 esta prestes a sair
Vale apena dar uma conferida na Documentação do BehatE Para quem tiver o interesse deixei a app no git
https://github.com/FabioBatSilva/bdd-php-behatAbraço e até a próxima….
Click aqui para ver o post Original

Fabio B. Silva
http://www.flexria.com.br

Durante anos estivemos dedicados ao desenvolvimento de Aplicações Ricas. Durante anos estivemos dedicados a tecnologias como o Adobe Flex, BlazeDS, LiveCycle Data Services, Zend AMF, AMF PHP, Adobe Flash Professional, Flash Media Server, etc. Mas, principalmente, durante anos estivemos dedicados a compartilhar o nosso conhecimento com a comunidade. 


