Sie sind auf Seite 1von 8

11/02/2016

MudandodeTDDparaBDDComBehateSymfony2

imasters.com.br > Portal Fruns 7Masters Revista Cursosonline Agenda MacMagazine


/DESIGN

/DESENVOLVIMENTO

/BANCODEDADOS

Eventos:

PHPExperience

/MKTDIGITAL

InterCon

DeveloperWeekPOA DevCommerce

/INFRA

/DESENVOLVIMENTO

MudandodeTDDparaBDD
ComBehateSymfony2
FrancescoTassiemDesenvolvimento,PHP
quintafeira,21denovembrode2013

SHARES

Recentemente comecei um pequeno projeto extra com um

A+ A

colega do meu PHP User Group local, j que o projeto era bastante
simples e ns dois estvamos dispostos a aprender algo novo, e
decidimos fazer uma tentativa com BDD. No mundo PHP, BDD significa
Behat, Mink e PHPSpec.

Trabalhar em um projeto real sempre diferente de lidar com


documentao, e tivemos que passar por vrios problemas diferentes. A
maioria desses problemas relacionada com os nossos velhos hbitos com
frameworks de testes XUnit e e alguns outros devido nossa dificuldade
em nos acostumar com APIs diferentes.

Neste artigo, eu no cobrirei todos os detalhes sobre BDD, Behat ou


PHPSpec, prefiro descrever como eu mudei de PHPUnit e TDD para BDD
(e tambm mostrar alguns pedaos de cdigo).

Mudar de TDD para BDD no realmente sobre bibliotecas, mais sobre


como mudar a sua mentalidade de testar para descrever. A comunicao
realmente rei aqui. Pode parecer um pouco bobo, mas ter que voc no
est verificando se o seu cdigo est funcionando, e sim descrevendo
como ele deve funcionar, realmente a chave para tudoNEWSLETTER
isso. Voc

Fiquepordentrodetodasasnovidades,eventos,
cursosemuitomais

poderia fazer BDD usando PHPUnit em vez de Behat ou PHPSpec no


seunome

uma questo de ferramentas, e sim de como voc est abordando seu


seuemail

cdigo.

ENVIAR

http://imasters.com.br/linguagens/php/mudandodetddparabddcombehatesymfony2/?trace=1519021197&source=single

1/8

11/02/2016

MudandodeTDDparaBDDComBehateSymfony2

Dito isso, as ferramentas so importantes, e descobri que tanto Behat e


PHPSpec fazem um grande trabalho ajudando voc a mudar a sua
mentalidade de testar para descrever.

Os componentes
O primeiro passo entender com que biblioteca voc tem que lidar:

Behat o verdadeiro patro: o framework de testes . Ele permite que


voc escreva as expectativas em linguagem gherkin.
Mink uma biblioteca de testes de aceitao web. Ele permite que voc
escreva testes para sua aplicao web. Voc poderia us-lo como uma
biblioteca isolada de testes, mas us-lo com Behat a maneira mais
divertida.
MinkExtension a cola entre Behat e Mink. A extenso vai configurar e
inicializar Mink, e voc vai ser capaz de us-la dentro das classes
*Context do Behat.
Symfony2Extension lhe d acesso ao kernel do Symfony a partir das
classes *Context do Behat e fornece uma sesso Symfony2 para Mink.

A fim de colocar todas essas peas no lugar, voc pode seguir a


documentao oficial, eu no vou repetir todos os passos aqui.

Organizando seus testes


Symfony2Extension lhe d a possibilidade de ter os arquivos de recursos
separados para cada pacote, ou mant-los todos juntos no nvel do
aplicativo. Optei por manter os recursos no nvel do aplicativo. Dado que
os recursos so uma descrio do aplicativo como um todo, no soa
natural para mim t-los separados por pacote. Organizao em pacotes
um detalhe de implementao e eu no quero esse tipo de detalhe
exposto em meus recursos gherkin. claro que essa uma deciso
muito pessoal, e voc deve pensar em como quer manter seus arquivos
de recurso organizados.

Se voc, como eu, quer manter todos os arquivos que possui em


conjunto em nvel de aplicao, voc tem que defini-lo em seu arquivo de
http://imasters.com.br/linguagens/php/mudandodetddparabddcombehatesymfony2/?trace=1519021197&source=single

2/8

11/02/2016

MudandodeTDDparaBDDComBehateSymfony2

configurao:

1
2
3
4
5

behat.yml

default:
paths:
features:features

Uma vez que voc comea a escrever recursos, tambm comea a


implementar passos em suas classes *Context.

Na minha opinio, esta a parte mais difcil.

Classes *Contextde crescem muito rpido; enquanto voc est testando


o aplicativo, voc est implementando continuamente novos passos e
sempre tem que manter seus arquivos de recursose suas classes
*Context fceis de ler.

Isso significa que voc precisa definir passos macro e tem que organizlos em sub- contextos, a fim de manter seu cdigo claro. Voc tambm
vai precisar se acostumar a fazer uma definio passo a passo de
implementao, o que pode ser um pouco confuso no incio.

Eu acho que isso no uma coisa que voc possa aprender com a
documentao, voc vai precisar de um pouco de experincia para ficar
bom nisso. Nesta primeira experincia, eu senti a necessidade de
refatorar e reorganizar minhas etapas de implementao algumas vezes,
at mesmo com um pequeno conjunto de testes. A coisa boa que toda
vez que voc move o cdigo, voc sentir que seu entendimento do
domnio se torna mais profundo. Toda vez que uma etapa comeava a
dar errado, era porque eu estava deixando passar algo em meu domnio,
e cada refatorao me levou a um melhor entendimento da aplicao que
eu estava construindo.

Iniciando os testes
Logo aps a configurao do Behat, eu comecei a escrever recursos para
o meu aplicativo. Eu no escrevi um nico recurso, eu escrevi um monte
deles, s para esclarecer o quadro geral e para me ajudar a decidir por
http://imasters.com.br/linguagens/php/mudandodetddparabddcombehatesymfony2/?trace=1519021197&source=single

3/8

11/02/2016

MudandodeTDDparaBDDComBehateSymfony2

onde comear.

Imediatamente depois de escrever os primeiros cenrios, percebi que eu


no queria execut-los todos juntos; em vez disso, eu teria gostado de
marcar alguns cenrios como estou trabalhando nisso e outros como
vou trabalhar nisso mais tarde ou isso est pronto.

Marcao era o que eu estava procurando.

Eu marquei todos os cenrios como @tbd, o que eu estava realmente


trabalhando era @wip e ento eu defini alguns perfis em behat.yml:

1
2
3
4
5
6
7
8

behat.tml

default:
filters:
tags:"~@tbd"
wip:
filters:
tags:"@wip"

Com essa configurao, a execuo:

bin/behat

Eu era capaz de executar todos os cenrios no marcados com @tbd e


em execuo:

bin/behatprofilewip

Eu era capaz de executar o cenrio do atual trabalho em andamento.

Isto muito bom: ter perfis diferentes bastante semelhante a ter


diferentes sutes, e excluir a tag @tbd do perfil padro me permitiu
executar todos os cenrios sem ter a perturbao dos passos nodefinidos nas etapas que no foram implementadas.

Esse no era o meu primeiro projeto guiado por testes, mas eu nunca
tinha escrito um monte de testes funcionais antes da implementao.
Normalmente eu teria escrito o teste para o prximo recurso e ento o eu
http://imasters.com.br/linguagens/php/mudandodetddparabddcombehatesymfony2/?trace=1519021197&source=single

4/8

11/02/2016

MudandodeTDDparaBDDComBehateSymfony2

teria implementado. Escrever em linguagem gherkinme ajudou a definir


um conjunto muito maior de especificaes, o que muito bom porque
me deu a ideia geral do que eu estava fazendo.

Eu acho que essa uma das grandes vantagens de BDD: ele realmente
muda a forma como voc pensa sobre sua aplicao. Claro, agora que
eu percebi isso, poderia fazer a mesma coisa usando o bom e velho
PHPUnit, mas antes desse exerccio eu nunca havia focado em descrever
um conjunto de funcionalidades com uma sute de testes antes da
codificao.

Trabalhar com um banco de


dados
Testes funcionais de sua aplicao significam lidar com um banco de
dados e acessrios. As regras bsicas so sempre as mesmas: voc quer
ter uma base de dados limpa no incio de cada teste, ento voc vai
preench-la com dados pr-definidos e depois voc vai fazer afirmaes
contra ela. Ter um ponto de partida limpo para cada cenrio a chave
para evitar as dependncias entre eles.

A principal diferena entre Behat e seu velho e bom teste funcional que
voc no vai definir um conjunto de dispositivos eltricos em seu mtodo

setUp(); em vez disso, voc ir definir um conjunto de passos.

1
2

Giventhereisa"user1"Userinthedatabase
Andthereare2bookableCourts

Behat expe vrios hooks que voc pode usar para executar aes como
dropping e a construo do banco de dados; eu usei @BeforeScenario
para isso, com uma implementao um pouco diferente do mtodo
loadFixtures LiipFunctionalTestBundle Aqui est minha implementao :

1
2
3
4
5
6
7

publicfunctioncleanDatabase()
{
$container=$this>kernel>getContainer();
$registry=$container>get('doctrine');
$om=$registry>getManager();
$type='ORM';

8 $executorClass='Doctrine\\Common\\DataFixtures\\Executor\\'
http://imasters.com.br/linguagens/php/mudandodetddparabddcombehatesymfony2/?trace=1519021197&source=single
5/8

11/02/2016

MudandodeTDDparaBDDComBehateSymfony2

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

$executorClass='Doctrine\\Common\\DataFixtures\\Executor\\'
$referenceRepository=newProxyReferenceRepository(
$cacheDriver=$om>getMetadataFactory()>getCacheDriver();

if($cacheDriver){
$cacheDriver>deleteAll();
}

$connection=$om>getConnection();
if($connection>getDriver()instanceOfSqliteDriver){
$params=$connection>getParams();
$name=isset($params['path'])?$params['path'

if(!isset(self::$cachedMetadatas)){
self::$cachedMetadatas=$om>getMetadataFactory()>getA
}
$metadatas=self::$cachedMetadatas;

//TODO:handlecasewhenusingpersistentconnections.Fail
$schemaTool=newSchemaTool($om);
$schemaTool>dropDatabase($name);
if(!empty($metadatas)){
$schemaTool>createSchema($metadatas);
}

$executor=new$executorClass($om);
$executor>setReferenceRepository($referenceRepository
}

$purgerClass='Doctrine\\Common\\DataFixtures\\Purger\\'
$purger=new$purgerClass();
$executor=new$executorClass($om,$purger);
$executor>setReferenceRepository($referenceRepository
$executor>purge();

return$executor;
}

Essa implementao no realmente otimizada para desempenho, mas


foi o suficiente para o meu projeto, que teve um pequeno banco de dados
e poucos cenrios. Talvez para um caso de uso mais complexo, voc vai
precisar de uma maneira mais eficiente de eliminar e recriar o banco de
dados (talvez com algum tipo de cache do arquivo sqlite ?).

Concluso
Acho que vou continuar a explorar com BDD. Ferramentas so maduras e
estveis o suficiente, e todo o ecossistema parece slido e pronto para
usar. Behat e Mink so timas ferramentas, PHPSpec (que eu vou
abordar em outro artigo) to bom quanto.

Eu ainda no encontrei as melhores prticas. No tenho certeza de que


http://imasters.com.br/linguagens/php/mudandodetddparabddcombehatesymfony2/?trace=1519021197&source=single

6/8

11/02/2016

MudandodeTDDparaBDDComBehateSymfony2

estou sempre fazendo a coisa certa e eu tenho alguns velhos hbitos que
preciso perder, mas a impresso geral muito boa.

***

Artigo traduzido pela Redao iMasters, com autorizao do autor.


Publicado originalmente em
http://www.ftassi.com/blog/2013/08/12/switching-from-tdd-to-bdd-withbehat-and-symfony2/

Mensagemdoanunciante:

Conhea a Umbler, startup de Cloud Hosting por demanda feita para agncias e desenvolvedores. Experimente grtis!

FrancescoTassiemDesenvolvimento,PHP
quintafeira,21denovembrode2013

SHARES

leiaagora

HooksdoGitepr
processadoresCSS

DavidWalsh
emDesenvolvimento

Comentrios
Oseuendereodeemailnoserpublicado.Camposobrigatriossomarcadoscom*

Nome

Email

Participedadiscusso,lembresedeserrespeitosoeconstrutivo:)

enviar

Este projeto mantido e patrocinado pelas empresas:

http://imasters.com.br/linguagens/php/mudandodetddparabddcombehatesymfony2/?trace=1519021197&source=single

7/8

11/02/2016

MudandodeTDDparaBDDComBehateSymfony2

Hospedado por:

Desenvolvimento

Design

Bancodedados

MarketingDigital

Agenda

CursosOnline

Agile

3dsmax

Interbase

ContedoDigital

Ajax

Acessibilidade

MongoDB

Ecommerce

Frum

InterCon

AnlisedeDados

Arquiteturade
Informao

MySQL

EmailMarketing

7Masters

RevistaiMasters

Oracle

Mercado

PostgreSQL

PublicidadeOnline

SQLServer

RedesSociais

CakePHP
CSS
FrontEnd
HTML
Java

DesignResponsivo
Games
Usabilidade
UserExperience

Tendncias
InfraeCloud

JavaScript

CloudComputing

Mobile

PHP

Linux

Android

Python

MicrosoftAzure

iPhone&iPad

Ruby

Segurana
SiteBlindado

SobreoiMasters

PolticadePrivacidade

Faleconosco

iMastersExpert(englishblog)

http://imasters.com.br/linguagens/php/mudandodetddparabddcombehatesymfony2/?trace=1519021197&source=single

8/8

Das könnte Ihnen auch gefallen