Upload
oda-san
View
218
Download
0
Embed Size (px)
Citation preview
8/19/2019 Mudando de TDD Para BDD Com Behat e Symfony2
1/8
11/02/2016 Mudando de TDD para BDD Com Behat e Symfony2 -
http://imasters.com.br/linguagens/php/mudando-de-tdd-para-bdd-com-behat-e-symfony2/?trace=1519021197&source=single 1/8
imasters.com.br > Portal Fóruns 7Masters Revista Cursos online Agenda MacMagazine Eventos: PHP Experience InterCon Developer Week POA DevCommerce
A-A+
Mudando de TDD para BDDCom Behat e Symfony2
Recentemente comecei um pequeno projeto extra com um
colega do meu PHP User Group local, já que o projeto era bastante
simples e nós dois estávamos 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
documentação, e tivemos que passar por vários problemas diferentes. A
maioria desses problemas relacionada com os nossos velhos hábitos com
frameworks de testes XUnit e e alguns outros devido à nossa dificuldade
em nos acostumar com APIs diferentes.
Neste artigo, eu não cobrirei todos os detalhes sobre BDD, Behat ou
PHPSpec, prefiro descrever como eu mudei de PHPUnit e TDD para BDD
(e também mostrar alguns pedaços de código).
Mudar de TDD para BDD não é realmente sobre bibliotecas, é mais sobre
como mudar a sua mentalidade de testar para descrever. A comunicação
é realmente rei aqui. Pode parecer um pouco bobo, mas ter que você não
está verificando se o seu código está funcionando, e sim descrevendo
como ele deve funcionar, realmente é a chave para tudo isso. Você
poderia fazer BDD usando PHPUnit em vez de Behat ou PHPSpec – não
é uma questão de ferramentas, e sim de como você está abordando seu
código.
/DESENVOLVIMENTO
Francesco Tassi em Desenvolvimento, PHP
quinta-feira, 21 de novembro de 2013
SHARES
/ DE SI GN / DE SE NV OL VI ME NT O / BA NC O D E D AD OS / MK T D IG IT AL / IN FR A
NEWSLETTERFique por dentro de todas as novidades, eventos,
cursos e muito mais
seu nome
seu e-mail
ENVIAR
X
http://www.twitter.com/iMastershttps://www.facebook.com/PortaliMastershttp://imasters.com.br/infra/http://imasters.com.br/marketing-digital/http://imasters.com.br/banco-de-dados/http://imasters.com.br/desenvolvimento/http://imasters.com.br/design/http://imasters.com.br/https://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fimasters.com.br%2Flinguagens%2Fphp%2Fmudando-de-tdd-para-bdd-com-behat-e-symfony2%2F%3Ftrace%3D1519021197%26%23038%3Bsource%3Dsingle&title=Mudando%20de%20TDD%20para%20BDD%20Com%20Behat%20e%20Symfony2https://plus.google.com/share?url=http%3A%2F%2Fimasters.com.br%2Flinguagens%2Fphp%2Fmudando-de-tdd-para-bdd-com-behat-e-symfony2%2F%3Ftrace%3D1519021197%26%23038%3Bsource%3Dsinglehttps://twitter.com/share?text=Acabei%20de%20ver%20%22Mudando%20de%20TDD%20para%20BDD%20Com%20Behat%20e%20Symfony2%22%20Clique%20pra%20ver%20tamb%C3%A9m%20-%20&url=http%3A%2F%2Fimasters.com.br%2Flinguagens%2Fphp%2Fmudando-de-tdd-para-bdd-com-behat-e-symfony2%2F%3Ftrace%3D1519021197%26%23038%3Bsource%3Dsingle&via=iMastershttps://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fimasters.com.br%2Flinguagens%2Fphp%2Fmudando-de-tdd-para-bdd-com-behat-e-symfony2%2F%3Ftrace%3D1519021197%26%23038%3Bsource%3Dsinglehttp://imasters.com.br/perfil/francescotassi/?trace=3182418120&source=singlehttp://imasters.com.br/secao/linguagens/php/http://imasters.com.br/secao/desenvolvimento/http://www.vtex.com.br/http://www.stelo.com.br/http://www.mundipagg.com.br/http://developers.mercadolibre.com/http://www.b2wdigital.com/http://www.phpspec.net/http://mink.behat.org/http://behat.org/http://marche.grusp.org/http://devcommerce.imasters.com.br/http://developerweek.imasters.com.br/porto-alegrehttp://intercon.imasters.com.br/http://phpexperience2016.imasters.com.br/http://www.macmagazine.com.br/http://imasters.com.br/agendahttp://cursos.imasters.com.br/http://www.imasters.com.br/revistahttp://setemasters.imasters.com.br/http://forum.imasters.com.br/http://imasters.com.br/http://imasters.com.br/
8/19/2019 Mudando de TDD Para BDD Com Behat e Symfony2
2/8
11/02/2016 Mudando de TDD para BDD Com Behat e Symfony2 -
http://imasters.com.br/linguagens/php/mudando-de-tdd-para-bdd-com-behat-e-symfony2/?trace=1519021197&source=single 2/8
Dito isso, as ferramentas são importantes, e descobri que tanto Behat e
PHPSpec fazem um grande trabalho ajudando você a mudar a sua
mentalidade de testar para descrever.
Os componentesO primeiro passo é entender com que biblioteca você tem que lidar:
A fim de colocar todas essas peças no lugar, você pode seguir a
documentação oficial, eu não vou repetir todos os passos aqui.
Organizando seus testesSymfony2Extension lhe dá a possibilidade de ter os arquivos de recursos
separados para cada pacote, ou mantê-los todos juntos no nível do
aplicativo. Optei por manter os recursos no nível do aplicativo. Dado que
os recursos são uma descrição do aplicativo como um todo, não soa
natural para mim tê-los separados por pacote. Organização em pacotes é
um detalhe de implementação e eu não quero esse tipo de detalhe
exposto em meus recursos gherkin. É claro que essa é uma decisão
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 nível de aplicação, você tem que defini-lo em seu arquivo de
Behat é o verdadeiro patrão: o framework de testes . Ele permite quevocê escreva as expectativas em linguagem gherkin.
Mink é uma biblioteca de testes de aceitação web. Ele permite que vocêescreva testes para sua aplicação web. Você poderia usá-lo como umabiblioteca isolada de testes, mas usá-lo com Behat é a maneira mais
divertida.
MinkExtension é a cola entre Behat e Mink. A extensão vai configurar einicializar 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 dasclasses *Context do Behat e fornece uma sessão Symfony2 para Mink.
http://extensions.behat.org/symfony2/
8/19/2019 Mudando de TDD Para BDD Com Behat e Symfony2
3/8
11/02/2016 Mudando de TDD para BDD Com Behat e Symfony2 -
http://imasters.com.br/linguagens/php/mudando-de-tdd-para-bdd-com-behat-e-symfony2/?trace=1519021197&source=single 3/8
configuração:
Uma vez que você começa a escrever recursos, também começa a
implementar passos em suas classes *Context.
Na minha opinião, esta é a parte mais difícil.
Classes *Contextde crescem muito rápido; enquanto você está testando
o aplicativo, você está implementando continuamente novos passos e
sempre tem que manter seus arquivos de recursos e suas classes
*Context fáceis de ler.
Isso significa que você precisa definir passos macro e tem que organizá-
los em sub- contextos, a fim de manter seu código claro. Você também
vai precisar se acostumar a fazer uma definição passo a passo de
implementação, o que pode ser um pouco confuso no início.
Eu acho que isso não é uma coisa que você possa aprender com a
documentação, você vai precisar de um pouco de experiência para ficar
bom nisso. Nesta primeira experiência, eu senti a necessidade de
refatorar e reorganizar minhas etapas de implementação algumas vezes,
até mesmo com um pequeno conjunto de testes. A coisa boa é que toda
vez que você move o código, você sentirá que seu entendimento dodomínio se torna mais profundo. Toda vez que uma etapa começava a
dar errado, era porque eu estava deixando passar algo em meu domínio,
e cada refatoração me levou a um melhor entendimento da aplicação que
eu estava construindo.
Iniciando os testesLogo após a configuração do Behat, eu comecei a escrever recursos para
o meu aplicativo. Eu não escrevi um único recurso, eu escrevi um monte
deles, só para esclarecer o quadro geral e para me ajudar a decidir por
1 behat.yml2 3 default:4 paths:5 features: features
http://docs.behat.org/guides/2.definitions.html#step-execution-chaining
8/19/2019 Mudando de TDD Para BDD Com Behat e Symfony2
4/8
11/02/2016 Mudando de TDD para BDD Com Behat e Symfony2 -
http://imasters.com.br/linguagens/php/mudando-de-tdd-para-bdd-com-behat-e-symfony2/?trace=1519021197&source=single 4/8
onde começar.
Imediatamente depois de escrever os primeiros cenários, percebi que eu
não queria executá-los todos juntos; em vez disso, eu teria gostado de
marcar alguns cenários como “estou trabalhando nisso” e outros como
“vou trabalhar nisso mais tarde” ou “isso está pronto”.
Marcação era o que eu estava procurando.
Eu marquei todos os cenários como @tbd, o que eu estava realmente
trabalhando era @wip e então eu defini alguns perfis em behat.yml:
Com essa configuração, a execução:
Eu era capaz de executar todos os cenários não marcados com @tbd e
em execução:
Eu era capaz de executar o cenário do atual “trabalho em andamento”.
Isto é muito bom: ter perfis diferentes é bastante semelhante a ter
diferentes suítes, e excluir a tag @tbd do perfil padrão me permitiu
executar todos os cenários sem ter a perturbação dos passos não-
definidos nas etapas que não foram implementadas.
Esse não era o meu primeiro projeto guiado por testes, mas eu nunca
tinha escrito um monte de testes funcionais antes da implementação.
Normalmente eu teria escrito o teste para o próximo recurso e então o eu
1 behat.tml2 3 default:4 filters:5 tags: "~@tbd"6 wip:7 filters:8 tags: "@wip"
1 bin/behat
1 bin/behat ‐‐profile wip
8/19/2019 Mudando de TDD Para BDD Com Behat e Symfony2
5/8
11/02/2016 Mudando de TDD para BDD Com Behat e Symfony2 -
http://imasters.com.br/linguagens/php/mudando-de-tdd-para-bdd-com-behat-e-symfony2/?trace=1519021197&source=single 5/8
teria implementado. Escrever em linguagem gherkin me ajudou a definir
um conjunto muito maior de especificações, 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 aplicação. Claro, agora queeu percebi isso, poderia fazer a mesma coisa usando o bom e velho
PHPUnit, mas antes desse exercício eu nunca havia focado em descrever
um conjunto de funcionalidades com uma suíte de testes antes da
codificação.
Trabalhar com um banco de
dados Testes funcionais de sua aplicação significam lidar com um banco de
dados e acessórios. As regras básicas são sempre as mesmas: você quer
ter uma base de dados limpa no início de cada teste, então você vai
preenchê-la com dados pré-definidos e depois você vai fazer afirmações
contra ela. Ter um ponto de partida limpo para cada cenário é a chave
para evitar as dependências entre eles.
A principal diferença entre Behat e seu velho e bom teste funcional é que
você não vai definir um conjunto de dispositivos elétricos em seu método
setUp(); em vez disso, você irá definir um conjunto de passos.
Behat expõe vários hooks que você pode usar para executar ações como
dropping e a construção do banco de dados; eu usei @BeforeScenario
para isso, com uma implementação um pouco diferente do método
loadFixtures LiipFunctionalTestBundle Aqui está minha implementação :
1 Given there is a "user1" User in the database2 And there are 2 bookable Courts
1 public function cleanDatabase()2 {3 $container = $this‐>kernel‐>getContainer();4 $registry = $container‐>get('doctrine');5 $om = $registry‐>getManager();6 $type = 'ORM';7
https://github.com/liip/LiipFunctionalTestBundle/blob/master/Test/WebTestCase.php#L228http://docs.behat.org/guides/3.hooks.html#hooks
8/19/2019 Mudando de TDD Para BDD Com Behat e Symfony2
6/8
11/02/2016 Mudando de TDD para BDD Com Behat e Symfony2 -
http://imasters.com.br/linguagens/php/mudando-de-tdd-para-bdd-com-behat-e-symfony2/?trace=1519021197&source=single 6/8
Essa implementação não é realmente otimizada para desempenho, mas
foi o suficiente para o meu projeto, que teve um pequeno banco de dados
e poucos cenários. 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 ?).
Conclusão Acho que vou continuar a explorar com BDD. Ferramentas são maduras e
estáveis o suficiente, e todo o ecossistema parece sólido e pronto para
usar. Behat e Mink são ótimas ferramentas, PHPSpec (que eu vou
abordar em outro artigo) é tão bom quanto.
Eu ainda não encontrei as melhores práticas. Não tenho certeza de que
8 $executorClass = 'Doctrine\\Common\\DataFixture9 $referenceRepository = new ProxyReferenceReposit
10 $cacheDriver = $om‐>getMetadataFactory()‐>getCac11 12 if ($cacheDriver) {13 $cacheDriver‐>deleteAll();14 }15 16 $connection = $om‐>getConnection();17 if ($connection‐>getDriver() instanceOf SqliteDr18 $params = $connection‐>getParams();19 $name = isset($params['path']) ? $params['pa20 21 if (!isset(self::$cachedMetadatas)) {22 self::$cachedMetadatas = $om‐>getMetadat23 }24 $metadatas = self::$cachedMetadatas;25 26 // TODO: handle case when using persistent27 $schemaTool = new SchemaTool($om);28 $schemaTool‐>dropDatabase($name);29 if (!empty($metadatas)) {
30 $schemaTool‐>createSchema($metadatas);31 }32 33 $executor = new $executorClass($om);34 $executor‐>setReferenceRepository( $referenc35 }36 37 $purgerClass = 'Doctrine\\Common\\DataFixtures\38 $purger = new $purgerClass();39 $executor = new $executorClass($om, $purger);40 $executor‐>setReferenceRepository( $referenceRep41 $executor‐>purge();
42 43 return $executor;44 }
8/19/2019 Mudando de TDD Para BDD Com Behat e Symfony2
7/8
11/02/2016 Mudando de TDD para BDD Com Behat e Symfony2 -
http://imasters.com.br/linguagens/php/mudando-de-tdd-para-bdd-com-behat-e-symfony2/?trace=1519021197&source=single 7/8
enviar
estou sempre fazendo a coisa certa e eu tenho alguns velhos hábitos que
preciso perder, mas a impressão geral é muito boa.
***
Artigo traduzido pela Redação iMasters, com autorização do autor.
Publicado originalmente em
http://www.ftassi.com/blog/2013/08/12/switching-from-tdd-to-bdd-with-
behat-and-symfony2/
Mensagem do anunciante:
Conheça a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores. Experimente grátis!
Comentários
O seu endereço de email não será publicado. Campos obrigatórios são marcados com *
Nome
Francesco Tassi em Desenvolvimento, PHP
quinta-feira, 21 de novembro de 2013
SHARES
leia agora
Hooks do Git e pré-processadores CSS
David Walsh
em Desenvolvimento
Participe da discussão, lembre-se de ser respeitoso e construtivo :)
Este projeto é mantido e patrocinado pelas empresas:
http://br.resellerclub.com/?utm_source=imasters&utm_medium=link&utm_term=2016&utm_campaign=domainresellerhttp://www.radix.website/http://www.primesystems.com.br/http://www.mundipagg.com.br/http://www.moip.com.br/http://developers.mercadolibre.com/http://www.locaweb.com.br/http://www.kinghost.com.br/http://iugu.com/?utm_source=iMasters&utm_medium=portal&utm_content=logohttp://intel.ly/1IZMOzwhttp://www.impacta.com.br/https://console.ng.bluemix.net/?cm_mmc=EcoDLA-_-Web-_-Other-City-_-Brazil-iMasters-Q2http://www.gerencianet.com.br/http://www.fiap.com.br/http://www.directcall.com.br/http://www.cielo.com.br/https://br.bluehost.com/http://www.b2wdigital.com/https://apiki.com/empresa-especializada-em-wordpress/?utm_source=imasters&utm_medium=logo&utm_campaign=apiki_empresa_especializada_em_wordpresshttp://www.adaptworks.com.br/http://imasters.com.br/secao/desenvolvimento/http://imasters.com.br/perfil/david-walsh/?trace=3182418120&source=singlehttp://imasters.com.br/perfil/david-walsh/?trace=3182418120&source=singlehttp://imasters.com.br/desenvolvimento/hooks-do-git-e-pre-processadores-css/?trace=1519021197&source=singlehttps://www.linkedin.com/shareArticle?mini=true&url=http%3A%2F%2Fimasters.com.br%2Flinguagens%2Fphp%2Fmudando-de-tdd-para-bdd-com-behat-e-symfony2%2F%3Ftrace%3D1519021197%26%23038%3Bsource%3Dsingle&title=Mudando%20de%20TDD%20para%20BDD%20Com%20Behat%20e%20Symfony2https://plus.google.com/share?url=http%3A%2F%2Fimasters.com.br%2Flinguagens%2Fphp%2Fmudando-de-tdd-para-bdd-com-behat-e-symfony2%2F%3Ftrace%3D1519021197%26%23038%3Bsource%3Dsinglehttps://twitter.com/share?text=Acabei%20de%20ver%20%22Mudando%20de%20TDD%20para%20BDD%20Com%20Behat%20e%20Symfony2%22%20Clique%20pra%20ver%20tamb%C3%A9m%20-%20&url=http%3A%2F%2Fimasters.com.br%2Flinguagens%2Fphp%2Fmudando-de-tdd-para-bdd-com-behat-e-symfony2%2F%3Ftrace%3D1519021197%26%23038%3Bsource%3Dsingle&via=iMastershttps://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fimasters.com.br%2Flinguagens%2Fphp%2Fmudando-de-tdd-para-bdd-com-behat-e-symfony2%2F%3Ftrace%3D1519021197%26%23038%3Bsource%3Dsinglehttp://imasters.com.br/perfil/francescotassi/?trace=3182418120&source=singlehttp://imasters.com.br/secao/linguagens/php/http://imasters.com.br/secao/desenvolvimento/https://www.umbler.com/http://www.ftassi.com/blog/2013/08/12/switching-from-tdd-to-bdd-with-behat-and-symfony2/
8/19/2019 Mudando de TDD Para BDD Com Behat e Symfony2
8/8
11/02/2016 Mudando de TDD para BDD Com Behat e Symfony2 -
http://imasters.com.br/linguagens/php/mudando-de-tdd-para-bdd-com-behat-e-symfony2/?trace=1519021197&source=single 8/8
Desenvolvimento
Agile
Ajax
Análise de Dados
CakePHP
CSS
Front End
HTML
Java
JavaScript
PHP
Python
Ruby
Design
3ds max
Acessib ilidad e
Arqu itetu ra deInformação
Design Responsivo
Games
Usabilidade
User Experience
Banco de dados
Interbase
MongoDB
MySQL
Oracle
PostgreSQL
SQL Server
Infra e Cloud
Cloud Computing
Linux
Microsoft Azure
Segurança
Site Blindado
Marketing Digital
Conteúdo Digital
E-commerce
E-mail Marketing
Mercado
Publicidade Online
Redes Sociais
Tendências
Mobile
Andro id
iPhone & iPad
Agend a
Fórum
7Masters
Cursos Online
InterCon
Revista iMasters
Sobre o iMasters Política de Privacidade Fale conosco iMasters Expert (english blog)
Hospedado por:
http://www.imasters.expert/http://imasters.com.br/fale-conosco/http://imasters.com.br/politica-de-privacidade/http://imasters.com.br/sobre-o-imasters/http://issuu.com/imastershttp://intercon.imasters.com.br/https://cursos.imasters.com.br/http://dialhost.com.br/http://setemasters.imasters.com.br/http://forum.imasters.com.br/http://imasters.com.br/agenda/http://imasters.com.br/secao/mobile/ios/http://imasters.com.br/secao/mobile/android/http://imasters.com.br/secao/mobile/http://imasters.com.br/secao/gerencia-de-ti/tendencias/http://imasters.com.br/secao/midia-e-marketing-digital/redes-sociais/http://imasters.com.br/secao/midia-e-marketing-digital/publicidade-online/http://imasters.com.br/secao/gerencia-de-ti/mercado/http://imasters.com.br/secao/midia-e-marketing-digital/email-marketing/http://imasters.com.br/secao/tecnologia/e-commerce/http://imasters.com.br/secao/midia-e-marketing-digital/conteudo-digital/http://imasters.com.br/marketing-digital/http://imasters.com.br/secao/infra/site-blindado/http://imasters.com.br/secao/infra/seguranca/http://imasters.com.br/secao/infra/windows/http://imasters.com.br/secao/infra/linux/http://imasters.com.br/secao/infra/cloud/http://imasters.com.br/secao/infra/http://imasters.com.br/secao/banco-de-dados/sql-server/http://imasters.com.br/secao/banco-de-dados/postgresql/http://imasters.com.br/secao/banco-de-dados/oracle/http://imasters.com.br/secao/banco-de-dados/mysql/http://imasters.com.br/secao/banco-de-dados/mongodb/http://imasters.com.br/secao/banco-de-dados/interbase/http://imasters.com.br/banco-de-dados/http://imasters.com.br/secao/design-ux/user-experience-design/http://imasters.com.br/secao/design-ux/usabilidade/http://imasters.com.br/secao/games/http://imasters.com.br/secao/design-ux/design-responsivo/http://imasters.com.br/secao/design-ux/arquitetura-da-informacao/http://imasters.com.br/secao/design-ux/acessibilidade/http://imasters.com.br/secao/design-ux/3dsmax/http://imasters.com.br/design/http://imasters.com.br/secao/linguagens/ruby/http://imasters.com.br/secao/linguagens/py/http://imasters.com.br/secao/linguagens/php/http://imasters.com.br/secao/front-end/javascript/http://imasters.com.br/secao/linguagens/java/http://imasters.com.br/secao/front-end/html/http://imasters.com.br/secao/front-end/http://imasters.com.br/secao/front-end/css/http://imasters.com.br/secao/framework/cake-php/http://imasters.com.br/secao/desenvolvimento/analise-de-dados-desenvolvimento/http://imasters.com.br/secao/desenvolvimento/ajax/http://imasters.com.br/secao/desenvolvimento/agile/http://imasters.com.br/desenvolvimento/http://www.dialhost.com.br/http://www.zendesk.com.br/http://www.vtex.com.br/http://www.uolhost.uol.com.br/academia/http://www.umbler.com/http://www.stone.com.br/http://www.stelo.com.br/http://www.siteblindado.com.br/http://www.seomaster.com.br/http://www.sensedia.com.br/http://www.resultadosdigitais.com.br/