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

PHP Cáceres - Pruebas Funcionales

0ef2c8342089d8f3e79d7b6cc9ab4b19?s=47 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.

0ef2c8342089d8f3e79d7b6cc9ab4b19?s=128

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. None
  3. None
  4. Tipos de tests

  5. Tests unitarios Mejorar calidad interna

  6. Tests unitarios Mejorar calidad interna Detectar problemas de diseño

  7. Tests unitarios Mejorar calidad interna Detectar problemas de diseño Garantizar

    lógica interna correcta
  8. Tests de integración Componente 3 Componente 4 Componente 5 Componente

    6 Componente 1 Componente 2
  9. Tests funcionales

  10. Tests manuales

  11. Tests de rendimiento

  12. Tests de infraestructura

  13. Pirámide ideal de testing

  14. ¿Por qué hacer tests funcionales?

  15. Cliente Equipo Queja Garantiza la calidad funcional del servicio

  16. Cliente Equipo Cliente Equipo Queja Solución Garantiza la calidad funcional

    del servicio
  17. Aumenta la satisfacción del cliente

  18. Mejora la vida del desarrollador y los que le rodean

  19. Elimina tareas repetitivas, reduciendo errores y esfuerzo

  20. Da confianza para incluir cambios funcionales

  21. "Pequeño trauma" al cubrir proyectos sin pruebas automáticas

  22. Documentación viva del proyecto

  23. 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
  24. Mientras desarrollo Cuando integro ramas en control de versiones Cuando

    hago cambios en producción / preproducción Periódicamente ¿Cuándo hacer tests funcionales?
  25. Elementos esperados Cadenas en contenido Respuestas Funcionamiento formularios Redirecciones Procesos

    ¿Qué debo testear?
  26. None
  27. No es necesario testear todo

  28. Tipos de navegadores

  29. Mink para tests funcionales con PHP

  30. Mink para tests funcionales con PHP Unifica la forma de

    comunicarse con varios tipos de navegadores
  31. Headless browser emulators (sin JS) Goutte Tests funcionales HBE (sin

    JS) HTTP
  32. Headless browser emulators (con JS) Zombie.js Phantom.js Tests funcionales HBE

    (sin JS) HTTP JS
  33. Browser controller Selenium Sahi Tests funcionales Browser Controller HTTP

  34. Instalando Mink (Composer) { "require": { "behat/mink": "1.6.*" } }

    <?php require_once '/path/to/Mink/vendor/autoload.php'; // ...
  35. Instalando Mink (Phar) $ wget https://github.com/downloads/Behat/Mink/mink.phar <?php require_once 'mink.phar'; //

    ...
  36. 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);
  37. Entendiendo Mink // init session: $session = new \Behat\Mink\Session($driver); //

    start session: $session->start(); Session (controlar el navegador)
  38. 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();
  39. 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)
  40. 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)
  41. 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
  42. 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)
  43. 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
  44. 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)
  45. Entendiendo Mink $xpath = $handler->selectorToXpath('xpath', '//html'); Selectors (XPATH)

  46. 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.
  47. 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.
  48. 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
  49. 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
  50. 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.
  51. Entendiendo Mink // obtener salida eliminando elementos HTML $plainText =

    $el->getText(); // obtiene la salida tal cual $html = $el->getHtml(); Manipulando la página
  52. 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
  53. Entendiendo Mink $el->click(); $el->doubleClick(); $el->rightClick(); $el->mouseOver(); $el->focus(); $el->blur(); Emulando el

    ratón
  54. Entendiendo Mink $el1 = $page->find(...); $el2 = $page->find(...); $el1->dragTo($el2); Drag

    & drop
  55. Gracias ;)