{"id":10767,"date":"2016-09-26T07:06:27","date_gmt":"2016-09-26T05:06:27","guid":{"rendered":"http:\/\/flaven.fr\/?p=10767"},"modified":"2026-09-16T10:10:19","modified_gmt":"2026-09-16T08:10:19","slug":"bdd-behat-gherkin-introduction-au-behavior-driven-development-avec-behat-et-mink","status":"publish","type":"post","link":"https:\/\/flaven.fr\/2016\/09\/bdd-behat-gherkin-introduction-au-behavior-driven-development-avec-behat-et-mink\/","title":{"rendered":"BDD, Behat, Gherkin &#8211; Introduction au Behavior Driven Development avec Behat et Mink"},"content":{"rendered":"<p>\tLe d\u00e9veloppement pilot\u00e9 par le comportement, voil\u00e0 la traduction forcement moins attirante que sa d\u00e9finition premi\u00e8re en anglais : &#8220;Behavior Driven Development&#8221;. Plus encore le mot comportement est sans doute plus sexy que le mot test. Pour qui s&#8217;agite \u00e0 l&#8217;audition des mots <b>Agile<\/b> ou <b>Lean<\/b>, vous avez d\u00e9j\u00e0 du avoir les oreilles qui bourdonnent \u00e0 des mots tel que : Behat, Gherkin pour ne citer que ces 2 termes.<br \/>\n\tSi vous vous int\u00e9ressez au d\u00e9veloppement que ce soit mobile ou web, la n\u00e9cessit\u00e9 d&#8217;int\u00e9grer des tests fonctionnels via Behat est quasi une obligation. Dans le cas par exemple du d\u00e9veloppement en PHP, sous les frameworks Symfony ou Laravel, cela vous sera syst\u00e9matiquement demand\u00e9.<\/p>\n<p>\t<b>Un extrait plut\u00f4t cens\u00e9 du blog de Dan North sur l&#8217;importance du behaviour-driven development (BDD)<\/b><\/p>\n<blockquote><p>It has evolved out of established agile practices and is designed to make them more accessible and effective for teams new to agile software delivery. Over time, BDD has grown to encompass the wider picture of agile analysis and automated acceptance testing.<\/p><\/blockquote>\n<p>\tCe qui est extr\u00eamement int\u00e9ressant c&#8217;est que vous forgez une approche transverse et un &#8220;langage&#8221; commun avec l&#8217;ensemble des parties prenantes de votre projet de d\u00e9veloppement : le client  (product-owner), la direction de projet, l&#8217;\u00e9quipe de d\u00e9veloppement. Bien \u00e9videmment, les &#8220;user stories&#8221; peuvent \u00eatre r\u00e9dig\u00e9es de la m\u00eame mani\u00e8re. Un des points essentiels avec l&#8217;utilisation du Gherkin, c&#8217;est qu&#8217;il peut vous aider \u00e0 faire toute la lumi\u00e8re sur ce que vous consid\u00e9rez comme implicite afin de le rendre explicite. Le BDD est aussi une manifestation pratique dans le management agile, instituant l&#8217;implication de chacun donc la coh\u00e9sion du groupe, au m\u00eame titre que les traditionnels rituels agile.<\/p>\n<p>Dan North donne un exemple tr\u00e8s parlant de cette exhaustivit\u00e9 li\u00e9 \u00e0 l&#8217;usage du Gherkin pour d\u00e9crire des user stories sur un exemple aussi banal que le retrait d&#8217;argent \u00e0 un distributeur avec une carte. <b>L&#8217;usage du Gherkin en d\u00e9composant cette simple action en une suite logique permet de ne rien omettre sur les conditions de bonne ou de mauvaise ex\u00e9cution.<\/b> <\/p>\n<p><b>L&#8217;exemple en langage commun<\/b><\/p>\n<pre><b>+Title: Customer withdraws cash+<\/b><br>\r\nAs a customer,\r\nI want to withdraw cash from an ATM,\r\nso that I don\u2019t have to wait in line at the bank.\r\n<\/pre>\n<p><strong>En utilisant le modele &#8220;given-when-then&#8221;, la complexit\u00e9 \u00e9ventuelle d&#8217;une action aussi anodine s&#8217;\u00e9claire tour \u00e0 coup<\/strong>.<\/p>\n<pre><b>+Scenario 1: Account is in credit+<\/b><br>\r\nGiven the account is in credit\r\nAnd the card is valid\r\nAnd the dispenser contains cash\r\nWhen the customer requests cash\r\nThen ensure the account is debited\r\nAnd ensure cash is dispensed\r\nAnd ensure the card is returned\r\n<\/pre>\n<p><strong>A noter que l&#8217;usage intensif de la conjonction &#8220;and&#8221; permet de connecter plusieurs &#8220;givens&#8221; ou plusieurs r\u00e9sultats d&#8217;une mani\u00e8re intuitive.<\/strong><\/p>\n<pre><b>+Scenario 2: Account is overdrawn past the overdraft limit+<\/b><br>\r\nGiven the account is overdrawn\r\nAnd the card is valid\r\nWhen the customer requests cash\r\nThen ensure a rejection message is displayed\r\nAnd ensure cash is not dispensed\r\nAnd ensure the card is returned\r\n<\/pre>\n<p><i>Source : <a href=\"https:\/\/dannorth.net\/introducing-bdd\/\" target=\"_blank\">https:\/\/dannorth.net\/introducing-bdd\/<\/a><\/i><\/p>\n<h4>Mink Behat &amp; the tests<\/h4>\n<p>Laissons tomber le volet th\u00e9orique, vous s&#8217;attelez \u00e0 la pratique. L&#8217;ensemble des exemples ci-dessous ont \u00e9t\u00e9 men\u00e9s dans l&#8217;environnement suivant : Firefox 47.0, une version de PHP 5.5.38 avec l&#8217;aide de la console.<br \/>\nVous aurez besoin de homebrew, d&#8217;installer composer sir ce n&#8217;est pas d\u00e9j\u00e0 fait. Il y a eu quelques difficult\u00e9s aga\u00e7antes que vous aurez peut-\u00eatre \u00e0 r\u00e9soudre \u00e9ventuellement.<\/p>\n<p><b>1. Probl\u00e8me de timezone dans PHP<\/b><br \/>\nIl y avait des erreurs de date lors de l&#8217;ex\u00e9cution des tests, sans gravit\u00e9 mais troublant. Le probl\u00e8me venait du fait que la &#8220;timezone&#8221; n&#8217;\u00e9tait pas d\u00e9finie dans le <code>php.ini<\/code>.<\/p>\n<p><b>Les commandes de base pour localiser et modifier le php.ini<\/b><\/p>\n<pre lang=\"bash\">\r\nphp -v # check la version \r\nphp --ini # localise le fichier php.ini\r\nvi \/usr\/local\/etc\/php\/5.5\/php.ini # editer le fichier php.ini\r\n<\/pre>\n<p><b>Extrait du php.ini \u00e0 modifier<\/b><\/p>\n<pre lang=\"bash\">\r\n;;;;;;;;;;;;;;;;;;;\r\n; Module Settings ;\r\n;;;;;;;;;;;;;;;;;;;\r\n\r\n[CLI Server]\r\n; Whether the CLI web server uses ANSI color coding in its terminal output.\r\ncli_server.color = On\r\n\r\n[Date]\r\n; Defines the default timezone used by the date functions\r\n; http:\/\/php.net\/date.timezone\r\n;date.timezone =\r\ndate.timezone = Europe\/Paris\r\n<\/pre>\n<p><b>2. Installer geckodriver<\/b><br \/>\nAutre souci, plus ennuyeux, pour installer geckodriver, le plus simple est de passer par Homebrew avec la commande suivante.<br \/>\n<code>brew install geckodriver<\/code><\/p>\n<p><b>3. La commande pour lancer pour lancer le serveur selenium si vous souhaitez faire des tests dans un navigateur firefox<\/b><br \/>\njava -jar  \/chemin-vers-le-fichier\/selenium-server-standalone-3.0.0-beta3.jar<br \/>\n<i>Source : Selenium Standalone Server <a href=\"http:\/\/goo.gl\/EUxR76\" target=\"_blank\">http:\/\/goo.gl\/EUxR76<\/a><\/i><\/p>\n<h4>La marche \u00e0 suivre<\/h4>\n<p>La premi\u00e8re chose \u00e0 faire consiste cr\u00e9er un r\u00e9pertoire dans lequel vous allez effectuer vos travaux. Le notre se nomme <code>demo-2<\/code><br \/>\nPour vous faciliter la tache, voil\u00e0 une video youtube tr\u00e8s didactique, qui a servi de base \u00e0 ce billet.<\/p>\n<p><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/BVVk4FbbCaA\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p><b>La source du fichier composer.json qui vous permettra d&#8217;installer les \u00e9l\u00e9ments n\u00e9cessaires aux tests dans votre r\u00e9pertoire. Notre projet se nomme demo-2. <code>cd \/chemin-vers-votre-projet-behat\/demo-2\/<\/code> puis <code>composer install<\/code><\/b><\/p>\n<pre lang=\"json\">\r\n\t{\r\n\t    \"require\": {\r\n\t        \"behat\/mink\": \"1.4@stable\",\r\n\t        \"behat\/mink-goutte-driver\": \"*\",\r\n\t        \"behat\/mink-selenium2-driver\": \"*\",\r\n\t        \"behat\/behat\": \"2.4@stable\",\r\n\t        \"behat\/mink-extension\": \"*\",\r\n\t        \"guzzle\/guzzle\": \"3.5\",\r\n\t        \"moodlehq\/behat-extension\": \"1.*\"\r\n\t    },\r\n\t    \"minimum-stability\": \"dev\",\r\n\t    \"config\": \r\n\t        {\r\n\t            \"bin-dir\": \"bin\/\"\r\n\t        }\r\n\t}\r\n<\/pre>\n<p>Une fois le tout installer, voil\u00e0 les principales commandes dont vous aurez besoin. Toutes ces commandes sont \u00e0 passer dans le r\u00e9pertoire du projet <code>demo-2<\/code>.<\/p>\n<pre lang=\"bash\">\r\nphp bin\/behat --init # cr\u00e9er le n\u00e9cessaire pour behat\r\nphp bin\/behat # pour lancer vos tests avec behat\r\nphp bin\/behat -dl # pour connaitre toutes les r\u00e8gles de mink pour ecrire vos .feature\r\n<\/pre>\n<p><b>Le fichier <code>search.feature<\/code> pour tester la recherche du site Le monde<\/b><\/p>\n<pre lang=\"yml\">\r\n\t# Content of file renting.feature\r\n\r\n\tFeature: Search\r\n\t  In  order to find a word\r\n\t  As website user\r\n\t  I am able to search for a word\r\n\t  # avec le @javascript vous lancez le test dans le navigateur firefox\r\n\t  # sans le @javascript vous faites passer le test en mode headless.\r\n\t\t@javascript\r\n\t\t  Scenario: Search for a word that exists\r\n\t\t    Given I am on \"http:\/\/www.lemonde.fr\/\"\r\n\t\tWhen I fill in \"recherche_globale\" with \"ONU\"\r\n\t\tAnd I press \"rechercher\"\r\n\t\tThen I should see \"la situation \u00e0 Alep\"\r\n\t\r\n<\/pre>\n<p><b>L&#8217;installation des \u00e9l\u00e9ments via la composer<\/b><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2016\/09\/learn_gherkin_1.jpg\" width=\"640\" height=\"480\" alt=\"BDD, Behat, Gherkin - Introduction au Behavior Driven Development avec Behat et Mink\"><\/p>\n<p><b>Le test en mode headless<\/b><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2016\/09\/learn_gherkin_2.jpg\" width=\"640\" height=\"480\" alt=\"BDD, Behat, Gherkin - Introduction au Behavior Driven Development avec Behat et Mink\"><\/p>\n<p><b>L&#8217;inspecteur de Chrome vous permet de connaitre les \u00e9l\u00e9ments id|name|label|value \u00e0 placer dans votre sc\u00e9nario de test.<\/b><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/flaven.fr\/wp-content\/uploads\/2016\/09\/learn_gherkin_3.jpg\" width=\"640\" height=\"480\" alt=\"BDD, Behat, Gherkin - Introduction au Behavior Driven Development avec Behat et Mink\"><\/p>\n<p><b>Quelques commandes pour faire une sortie sous forme de rapport html des r\u00e9sultats de vos tests<\/b><\/p>\n<pre lang=\"bash\">\r\nphp bin\/behat  --format html --out report.html\r\nphp bin\/behat -f pretty,progress,junit --out ,progress.out,xml\r\n<\/pre>\n<p><b>La sortie compl\u00e8te des actions avec la commande <code>php bin\/behat -dl<\/code><\/b><\/p>\n<pre lang=\"bash\" escaped=\"true\">\r\n\t When \/^I click \"([^\"]*)\"$\/\r\n\tGiven \/^I wait for (\\d+) seconds$\/\r\n\t When I wait for :arg1 seconds\r\n\tGiven \/^I wait for \"([^\"]*)\" seconds$\/\r\n\tGiven \/^(?:|I )am on (?:|the )homepage$\/\r\n\t When \/^(?:|I )go to (?:|the )homepage$\/\r\n\tGiven \/^(?:|I )am on \"(?P&lt;page&gt;[^\"]+)\"$\/\r\n\t When \/^(?:|I )go to \"(?P&lt;page&gt;[^\"]+)\"$\/\r\n\t When \/^(?:|I )reload the page$\/\r\n\t When \/^(?:|I )move backward one page$\/\r\n\t When \/^(?:|I )move forward one page$\/\r\n\t When \/^(?:|I )press \"(?P&lt;button&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t When \/^(?:|I )follow \"(?P&lt;link&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t When \/^(?:|I )fill in \"(?P&lt;field&gt;(?:[^\"]|\\\\\")*)\" with \"(?P&lt;value&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t When \/^(?:|I )fill in \"(?P&lt;value&gt;(?:[^\"]|\\\\\")*)\" for \"(?P&lt;field&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t When \/^(?:|I )fill in the following:$\/\r\n\t When \/^(?:|I )select \"(?P&lt;option&gt;(?:[^\"]|\\\\\")*)\" from \"(?P&lt;select&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t When \/^(?:|I )additionally select \"(?P&lt;option&gt;(?:[^\"]|\\\\\")*)\" from \"(?P&lt;select&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t When \/^(?:|I )check \"(?P&lt;option&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t When \/^(?:|I )uncheck \"(?P&lt;option&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t When \/^(?:|I )attach the file \"(?P[^\"]*)\" to \"(?P&lt;field&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t Then \/^(?:|I )should be on \"(?P&lt;page&gt;[^\"]+)\"$\/\r\n\t Then \/^the (?i)url(?-i) should match (?P&lt;pattern&gt;\"([^\"]|\\\\\")*\")$\/\r\n\t Then \/^the response status code should be (?P&lt;code&gt;\\d+)$\/\r\n\t Then \/^the response status code should not be (?P&lt;code&gt;\\d+)$\/\r\n\t Then \/^(?:|I )should see \"(?P&lt;text&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t Then \/^(?:|I )should not see \"(?P&lt;text&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t Then \/^(?:|I )should see text matching (?P&lt;pattern&gt;\"(?:[^\"]|\\\\\")*\")$\/\r\n\t Then \/^(?:|I )should not see text matching (?P&lt;pattern&gt;\"(?:[^\"]|\\\\\")*\")$\/\r\n\t Then \/^the response should contain \"(?P&lt;text&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t Then \/^the response should not contain \"(?P&lt;text&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t Then \/^(?:|I )should see \"(?P&lt;text&gt;(?:[^\"]|\\\\\")*)\" in the \"(?P&lt;element&gt;[^\"]*)\" element$\/\r\n\t Then \/^(?:|I )should not see \"(?P&lt;text&gt;(?:[^\"]|\\\\\")*)\" in the \"(?P&lt;element&gt;[^\"]*)\" element$\/\r\n\t Then \/^the \"(?P&lt;element&gt;[^\"]*)\" element should contain \"(?P&lt;value&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t Then \/^the \"(?P&lt;element&gt;[^\"]*)\" element should not contain \"(?P&lt;value&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t Then \/^(?:|I )should see an? \"(?P&lt;element&gt;[^\"]*)\" element$\/\r\n\t Then \/^(?:|I )should not see an? \"(?P&lt;element&gt;[^\"]*)\" element$\/\r\n\t Then \/^the \"(?P&lt;field&gt;(?:[^\"]|\\\\\")*)\" field should contain \"(?P&lt;value&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t Then \/^the \"(?P&lt;field&gt;(?:[^\"]|\\\\\")*)\" field should not contain \"(?P&lt;value&gt;(?:[^\"]|\\\\\")*)\"$\/\r\n\t Then \/^the \"(?P&lt;checkbox&gt;(?:[^\"]|\\\\\")*)\" checkbox should be checked$\/\r\n\t Then \/^the \"(?P&lt;checkbox&gt;(?:[^\"]|\\\\\")*)\" checkbox should not be checked$\/\r\n\t Then \/^(?:|I )should see (?P&lt;num&gt;\\d+) \"(?P&lt;element&gt;[^\"]*)\" elements?$\/\r\n\t Then \/^print last response$\/\r\n\t Then \/^show last response$\/\r\n<\/pre>\n<h2>En savoir plus<\/h2>\n<ul>\n<li>Quick intro to behat<br \/><a href=\"http:\/\/docs.behat.org\/en\/v2.5\/quick_intro.html\" target=\"_blank\">http:\/\/docs.behat.org\/en\/v2.5\/quick_intro.html<\/a><\/li>\n<li>Le compte geckodriver sur github<br \/><a href=\"https:\/\/github.com\/mozilla\/geckodriver\/releases\" target=\"_blank\">https:\/\/github.com\/mozilla\/geckodriver\/releases<\/a><\/li>\n<li>Une checklist pour l&#8217;installation de Selenium WebDriver<br \/><a href=\"https:\/\/github.com\/eviltester\/startUsingSeleniumWebDriver\/blob\/master\/speedrun_install_checklist.txt\" target=\"_blank\">https:\/\/github.com\/eviltester\/startUsingSeleniumWebDriver\/blob\/master\/speedrun_install_checklist.txt<\/a><\/li>\n<li>D\u00e9finition du Headless browser<br \/><a href=\"https:\/\/en.wikipedia.org\/wiki\/Headless_browser\" target=\"_blank\">https:\/\/en.wikipedia.org\/wiki\/Headless_browser<\/a><\/li>\n<li>La page de t\u00e9l\u00e9chargements  de seleniumhq<br \/><a href=\"http:\/\/www.seleniumhq.org\/download\/\" target=\"_blank\">http:\/\/www.seleniumhq.org\/download\/<\/a><\/li>\n<li>La fichier composer du compte de Weaver Ryan<br \/><a href=\"https:\/\/gist.github.com\/weaverryan\/5987090\" target=\"_blank\">https:\/\/gist.github.com\/weaverryan\/5987090<\/a><\/li>\n<li>Vid\u00e9o &#8211; BDD, Behat, Mink &#038; other Wonderful Things<br \/><a href=\"https:\/\/www.youtube.com\/watch?v=BVVk4FbbCaA\" target=\"_blank\">https:\/\/www.youtube.com\/watch?v=BVVk4FbbCaA<\/a><\/li>\n<li>Vid\u00e9o &#8211; How to start firefox Browser in Selenium webdriver 3 with Gecko Driver<br \/><a href=\"https:\/\/www.youtube.com\/watch?v=rJ4rNZGAzW8\" target=\"_blank\">https:\/\/www.youtube.com\/watch?v=rJ4rNZGAzW8<\/a><\/li>\n<li>The Mink documentation<br \/><a href=\"http:\/\/mink.behat.org\/en\/latest\/\" target=\"_blank\">http:\/\/mink.behat.org\/en\/latest\/<\/a><\/li>\n<li>Doing Behavior Driven Development in PHP with Behat<br \/><a href=\"http:\/\/www.developer.com\/lang\/php\/doing-behavior-driven-development-in-php-with-behat.html\" target=\"_blank\">http:\/\/www.developer.com\/lang\/php\/doing-behavior-driven-development-in-php-with-behat.html<\/a><\/li>\n<li>BDD avec Behat<br \/><a href=\"https:\/\/www.grafikart.fr\/tutoriels\/php\/behaviour-driven-development-behat-552\" target=\"_blank\">https:\/\/www.grafikart.fr\/tutoriels\/php\/behaviour-driven-development-behat-552<\/a><\/li>\n<li>Chapitre 4 Automatisez votre recette &#8211; Le d\u00e9veloppement pilot\u00e9 par le comportement<br \/><a href=\"http:\/\/communiquez.lepine.pro\/download\/developpement-pilote-par-le-comportement-tome2\/chapitre-4.html\" target=\"_blank\">http:\/\/communiquez.lepine.pro\/download\/developpement-pilote-par-le-comportement-tome2\/chapitre-4.html<\/a><\/li>\n<li>Vid\u00e9o &#8211; Quickstart to testing your website with Behat, Mink, and Selenium<br \/><a href=\"https:\/\/www.youtube.com\/watch?v=9cYhnTojaHU\" target=\"_blank\">https:\/\/www.youtube.com\/watch?v=9cYhnTojaHU<\/a><\/li>\n<li>Les fichiers pour la video : Quickstart to testing with Behat, Mink, and Selenium<br \/><a href=\"http:\/\/lin-clark.com\/blog\/2013\/11\/26\/quickstart-testing-with-behat-mink-selenium\/\" target=\"_blank\">http:\/\/lin-clark.com\/blog\/2013\/11\/26\/quickstart-testing-with-behat-mink-selenium\/<\/a><\/li>\n<li>Automated Testing with Cucumber and Capybara<br \/><a href=\"http:\/\/www.gamesparks.com\/blog\/automated-testing-with-cucumber-and-capybara\/\" target=\"_blank\">http:\/\/www.gamesparks.com\/blog\/automated-testing-with-cucumber-and-capybara\/<\/a><\/li>\n<li>Setting up Cucumber on OSX par Paradigm IT Consulting<br \/><a href=\"http:\/\/www.paradigmitconsulting.com\/setting-up-cucumber-on-osx\/\" target=\"_blank\">http:\/\/www.paradigmitconsulting.com\/setting-up-cucumber-on-osx\/<\/a><\/li>\n<li>Command Line Tool &#8211; behat<br \/><a href=\"http:\/\/docs.behat.org\/en\/v2.5\/guides\/6.cli.html\" target=\"_blank\">http:\/\/docs.behat.org\/en\/v2.5\/guides\/6.cli.html<\/a><\/li>\n<li>The 5 Step Guide for Selenium, Cucumber, and Gherkin<br \/><a href=\"http:\/\/www.agiletrailblazers.com\/blog\/the-5-step-guide-for-selenium-cucumber-and-gherkin\" target=\"_blank\">http:\/\/www.agiletrailblazers.com\/blog\/the-5-step-guide-for-selenium-cucumber-and-gherkin<\/a><\/li>\n<li>Is Your Test Automation Portfolio Ready For Acceleration? Or Will It Slow You Down?<br \/><a href=\"http:\/\/www.agiletrailblazers.com\/blog\/is-your-test-automation-portfolio-ready-for-acceleration-or-will-it-slow-you-down-2\/\" target=\"_blank\">http:\/\/www.agiletrailblazers.com\/blog\/is-your-test-automation-portfolio-ready-for-acceleration-or-will-it-slow-you-down-2\/<\/a><\/li>\n<li>Write Great Cucumber Tests<br \/><a href=\"http:\/\/sauceio.com\/index.php\/tag\/cucumber\/\" target=\"_blank\">http:\/\/sauceio.com\/index.php\/tag\/cucumber\/<\/a><\/li>\n<li>iOS Automated Testing in the BDD with Cucumber, Appium and SauceLabs (excellent)<br \/><a href=\"http:\/\/shashikantjagtap.net\/ios-automated-testing-in-the-bdd-with-appium-cucumber-on-mac-osx\/\" target=\"_blank\">http:\/\/shashikantjagtap.net\/ios-automated-testing-in-the-bdd-with-appium-cucumber-on-mac-osx\/<\/a><\/li>\n<li>Cucumber: Getting started par James Chambers<br \/><a href=\"http:\/\/jameschambers.co\/writing\/cucumber-for-beginners-getting-started\/\" target=\"_blank\">http:\/\/jameschambers.co\/writing\/cucumber-for-beginners-getting-started\/<\/a><\/li>\n<li>Behat \u2013 jour 3 : Tester une application web avec Mink par Jean-Fran\u00e7ois L\u00e9pine<br \/><a href=\"http:\/\/blog.lepine.pro\/php\/behat-jour-3-tester-une-application-web-avec-mink\/\" target=\"_blank\">http:\/\/blog.lepine.pro\/php\/behat-jour-3-tester-une-application-web-avec-mink\/<\/a><\/li>\n<li>Behat and Mink (simple et didactique)<br \/><a href=\"https:\/\/knpuniversity.com\/screencast\/behat-v25\/mink-behat\" target=\"_blank\">https:\/\/knpuniversity.com\/screencast\/behat-v25\/mink-behat<\/a><\/li>\n<li>Test Design Considerations<br \/><a href=\"http:\/\/www.seleniumhq.org\/docs\/06_test_design_considerations.jsp\" target=\"_blank\">http:\/\/www.seleniumhq.org\/docs\/06_test_design_considerations.jsp<\/a><\/li>\n<li>Page Object Model | POM<br \/><a href=\"http:\/\/toolsqa.com\/selenium-webdriver\/page-object-model\/\" target=\"_blank\">http:\/\/toolsqa.com\/selenium-webdriver\/page-object-model\/<\/a><\/li>\n<li>Page Object Model (POM) &#038; Page Factory in Selenium: Ultimate Guide<br \/><a href=\"http:\/\/www.guru99.com\/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html\" target=\"_blank\">http:\/\/www.guru99.com\/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html<\/a><\/li>\n<li>ROBOT FRAMEWORK, Generic test automation framework for acceptance testing and ATDD<br \/><a href=\"http:\/\/robotframework.org\/\" target=\"_blank\">http:\/\/robotframework.org\/<\/a><\/li>\n<li>Apprenez le Gherkin pour \u00e9crire vos User Stories<br \/><a href=\"http:\/\/blog.thiga.fr\/product-management\/bdd-gherkin-pour-ecrire-vos-user-stories\/\" target=\"_blank\">http:\/\/blog.thiga.fr\/product-management\/bdd-gherkin-pour-ecrire-vos-user-stories\/<\/a><\/li>\n<li>Le Story Mapping, notre retour d\u2019exp\u00e9rience<br \/><a href=\"http:\/\/blog.thiga.fr\/product-management\/story-mapping-notre-retour-dexperience\/\" target=\"_blank\">http:\/\/blog.thiga.fr\/product-management\/story-mapping-notre-retour-dexperience\/<\/a><\/li>\n<li>Cucumber<br \/><a href=\"https:\/\/cucumber.io\/\" target=\"_blank\">https:\/\/cucumber.io\/<\/a><\/li>\n<li>Tout savoir (ou presque) sur le Behaviour Driven Development (BDD)<br \/><a href=\"http:\/\/coding-in.net\/fr\/tout-savoir-ou-presque-sur-le-behaviour-driven-development-bdd\/\" target=\"_blank\">http:\/\/coding-in.net\/fr\/tout-savoir-ou-presque-sur-le-behaviour-driven-development-bdd\/<\/a><\/li>\n<li>Chapitre 3 &#8211; Comprenez (enfin!) ce que votre client vous demande &#8211; Le d\u00e9veloppement pilot\u00e9 par le comportement<br \/><a href=\"http:\/\/communiquez.lepine.pro\/download\/developpement-pilote-par-le-comportement-tome2\/chapitre-3.html\" target=\"_blank\">http:\/\/communiquez.lepine.pro\/download\/developpement-pilote-par-le-comportement-tome2\/chapitre-3.html<\/a><\/li>\n<li>Testing your Symfony application with behat<br \/><a href=\"http:\/\/www.pix-art.be\/post\/testing-your-symfony-application-with-behat\" target=\"_blank\">http:\/\/www.pix-art.be\/post\/testing-your-symfony-application-with-behat<\/a><\/li>\n<li>Top 15 TextMate Shortcuts, toujours utile<br \/><a href=\"http:\/\/www.benrasmusen.com\/featured\/top-15-textmate-shortcuts\/\" target=\"_blank\">http:\/\/www.benrasmusen.com\/featured\/top-15-textmate-shortcuts\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Le d\u00e9veloppement pilot\u00e9 par le comportement, voil\u00e0 la traduction forcement moins attirante que sa d\u00e9finition premi\u00e8re en anglais : &#8220;Behavior Driven Development&#8221;. Plus encore le&hellip; <\/p>\n<p class=\"text-center\"><a href=\"https:\/\/flaven.fr\/2016\/09\/bdd-behat-gherkin-introduction-au-behavior-driven-development-avec-behat-et-mink\/\" class=\"more-link\">Continue reading &rarr; <span class=\"screen-reader-text\">BDD, Behat, Gherkin &#8211; Introduction au Behavior Driven Development avec Behat et Mink<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":10774,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"bf_ai_meta_description":"Behavior Driven Development with Behat and Mink tools. Master BDD for robust, functional testing in PHP projects like Symfony and Laravel.","bf_ai_og_title":"BDD: Behat & Mink Introduction","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[3437,3454,3442,3444,3447,3448,3449,3450,3435],"tags":[2352,2353,2357,2358,2359,2355,2354,2356,2056,2361,2360,20,2315,182,3508],"class_list":["post-10767","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-business-case-studies","category-journalism-writing","category-mobile-devices","category-programming-databases","category-technology-trends","category-tools-productivity","category-tutorials-how-to","category-ux-product-design","category-web-development","tag-bdd","tag-behat","tag-behaviour-driven-development","tag-capybara","tag-cucumber","tag-geckodriver","tag-gherkin","tag-headless-browser","tag-laravel","tag-mink","tag-mink-behat","tag-php","tag-selenium","tag-symfony","tag-test-automation"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3Vuhl-2NF","jetpack_featured_media_url":"https:\/\/flaven.fr\/wp-content\/uploads\/2016\/09\/learn_gherkin_b.jpg","_links":{"self":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10767","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/comments?post=10767"}],"version-history":[{"count":13,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10767\/revisions"}],"predecessor-version":[{"id":10786,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10767\/revisions\/10786"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media\/10774"}],"wp:attachment":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media?parent=10767"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/categories?post=10767"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/tags?post=10767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}