Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP Cáceres - Pruebas Funcionales

alvaromg
October 28, 2014

PHP Cáceres - Pruebas Funcionales

Como profesionales es nuestra responsabilidad aportar soluciones de calidad a nuestros clientes. Para conseguirlo es imprescindible cubrir nuestras aplicaciones con pruebas automáticas de todo tipo que verifiquen el correcto funcionamiento en el futuro. Nos centraremos en las pruebas funcionales, que comprueban la capa más alta de nuestra aplicación, y veremos las distintas herramientas disponibles en un ecosistema PHP.

alvaromg

October 28, 2014
Tweet

More Decks by alvaromg

Other Decks in Technology

Transcript

  1. Álvaro de la Mata González CTO y Scrum Master Intexdev

    SL Grupo Intexmedia @_alvaromg Pruebas Funcionales
  2. Requiere tener entornos replicados de producción Alta probabilidad de tener

    tests redundantes No garantiza el correcto funcionamiento de la lógica interna Son frágiles Inconvenientes
  3. Mientras desarrollo Cuando integro ramas en control de versiones Cuando

    hago cambios en producción / preproducción Periódicamente ¿Cuándo hacer tests funcionales?
  4. Mink para tests funcionales con PHP Unifica la forma de

    comunicarse con varios tipos de navegadores
  5. Instalando Mink (Composer) { "require": { "behat/mink": "1.6.*" } }

    <?php require_once '/path/to/Mink/vendor/autoload.php'; // ...
  6. Entendiendo Mink $driver = new \Behat\Mink\Driver\GoutteDriver(); Driver Nuestros tests funcionales

    se comunican con los navegadores a través de los drivers. Todoº driver implementa la interfaz definida en: Behat\Mink\Driver\DriverInterface $clientOptions = array(); $client = new \Behat\Mink\Driver\Goutte\Client(); $client->setClient(new \Guzzle\Http\Client('', $clientOptions)); $driver = new \Behat\Mink\Driver\GoutteDriver($client);
  7. Entendiendo Mink // init session: $session = new \Behat\Mink\Session($driver); //

    start session: $session->start(); Session (controlar el navegador)
  8. Entendiendo Mink Session (controlar el navegador) // open some page

    in browser: $session->visit('http://my_project.dev/some_page.php'); // get the current page URL: echo $session->getCurrentUrl(); // get the response status code: echo $session->getStatusCode(); // get page content: echo $session->getPage()->getContent();
  9. Entendiendo Mink // open another page: $session->visit('http://my_project.dev/second_page.php'); // use history

    controls: $session->reload(); $session->back(); $session->forward(); // evaluate JS expression: echo $session->evaluateScript( "return 'something from browser';" ); // wait for n milliseconds or // till JS expression becomes true: $session->wait( 5000, "$('.suggestions-results').children().length > 0" ); Session (controlar la sesión)
  10. Entendiendo Mink // setting browser language: $session->setRequestHeader('Accept-Language', 'fr'); // retrieving

    response headers: print_r($session->getResponseHeaders()); // set cookie: $session->setCookie('cookie name', 'value'); // get cookie: echo $session->getCookie('cookie name'); // delete cookie: $session->setCookie('cookie name', null); Session (controlar la sesión)
  11. Entendiendo Mink $mink = new \Behat\Mink\Mink(); $mink->registerSession('goutte', $goutteSession); $mink->registerSession('sahi', $sahiSession);

    $mink->setDefaultSessionName('goutte'); // ... $mink->getSession('goutte')->visit('http://my_project.dev/'); $mink->getSession('sahi')->visit('http://my_project.dev/'); Múltiples sesiones
  12. Entendiendo Mink $selector = new \Behat\Mink\Selector\NamedSelector(); $handler = new \Behat\Mink\Selector\SelectorsHandler(array(

    'named' => $selector )); // XPath query to find the fieldset: $xpath1 = $selector->translateToXPath( array('fieldset', 'id|legend') ); $xpath1 = $handler->selectorToXpath('named', array('fieldset', 'id|legend') ); // XPath query to find the field: $xpath2 = $selector->translateToXPath( array('field', 'id|name|value|label') ); $xpath2 = $handler->selectorToXpath('named', array('field', 'id|name|value|label') ); Selectors (Named)
  13. Entendiendo Mink Selectors (Named) Existen varios selectores muy útiles: •

    link - encontrar un enlace por href, id, title, img alt o value • button - encontrar un botón por name, id, value, img alt o title • link_or_button - para buscar enlaces y botones • content - para encontrar contenido específico (texto) • select - para encontrar un elemento select por id, name o label • checkbox - para encontrar un checkbox por id, name, or label • radio - para encontrar un radio button por id, name, o label • file - para encontrar un file input por id, name, o label • optgroup - para encontrar elementos optgroup por label • option - para encontrar elementos option por contenido • table - para encontrar una tabla por id o caption
  14. Entendiendo Mink $cssSelector = new \Behat\Mink\Selector\CssSelector(); // generate XPath query

    out of CSS: echo $cssSelector->translateToXPath('h1 > a'); $handler = new \Behat\Mink\Selector\SelectorsHandler(); $handler->registerSelector('css', $cssSelector); // generate XPath query out of CSS: echo $handler->selectorToXpath('css', 'h1 > a'); Selectors (CSS)
  15. Entendiendo Mink $page = $session->getPage(); $page = $mink->getSession('sahi')->getPage(); $fieldElement =

    $page->find('named', array('field', 'id|name|value|label') ); $elementByCss = $page->find('css', 'h3 > a'); Métodos find* El método find() evalúa un selector en el contenido de la página y devuelve el último elemento que coincida. Si no encuentra ninguno devuelve null.
  16. Entendiendo Mink $page = $session->getPage(); $page = $mink->getSession('sahi')->getPage(); $fieldElement =

    $page->find('named', array('field', 'id|name|value|label') ); $elementByCss = $page->find('css', 'h3 > a'); Métodos find* El método findAll() evalúa un selector en el contenido de la página y devuelve un array con los elementos que lo cumplan.
  17. Entendiendo Mink Métodos find* Existen varios atajos útiles: • findById()

    - busca un elemento por ID • findLink() - busca un elemento enlace con el link named selector • findButton() - busca un elemento button con el button named selector • findField() - busca un campo con el field named selector
  18. Entendiendo Mink $registerForm = $page->find('css', 'form.register'); // find some field

    INSIDE form with class="register" $field = $registerForm->findField('id|name|value|label'); Consultas anidadas
  19. Entendiendo Mink $el = $page->find('css', '.something'); // get tag name:

    echo $el->getTagName(); // check that element has href attribute: $el->hasAttribute('href'); // get element's href attribute: echo $el->getAttribute('href'); Manipulando la página Behat\Mink\Element\NodeElement proporciona métodos útiles para trabajar con los nodos de la página.
  20. Entendiendo Mink // obtener salida eliminando elementos HTML $plainText =

    $el->getText(); // obtiene la salida tal cual $html = $el->getHtml(); Manipulando la página
  21. Entendiendo Mink // check/uncheck checkbox: if ($el->isChecked()) { $el->uncheck(); }

    $el->check(); // select option in select: $el->selectOption('option value'); // attach file to file input: $el->attachFile('/path/to/file'); // get input value: echo $el->getValue(); // set intput value: $el->setValue('some val'); // press the button: $el->press(); Manipulando formularios