Introduction aux tests de recette automatisésAvec lextension Drupal pour Behatdidier.boff@ows.frB2F @ drupal.orghttps://gi...
Les joies du testQuand mon collègue avance sans plan de testhttp://lesjoiesdutest.tumblr.com
Plan● Retour dexpérience○ Campus France○ Divers outils démodés
Plan● Retour dexpérience○ Campus France○ Divers outils démodés● Méthodologie○ BDD, Gherkin
Plan● Retour dexpérience○ Campus France○ Divers outils démodés● Méthodologie○ BDD, Gherkin● Développement○ Behat/Mink○ Min...
Retour dexpériencewww.campusfrance.org● Migration Drupal 6 -> 7
Retour dexpériencewww.campusfrance.org● Migration Drupal 6 -> 7● 100 sites, domain access● multilingues
Retour dexpériencewww.campusfrance.org● Migration Drupal 6 -> 7● 100 sites, domain access● multilinguesQuels tests ?
Retour dexpérienceSeleniumAPI● click● type● select● addSelection● submit● ... http://release.seleniumhq.org/selenium-core/
Retour dexpérienceSeleniumIDE
Retour dexpérience?Test automatiséSeleniumIDE
Retour dexpérienceSeleniumIDE?Test automatiséMultidomaine
Retour dexpérienceSeleniumIDE?AJAXMultidomaineTest automatisé
Retour dexpérienceSelenium Serverhttp://docs.seleniumhq.org/download/java -jar selenium-server-standalone-<version-number>...
Retour dexpérienceSelenium Server+ PHPUnitPHPUnit_Extensions_SeleniumTestCase
Retour dexpérienceSelenium Server+ PHPUnithttps://github.com/B2F/ows-phpunitclass OWSeleniumTestCase extendsPHPUnit_Extens...
Retour dexpérienceSelenium Server+ PHPUnit+ IDE
Retour dexpérienceSelenium Server+ PHPUnit+ IDE+Selenium IDE: PHP Formattershttps://github.com/brokenthumbs/PHP-Formatter
Retour dexpérienceSelenium Server+ PHPUnit+ IDE+Selenium IDE: PHP Formattershttps://github.com/brokenthumbs/PHP-Formatterh...
Les joies du testQuand je fais un test un peu trop compliqué pour un tructout simplehttp://lesjoiesdutest.tumblr.com
Les joies du testQuand je fais un test un peu tropcompliqué pour un truc tout simple ?
Les joies du testQuand je fais un test un peu tropcompliqué pour un truc tout simple
Les joies du testQuand je fais un test un peu tropcompliqué pour un truc tout simple19 content types
Les joies du testQuand je fais un test un peu tropcompliqué pour un truc tout simple...
Méthodologie● Behavior Driven Development (BDD)
Méthodologie● Behavior Driven Development (BDD)DrupalCon Portland 2013: BEHAT, BEHAVIORAL-DRIVEN DEVELOPMENT AND SELENIUM ...
Méthodologie● Gherkin
Méthodologie● Gherkin● Feature Suite de tests
Méthodologie● Gherkin● Feature○ Scenario Test
Méthodologie● Gherkin● Feature○ Scenario■ Given● And...Contexte
Méthodologie● Gherkin● Feature○ Scenario■ Given● And...ContexteGiven I am on "/restaurants"
Méthodologie● Gherkin● Feature○ Scenario■ Given● And...■ When● And...Évènements
Méthodologie● Gherkin● Feature○ Scenario■ Given● And...■ When● And...ÉvènementsAnd I enter "Vietnam" for "pays"And I enter...
Méthodologie● Gherkin● Feature○ Scenario■ Given● And...■ When● And...■ Then● And...RésultatsThen I should see the text "Ph...
Opened Blackbox● CucumberGherkin + Ruby
Opened Blackbox● Cucumber=Gherkin + Ruby
Opened Blackbox● CucumberGherkin + Ruby ?
Opened Blackbox● CucumberGherkin + PHP
Opened Blackbox● Behathttp://behat.org/=Gherkin + PHP
Opened Blackboxhttp://behat.org/<?phpuse BehatBehatContextBehatContextclass FeatureContext extends BehatContext{// /**// *...
Opened Blackboxhttp://behat.org/<?phpuse BehatBehatContextBehatContextclass FeatureContext extends BehatContext{// /**// *...
Opened Blackbox● MinkWeb acceptance testinghttp://mink.behat.org/
Opened Blackbox● Mink: drivers$driver = new BehatMinkDriverZombieDriver();http://mink.behat.org/
Opened Blackbox● Mink: drivers$driver = new BehatMinkDriverSahiDriver(firefox);http://mink.behat.org/
Opened Blackbox● Mink: drivers$driver = new BehatMinkDriverGoutteDriver();http://mink.behat.org/
Opened Blackbox● Mink: drivers$client = new SeleniumClient($host, $port);$driver = new BehatMinkDriverSeleniumDriver(firef...
Opened Blackbox● Mink: session// init session:$session = new BehatMinkSession($driver);// start session:$session->start();...
Opened Blackbox● Mink: méthodes$page = $session->getPage();$element = $page->find(css, a#selector);$element->getText();htt...
Opened Blackbox● Mink: méthodes$page = $session->getPage();$element = $page->find(css, a#selector);$element->getText();htt...
Développement● En pratiquehttp://mink.behat.org/Behat + Mink ?
Développement● Mink extensionhttp://mink.behat.org/=Behat + Mink
Développement● Mink extensionhttp://mink.behat.org/STEPS
Développement● Mink extensionhttp://mink.behat.org/Given /^(?:|I )am on (?:|the )homepage$/When /^(?:|I )go to (?:|the )ho...
Développement● Mink extensionhttp://mink.behat.org/Presses button with specified id|name|title|alt|value.@When /^(?:|I )pr...
DéveloppementInstallationhttp://docs.behat.org/#cookbookDeveloping Web Applications with Behat and Mink
DéveloppementInstallationcomposer.json{"require": {"behat/behat": "2.4.*@stable","behat/mink": "1.4.*@stable","behat/mink-...
DéveloppementInstallation$ curl http://getcomposer.org/installer | php$ php composer.phar installhttp://docs.behat.org/coo...
DéveloppementInstallation$ lsbin composer.json composer.lock composer.phar vendorhttp://docs.behat.org/cookbook/behat_and_...
DéveloppementInstallation$ bin/behat --init-> features/
DéveloppementInstallation: suites de testsfeatures/{name}.featureFeature: un exempleQuelques steps pour illustrer une feat...
DéveloppementInstallation: customisation$ bin/behat --init-> features/bootstrap/FeatureContext.php
DéveloppementInstallation: customisation# features/bootstrap/FeatureContext.php/*** Features context.*/class FeatureContex...
DéveloppementInstallation: customisation# features/bootstrap/FeatureContext.php/*** Features context.*/class FeatureContex...
DéveloppementInstallation: customisation# features/bootstrap/FeatureContext.php/*** Features context.*/class FeatureContex...
DéveloppementInstallation: subcontexts# features/bootstrap/FeatureContext.phpuse BehatMinkExtensionContextRawMinkContext;u...
DéveloppementInstallation: subcontexts# features/bootstrap/FeatureContext.phpuse BehatMinkExtensionContextRawMinkContext;u...
Développement● Mink stepsWhen will this be over ?http://mink.behat.org/
Développement● Mink stepsWhen I hover the element ?/*** @When /^I hover "([^"]*)"$/*/public function iHover($cssId){http:/...
Développement● Mink steps/*** @When /^I hover "([^"]*)"$/*/public function iHover($cssId){$page = $this->getSession()->get...
Développement● Mink stepspublic function iHover($cssId){$page = $this->getSession()->getPage();$element = $page->find(css,...
Développement● Mink steps__construct(Session session, string type, string selector, string locator)And I hover "a[title=ab...
Développement● Mink stepspublic function iHover($cssId){$page = $this->getSession()->getPage();$element = $page->find(css,...
Développement● Mink stepspublic function iHover($cssId){$page = $this->getSession()->getPage();$element = $page->find(css,...
Développement● Mink steps - AJAX/*** Waits some time or until JS condition turns true.** @param integer $time time in mill...
Développement● Mink steps - AJAX/*** @When /^I wait (?P<timing>d+)sec$/*/public function iWaitNSec($timing) {$this->getSes...
Développement● Mink steps - AJAX/*** @When /^I wait (?P<timing>d+)sec$/*/public function iWaitNSec($timing) {$this->getSes...
DéveloppementDémobin/behat features/demo.feature
DéveloppementDémo: colored outputbin/behat --ansi features/demo.featurebehat arguments: http://docs.behat.org/guides/6.cli...
Développement● OwsContexthttps://github.com/B2F/OwsContextpublic function iHover($cssId)public function iWaitNsec($timing)...
Développement● OwsContexthttps://github.com/B2F/OwsContext+ (experimental)public function iWaitNSecForTheText($timing, $te...
DéveloppementConfiguration# behat.ymldefault:extensions:BehatMinkExtensionExtension:base_url: http://google.frgoutte: ~sel...
DéveloppementConfiguration● AJAX@javascriptScenario: vérification quun lien est présentGiven I am at "/home"When I follow ...
DéveloppementConfiguration● Profiles = overrides# behat.ymldefault:...custom:extensions:BehatMinkExtensionExtension:base_u...
DéveloppementConfiguration● Profiles# bin/behat --profile=custom features/tests.feature
DéveloppementConfiguration● Filtres# behat.ymlcustom:...extensions:...filters:tags: "@custom-filter"
DéveloppementConfiguration● Filtres@javascript @custom-filterScenario: vérification quun lien est présentGiven I am at "/h...
Développement● Drupal Extensionhttps://drupal.org/project/drupalextension
Développement● Drupal Extension/*** Features context.*/class DrupalContext extends MinkContext implements DrupalAwareInter...
Développement● Drupal Extension: installation# composer.json{"require": {"drupal/drupal-extension": "*"},"minimum-stabilit...
Développement● Drupal Extension: installtion$ curl http://getcomposer.org/installer | php$ php composer.phar installhttps:...
Développement● Drupal Extension: configuration#behat.ymldefault:paths:features: featuresextensions:BehatMinkExtensionExten...
Développement● Drupal Extension: configuration#behat.ymldefault:paths:features: featuresextensions:BehatMinkExtensionExten...
Développement● Drupal Extension en pratiquebin/behat -dl => liste les stepshttps://drupal.org/project/drupalextension
Développement● Drupal Extension: user stepsGiven /^I am an anonymous user$/Given /^I am not logged in$/Given /^I am logged...
Développement● Drupal Extension: configuration#behat.ymldefault:paths:features: featuresextensions:...DrupalDrupalExtensio...
Opened blackbox● Drupal Extension: user steps# @see Drupal/DrupalExtension/Context/DrupalContext.php/*** Helper function t...
Développement● Drupal Extension: user steps#behat.ymlDrupalDrupalExtensionExtension:text:log_out: "Sign out"log_in: "Sign ...
Développement● Drupal Extension: content stepsGiven /^I am viewing (?:a|an) "(?P<type>[^"]*)" node with the title "(?P<tit...
Développement● Drupal Extension: region stepsThen /^I should see the "(?P<heading>[^"]*)" heading in the "(?P<region>[^"]*...
Développement● Drupal Extension: region steps#behat.ymlDrupalDrupalExtensionExtension:region_map:My region: "#css-selector...
Développement● Drupal Extension: misc stepsGiven /^the cache has been cleared$/Given /^I run cron$/https://drupal.org/proj...
DéveloppementDémo
DéveloppementConclusion:Utilisez BDD pour faire des tests de régressions.
Introduction aux tests de recette automatisésAvec lextension Drupal pour Behatdidier.boff@ows.frB2F @ drupal.orghttps://gi...
Upcoming SlideShare
Loading in …5
×

Drupal camp paris 2013: présentation de Behat, Mink et Drupal extension

3,131 views

Published on

Introduction aux tests de recette automatisés avec l'extension Drupal pour Behat

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
3,131
On SlideShare
0
From Embeds
0
Number of Embeds
270
Actions
Shares
0
Downloads
25
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Drupal camp paris 2013: présentation de Behat, Mink et Drupal extension

  1. 1. Introduction aux tests de recette automatisésAvec lextension Drupal pour Behatdidier.boff@ows.frB2F @ drupal.orghttps://github.com/B2Fhttp:///twitter.com/zenelse
  2. 2. Les joies du testQuand mon collègue avance sans plan de testhttp://lesjoiesdutest.tumblr.com
  3. 3. Plan● Retour dexpérience○ Campus France○ Divers outils démodés
  4. 4. Plan● Retour dexpérience○ Campus France○ Divers outils démodés● Méthodologie○ BDD, Gherkin
  5. 5. Plan● Retour dexpérience○ Campus France○ Divers outils démodés● Méthodologie○ BDD, Gherkin● Développement○ Behat/Mink○ MinkExtension (démo)○ DrupalExtension (démo)
  6. 6. Retour dexpériencewww.campusfrance.org● Migration Drupal 6 -> 7
  7. 7. Retour dexpériencewww.campusfrance.org● Migration Drupal 6 -> 7● 100 sites, domain access● multilingues
  8. 8. Retour dexpériencewww.campusfrance.org● Migration Drupal 6 -> 7● 100 sites, domain access● multilinguesQuels tests ?
  9. 9. Retour dexpérienceSeleniumAPI● click● type● select● addSelection● submit● ... http://release.seleniumhq.org/selenium-core/
  10. 10. Retour dexpérienceSeleniumIDE
  11. 11. Retour dexpérience?Test automatiséSeleniumIDE
  12. 12. Retour dexpérienceSeleniumIDE?Test automatiséMultidomaine
  13. 13. Retour dexpérienceSeleniumIDE?AJAXMultidomaineTest automatisé
  14. 14. Retour dexpérienceSelenium Serverhttp://docs.seleniumhq.org/download/java -jar selenium-server-standalone-<version-number>.jarhttp://selenium.googlecode.com/files/selenium-server-standalone-2.33.0.jar
  15. 15. Retour dexpérienceSelenium Server+ PHPUnitPHPUnit_Extensions_SeleniumTestCase
  16. 16. Retour dexpérienceSelenium Server+ PHPUnithttps://github.com/B2F/ows-phpunitclass OWSeleniumTestCase extendsPHPUnit_Extensions_SeleniumTestCase {public function __construct($name = NULL, array $data = array(),$dataName = ) {
  17. 17. Retour dexpérienceSelenium Server+ PHPUnit+ IDE
  18. 18. Retour dexpérienceSelenium Server+ PHPUnit+ IDE+Selenium IDE: PHP Formattershttps://github.com/brokenthumbs/PHP-Formatter
  19. 19. Retour dexpérienceSelenium Server+ PHPUnit+ IDE+Selenium IDE: PHP Formattershttps://github.com/brokenthumbs/PHP-Formatterhttps://github.com/B2F/PHP-Formatter
  20. 20. Les joies du testQuand je fais un test un peu trop compliqué pour un tructout simplehttp://lesjoiesdutest.tumblr.com
  21. 21. Les joies du testQuand je fais un test un peu tropcompliqué pour un truc tout simple ?
  22. 22. Les joies du testQuand je fais un test un peu tropcompliqué pour un truc tout simple
  23. 23. Les joies du testQuand je fais un test un peu tropcompliqué pour un truc tout simple19 content types
  24. 24. Les joies du testQuand je fais un test un peu tropcompliqué pour un truc tout simple...
  25. 25. Méthodologie● Behavior Driven Development (BDD)
  26. 26. Méthodologie● Behavior Driven Development (BDD)DrupalCon Portland 2013: BEHAT, BEHAVIORAL-DRIVEN DEVELOPMENT AND SELENIUM IN DRUPALRyan Weaverhttps://portland2013.drupal.org
  27. 27. Méthodologie● Gherkin
  28. 28. Méthodologie● Gherkin● Feature Suite de tests
  29. 29. Méthodologie● Gherkin● Feature○ Scenario Test
  30. 30. Méthodologie● Gherkin● Feature○ Scenario■ Given● And...Contexte
  31. 31. Méthodologie● Gherkin● Feature○ Scenario■ Given● And...ContexteGiven I am on "/restaurants"
  32. 32. Méthodologie● Gherkin● Feature○ Scenario■ Given● And...■ When● And...Évènements
  33. 33. Méthodologie● Gherkin● Feature○ Scenario■ Given● And...■ When● And...ÉvènementsAnd I enter "Vietnam" for "pays"And I enter "Bo Bun" for "plats"And I enter "Paris 13" for "lieu"
  34. 34. Méthodologie● Gherkin● Feature○ Scenario■ Given● And...■ When● And...■ Then● And...RésultatsThen I should see the text "Pho Bida"
  35. 35. Opened Blackbox● CucumberGherkin + Ruby
  36. 36. Opened Blackbox● Cucumber=Gherkin + Ruby
  37. 37. Opened Blackbox● CucumberGherkin + Ruby ?
  38. 38. Opened Blackbox● CucumberGherkin + PHP
  39. 39. Opened Blackbox● Behathttp://behat.org/=Gherkin + PHP
  40. 40. Opened Blackboxhttp://behat.org/<?phpuse BehatBehatContextBehatContextclass FeatureContext extends BehatContext{// /**// * @Given /^I have done something with "([^"]*)"$/// */// public function iHaveDoneSomethingWith($argument)// {// doSomethingWith($argument);// }}● Behat: ça fait quoi ?
  41. 41. Opened Blackboxhttp://behat.org/<?phpuse BehatBehatContextBehatContextclass FeatureContext extends BehatContext{// /**// * @Given /^I have done something with "([^"]*)"$/// */// public function iHaveDoneSomethingWith($argument)// {// doSomethingWith($argument);// }}● Behat: ça fait quoi ?
  42. 42. Opened Blackbox● MinkWeb acceptance testinghttp://mink.behat.org/
  43. 43. Opened Blackbox● Mink: drivers$driver = new BehatMinkDriverZombieDriver();http://mink.behat.org/
  44. 44. Opened Blackbox● Mink: drivers$driver = new BehatMinkDriverSahiDriver(firefox);http://mink.behat.org/
  45. 45. Opened Blackbox● Mink: drivers$driver = new BehatMinkDriverGoutteDriver();http://mink.behat.org/
  46. 46. Opened Blackbox● Mink: drivers$client = new SeleniumClient($host, $port);$driver = new BehatMinkDriverSeleniumDriver(firefox, base_url, $client);http://mink.behat.org/
  47. 47. Opened Blackbox● Mink: session// init session:$session = new BehatMinkSession($driver);// start session:$session->start();http://mink.behat.org/$session->visit(http://paris2013.drupalcamp.fr);
  48. 48. Opened Blackbox● Mink: méthodes$page = $session->getPage();$element = $page->find(css, a#selector);$element->getText();http://mink.behat.org/
  49. 49. Opened Blackbox● Mink: méthodes$page = $session->getPage();$element = $page->find(css, a#selector);$element->getText();http://mink.behat.org/
  50. 50. Développement● En pratiquehttp://mink.behat.org/Behat + Mink ?
  51. 51. Développement● Mink extensionhttp://mink.behat.org/=Behat + Mink
  52. 52. Développement● Mink extensionhttp://mink.behat.org/STEPS
  53. 53. Développement● Mink extensionhttp://mink.behat.org/Given /^(?:|I )am on (?:|the )homepage$/When /^(?:|I )go to (?:|the )homepage$/Given /^(?:|I )am on "(?P<page>[^"]+)"$/When /^(?:|I )go to "(?P<page>[^"]+)"$/When /^(?:|I )reload the page$/When /^(?:|I )move backward one page$/When /^(?:|I )move forward one page$/When /^(?:|I )press "(?P<button>(?:[^"]|")*)"$/When /^(?:|I )follow "(?P<link>(?:[^"]|")*)"$/When /^(?:|I )fill in "(?P<field>(?:[^"]|")*)" with "(?P<value>(?:[^"]|")*)"$/When /^(?:|I )fill in "(?P<field>(?:[^"]|")*)" with:$/When /^(?:|I )fill in "(?P<value>(?:[^"]|")*)" for "(?P<field>(?:[^"]|")*)"$/When /^(?:|I )fill in the following:$/When /^(?:|I )select "(?P<option>(?:[^"]|")*)" from "(?P<select>(?:[^"]|")*)"$/When /^(?:|I )additionally select "(?P<option>(?:[^"]|")*)" from "(?P<select>(?:[^"]|")*)"$/...bin/behat -dl
  54. 54. Développement● Mink extensionhttp://mink.behat.org/Presses button with specified id|name|title|alt|value.@When /^(?:|I )press "(?P<button>(?:[^"]|")*)"$/Clicks link with specified id|title|alt|text.@When /^(?:|I )follow "(?P<link>(?:[^"]|")*)"$/Behat/MinkExtension/Context/MinkContext.php
  55. 55. DéveloppementInstallationhttp://docs.behat.org/#cookbookDeveloping Web Applications with Behat and Mink
  56. 56. DéveloppementInstallationcomposer.json{"require": {"behat/behat": "2.4.*@stable","behat/mink": "1.4.*@stable","behat/mink-extension": "*","behat/mink-goutte-driver": "*","behat/mink-selenium2-driver": "*"},"minimum-stability": "dev","config": {"bin-dir": "bin/"}} http://docs.behat.org/cookbook/behat_and_mink.html
  57. 57. DéveloppementInstallation$ curl http://getcomposer.org/installer | php$ php composer.phar installhttp://docs.behat.org/cookbook/behat_and_mink.html
  58. 58. DéveloppementInstallation$ lsbin composer.json composer.lock composer.phar vendorhttp://docs.behat.org/cookbook/behat_and_mink.html
  59. 59. DéveloppementInstallation$ bin/behat --init-> features/
  60. 60. DéveloppementInstallation: suites de testsfeatures/{name}.featureFeature: un exempleQuelques steps pour illustrer une featureScenario: vérification quun lien est présentGiven I am at "/home"When I click "Se connecter"Then I should see "login"
  61. 61. DéveloppementInstallation: customisation$ bin/behat --init-> features/bootstrap/FeatureContext.php
  62. 62. DéveloppementInstallation: customisation# features/bootstrap/FeatureContext.php/*** Features context.*/class FeatureContext extends BehatContext{...
  63. 63. DéveloppementInstallation: customisation# features/bootstrap/FeatureContext.php/*** Features context.*/class FeatureContext extends BehatContext{...
  64. 64. DéveloppementInstallation: customisation# features/bootstrap/FeatureContext.php/*** Features context.*/class FeatureContext extends MinkContext{...
  65. 65. DéveloppementInstallation: subcontexts# features/bootstrap/FeatureContext.phpuse BehatMinkExtensionContextRawMinkContext;use BehatMinkExtensionContextMinkContext;class FeatureContext extends RawMinkContext{public function __construct(array $parameters){$this->useContext(mink, new MinkContext);}}http://extensions.behat.org/mink/
  66. 66. DéveloppementInstallation: subcontexts# features/bootstrap/FeatureContext.phpuse BehatMinkExtensionContextRawMinkContext;use BehatMinkExtensionContextMinkContext;class FeatureContext extends RawMinkContext{public function __construct(array $parameters){$this->useContext(mink, new MinkContext);}}http://extensions.behat.org/mink/
  67. 67. Développement● Mink stepsWhen will this be over ?http://mink.behat.org/
  68. 68. Développement● Mink stepsWhen I hover the element ?/*** @When /^I hover "([^"]*)"$/*/public function iHover($cssId){http://mink.behat.org/When will this be over ?
  69. 69. Développement● Mink steps/*** @When /^I hover "([^"]*)"$/*/public function iHover($cssId){$page = $this->getSession()->getPage();$element = $page->find(css, $cssId);http://mink.behat.org/api/behat/mink/element/nodeelement.html
  70. 70. Développement● Mink stepspublic function iHover($cssId){$page = $this->getSession()->getPage();$element = $page->find(css, $cssId);if (null === $element) {throw new ElementNotFoundException($this->getSession(), element, css, $}http://mink.behat.org/api/behat/mink/element/nodeelement.html
  71. 71. Développement● Mink steps__construct(Session session, string type, string selector, string locator)And I hover "a[title=abcdefghi]" # FeatureContext::iHover()Element matching css "a[title=abcdefghi]" not found.throw new ElementNotFoundException($this->getSession(), element, css, $cssId);http://mink.behat.org/api/behat/mink/element/nodeelement.html
  72. 72. Développement● Mink stepspublic function iHover($cssId){$page = $this->getSession()->getPage();$element = $page->find(css, $cssId);if (null === $element) {throw new ElementNotFoundException($this->getSession(), element, css, $cssId}$element->mouseOver();http://mink.behat.org/api/behat/mink/element/nodeelement.html
  73. 73. Développement● Mink stepspublic function iHover($cssId){$page = $this->getSession()->getPage();$element = $page->find(css, $cssId);if (null === $element) {throw new ElementNotFoundException($this->getSession(), element, css, $cssId}$element->mouseOver();Attention: Selenium supporte lemouseOver Javascript only :(http://mink.behat.org/api/behat/mink/element/nodeelement.html
  74. 74. Développement● Mink steps - AJAX/*** Waits some time or until JS condition turns true.** @param integer $time time in milliseconds* @param string $condition JS condition*/public function wait($time, $condition = false){$this->driver->wait($time, $condition);}http://mink.behat.org/api/source/behat/mink/session.php.html
  75. 75. Développement● Mink steps - AJAX/*** @When /^I wait (?P<timing>d+)sec$/*/public function iWaitNSec($timing) {$this->getSession()->wait($timing*1000);}http://mink.behat.org/api/source/behat/mink/session.php.html
  76. 76. Développement● Mink steps - AJAX/*** @When /^I wait (?P<timing>d+)sec$/*/public function iWaitNSec($timing) {$this->getSession()->wait($timing*1000);}http://mink.behat.org/api/source/behat/mink/session.php.html
  77. 77. DéveloppementDémobin/behat features/demo.feature
  78. 78. DéveloppementDémo: colored outputbin/behat --ansi features/demo.featurebehat arguments: http://docs.behat.org/guides/6.cli.html
  79. 79. Développement● OwsContexthttps://github.com/B2F/OwsContextpublic function iHover($cssId)public function iWaitNsec($timing)public function iClickTheElementMatching($selector)
  80. 80. Développement● OwsContexthttps://github.com/B2F/OwsContext+ (experimental)public function iWaitNSecForTheText($timing, $text)public function iSwitchToTheIframeNamed($iframe)public function iSwitchBackFromIframe()
  81. 81. DéveloppementConfiguration# behat.ymldefault:extensions:BehatMinkExtensionExtension:base_url: http://google.frgoutte: ~selenium2: ~
  82. 82. DéveloppementConfiguration● AJAX@javascriptScenario: vérification quun lien est présentGiven I am at "/home"When I follow "my account"Then I should see "my page title"
  83. 83. DéveloppementConfiguration● Profiles = overrides# behat.ymldefault:...custom:extensions:BehatMinkExtensionExtension:base_url: http://another-url.com
  84. 84. DéveloppementConfiguration● Profiles# bin/behat --profile=custom features/tests.feature
  85. 85. DéveloppementConfiguration● Filtres# behat.ymlcustom:...extensions:...filters:tags: "@custom-filter"
  86. 86. DéveloppementConfiguration● Filtres@javascript @custom-filterScenario: vérification quun lien est présentGiven I am at "/home"When I hover "Se connecter"Then I wait 1sec for the text "login"
  87. 87. Développement● Drupal Extensionhttps://drupal.org/project/drupalextension
  88. 88. Développement● Drupal Extension/*** Features context.*/class DrupalContext extends MinkContext implements DrupalAwareInterface {private $drupal, $drupalParameters;/*** Basic auth user and password.*/public $basic_auth;...https://drupal.org/project/drupalextension
  89. 89. Développement● Drupal Extension: installation# composer.json{"require": {"drupal/drupal-extension": "*"},"minimum-stability": "dev","config": {"bin-dir": "bin/"}}https://drupal.org/project/drupalextension
  90. 90. Développement● Drupal Extension: installtion$ curl http://getcomposer.org/installer | php$ php composer.phar installhttps://drupal.org/project/drupalextension
  91. 91. Développement● Drupal Extension: configuration#behat.ymldefault:paths:features: featuresextensions:BehatMinkExtensionExtension:goutte: ~selenium2: ~base_url: http://www.campusfrance.org/https://drupal.org/project/drupalextension
  92. 92. Développement● Drupal Extension: configuration#behat.ymldefault:paths:features: featuresextensions:BehatMinkExtensionExtension:goutte: ~selenium2: ~base_url: http://www.campusfrance.org/DrupalDrupalExtensionExtension:blackbox: ~https://drupal.org/project/drupalextension
  93. 93. Développement● Drupal Extension en pratiquebin/behat -dl => liste les stepshttps://drupal.org/project/drupalextension
  94. 94. Développement● Drupal Extension: user stepsGiven /^I am an anonymous user$/Given /^I am not logged in$/Given /^I am logged in as a user with the "(?P<role>[^"]*)" role$/https://drupal.org/project/drupalextension
  95. 95. Développement● Drupal Extension: configuration#behat.ymldefault:paths:features: featuresextensions:...DrupalDrupalExtensionExtension:blackbox: ~drush:alias: myDrushAliashttps://drupal.org/project/drupalextension
  96. 96. Opened blackbox● Drupal Extension: user steps# @see Drupal/DrupalExtension/Context/DrupalContext.php/*** Helper function to login the current user.*/public function login() {...$this->getSession()->visit($this->locatePath(/user));$element = $this->getSession()->getPage();$element->fillField($this->getDrupalText(username_field), $this->user->name);$element->fillField($this->getDrupalText(password_field), $this->user->pass);$submit = $element->findButton($this->getDrupalText(log_in));https://drupal.org/project/drupalextension
  97. 97. Développement● Drupal Extension: user steps#behat.ymlDrupalDrupalExtensionExtension:text:log_out: "Sign out"log_in: "Sign in"password_field: "Enter your password"username_field: "Nickname"https://drupal.org/project/drupalextension
  98. 98. Développement● Drupal Extension: content stepsGiven /^I am viewing (?:a|an) "(?P<type>[^"]*)" node with the title "(?P<title>[^"Given /^I am viewing (?:a|an) "(?P<vocabulary>[^"]*)" term with the name "(?P<name>[^"]*)"$/https://drupal.org/project/drupalextension
  99. 99. Développement● Drupal Extension: region stepsThen /^I should see the "(?P<heading>[^"]*)" heading in the "(?P<region>[^"]*)"(?:|regWhen /^I (?:follow|click) "(?P<link>[^"]*)" in the "(?P<region>[^"]*)"(?:| region)$/Then /^I should see the link "(?P<link>[^"]*)" in the "(?P<region>[^"]*)"(?:| region)$/Given /^I press "(?P<button>[^"]*)" in the "(?P<region>[^"]*)"(?:| region)$/https://drupal.org/project/drupalextension
  100. 100. Développement● Drupal Extension: region steps#behat.ymlDrupalDrupalExtensionExtension:region_map:My region: "#css-selector"Content: "#main .region-content"Right sidebar: "#sidebar-second"https://drupal.org/project/drupalextension
  101. 101. Développement● Drupal Extension: misc stepsGiven /^the cache has been cleared$/Given /^I run cron$/https://drupal.org/project/drupalextension
  102. 102. DéveloppementDémo
  103. 103. DéveloppementConclusion:Utilisez BDD pour faire des tests de régressions.
  104. 104. Introduction aux tests de recette automatisésAvec lextension Drupal pour Behatdidier.boff@ows.frB2F @ drupal.orghttps://github.com/B2Fhttp:///twitter.com/zenelseMerci de votre attention

×