Mudando de TDD Para BDD Com Behat e Symfony2

  • 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 

    E-mail

    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/