{"id":289,"date":"2014-01-21T22:40:25","date_gmt":"2014-01-21T21:40:25","guid":{"rendered":"http:\/\/www.dgcmedia.es\/blog\/?p=289"},"modified":"2014-01-21T22:50:14","modified_gmt":"2014-01-21T21:50:14","slug":"probar-tu-aplicacion-web-instalar-y-configurar-selenium-y-phpunit","status":"publish","type":"post","link":"https:\/\/www.dgcmedia.es\/blog\/probar-tu-aplicacion-web-instalar-y-configurar-selenium-y-phpunit\/","title":{"rendered":"Probar tu aplicaci\u00f3n web. Instalar y configurar Selenium y PHPUnit"},"content":{"rendered":"<p>Hoy vamos a tratar un tema interesante. Probar de forma eficiente una aplicaci\u00f3n web de cierta magnitud es un proceso complicado. Lo es m\u00e1s si \u00e9sta es actualizada con asiduidad, modificando procesos que pueden afectar a otros de forma indirecta, generando errores que no siempre son detectados.<\/p>\n<p>Para ello, podemos utilizar dos herramientas muy potentes que nos permitir\u00e1 generar test automatizados que podr\u00e1n ser ejecutados cuando lo creamos necesario.<\/p>\n<p>En primer lugar, <strong>PHPUnit\u00a0<\/strong>nos permite implementar test de forma r\u00e1pida, y nos facilita m\u00faltiples m\u00e9todos y funcionalidades que nos har\u00e1n tener un c\u00f3digo de mejor calidad y hace que su mantenimiento sea m\u00e1s sencillo.<\/p>\n<p>Un test b\u00e1sico de la clase Money ser\u00eda el siguiente:<\/p>\n<pre class=\"lang:php decode:true\" title=\"Clase Money y su test\">&lt;?php\r\nclass Money\r\n{\r\n    private $amount;\r\n\r\n    \/\/ ...\r\n\r\n    public function getAmount()\r\n    {\r\n        return $this-&gt;amount;\r\n    }\r\n\r\n    public function negate()\r\n    {\r\n        return new Money(-1 * $this-&gt;amount);\r\n    }\r\n\r\n    \/\/ ...\r\n}\r\n\r\nclass MoneyTest extends PHPUnit_Framework_TestCase\r\n{\r\n    \/\/ ...\r\n\r\n    public function testCanBeNegated()\r\n    {\r\n        \/\/ Arrange\r\n        $a = new Money(1);\r\n\r\n        \/\/ Act\r\n        $b = $a-&gt;negate();\r\n\r\n        \/\/ Assert\r\n        $this-&gt;assertEquals(-1, $b-&gt;getAmount());\r\n    }\r\n\r\n    \/\/ ...\r\n}<\/pre>\n<p>Y su ejecuci\u00f3n desde consola (de L\u00ednux)<\/p>\n<pre class=\"lang:sh decode:true\" title=\"Ejecuci\u00f3n del test desde consola\">\u279c phpunit --bootstrap src\/autoload.php tests\/MoneyTest\r\nPHPUnit 3.7.28 by Sebastian Bergmann.\r\n\r\n....................\r\n\r\nTime: 121 ms, Memory: 4.50Mb\r\n\r\nOK (20 tests, 39 assertions)<\/pre>\n<p>Para instalarlo desde consola, con ejecutar las cuatro siguientes l\u00edneas como administrador ser\u00eda suficiente:<\/p>\n<pre class=\"lang:sh decode:true\" title=\"Ejecuci\u00f3n de PHPUnit\">\u279c wget https:\/\/phar.phpunit.de\/phpunit.phar\r\n\r\n\u279c chmod +x phpunit.phar\r\n\r\n\u279c mv phpunit.phar \/usr\/local\/bin\/phpunit\r\n\r\n\u279c phpunit --version<\/pre>\n<p>Adem\u00e1s, estas l\u00edneas son requisito indispensable para utilizar nuestra siguiente herramienta.<\/p>\n<p><strong>Selenium<\/strong> comenz\u00f3 siendo un plugin de Firefox (sigue si\u00e9ndolo y lo utilizaremos para generar la base de nuestros scripts) pero al ver su extrema utilidad, se convirti\u00f3 en una herramienta desarrollada en m\u00faltiples lenguajes (PHP entre ellos)<\/p>\n<p>El plugin de Firefox (descargable <a title=\"Selenium para Firefox\" href=\"https:\/\/addons.mozilla.org\/es\/firefox\/addon\/selenium-expert-selenium-ide\/\" target=\"_blank\">aqu\u00ed<\/a>) nos permite grabar una navegaci\u00f3n por una p\u00e1gina o aplicaci\u00f3n web y reproducirla cuando queramos, modificando los objetivos del test, etc. Adem\u00e1s, nos permite exportar el script en el lenguaje que queramos, algo muy \u00fatil para poder modificar directamente los scripts en php y personalizarlos a nuestro gusto, adem\u00e1s de ejecutarlos directamente desde cualquier m\u00e1quina con linux.<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.dgcmedia.es\/blog\/wp-content\/uploads\/2014\/01\/selenium.png\"><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-291\" alt=\"Selenium IDE\" src=\"http:\/\/www.dgcmedia.es\/blog\/wp-content\/uploads\/2014\/01\/selenium.png\" width=\"700\" height=\"395\" srcset=\"https:\/\/www.dgcmedia.es\/blog\/wp-content\/uploads\/2014\/01\/selenium.png 700w, https:\/\/www.dgcmedia.es\/blog\/wp-content\/uploads\/2014\/01\/selenium-300x169.png 300w, https:\/\/www.dgcmedia.es\/blog\/wp-content\/uploads\/2014\/01\/selenium-500x282.png 500w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><\/a><\/p>\n<p style=\"text-align: left;\">Nos permite adem\u00e1s, probar desde m\u00faltiples navegadores. El requisito indispensable es que el navegador que queramos probar ha de estar instalado en el servidor, y \u00e9ste deber\u00eda tener interfaz gr\u00e1fica disponible (no lo he probado sin ella, por lo que no descarto que se pueda hacer un apa\u00f1o)<\/p>\n<p style=\"text-align: left;\">Otra de las ventajas, es que se pueden &#8220;automatizar&#8221; las pruebas a trav\u00e9s de procesos lanzados por herramientas como Jenkins o un simple cronjob.<\/p>\n<p style=\"text-align: left;\">Para instalarlo, adem\u00e1s de tener PHPUnit y el navegador con el que queramos testar la web, debemos descargarnos Selenium Server desde la siguiente <a title=\"Selenium Server Stand Alone\" href=\"https:\/\/code.google.com\/p\/selenium\/downloads\/detail?name=selenium-server-standalone-2.39.0.jar&amp;can=2&amp;q=\" target=\"_blank\">url<\/a><\/p>\n<p style=\"text-align: left;\">Una vez descargado, habr\u00eda que ejecutar la siguiente l\u00ednea en consola (supongo que ten\u00e9is java instalado en el servidor\/pc)<\/p>\n<pre class=\"lang:sh decode:true\">java -jar selenium-server-standalone-2.39.0.jar<\/pre>\n<p>Al hacerlo, montar\u00e1 un servidor de pruebas y nos indicar\u00e1 la ip (con host y uri) del mismo. Deberemos utilizarlo para lanzar nuestro script de tests.<\/p>\n<p>Os muestro uno de pruebas (que est\u00e1 incluido en la librer\u00eda adjunta)<\/p>\n<pre class=\"lang:php decode:true\" title=\"Ejemplo SELENIUM\">&lt;?php\r\nrequire_once('lib\/__init__.php');\r\n$host = 'http:\/\/localhost:4444\/wd\/hub'; \/\/ el host que nos indica Selenium Server\r\n$capabilities = array(WebDriverCapabilityType::BROWSER_NAME =&gt; 'firefox'); \/\/ debe estar instalado en el servidor\/pc\r\n$driver = RemoteWebDriver::create($host, $capabilities, 5000);\r\n\r\n\/\/ la web a testar, este blog\r\n$driver-&gt;get('http:\/\/www.dgcmedia.es\/blog');\r\n\r\n\/\/ a\u00f1adimos una cookie\r\n$driver-&gt;manage()-&gt;deleteAllCookies();\r\n$driver-&gt;manage()-&gt;addCookie(array(\r\n  'name' =&gt; 'cookie_name',\r\n  'value' =&gt; 'cookie_value',\r\n));\r\n$cookies = $driver-&gt;manage()-&gt;getCookies();\r\n\/\/ mostramos las cookies\r\nprint_r($cookies);\r\n\r\n\/\/ hacemos click en el logo para ir a la home de DGCmedia\r\n$link = $driver-&gt;findElement(\r\n  WebDriverBy::class('logo')\r\n);\r\n$link-&gt;click();\r\n\r\n\/\/ el t\u00edtulo de la p\u00e1gina\r\necho \"El t\u00edtulo de la home es.... \" . $driver-&gt;getTitle() . \"'\\n\";\r\n\r\n\/\/ y su url\r\necho \"La URL es... \" . $driver-&gt;getCurrentURL() . \"'\\n\";\r\n\r\n\/\/ Alg\u00fan ejemplo m\u00e1s, como buscar un input con id q\r\n$input = $driver-&gt;findElement(\r\n  WebDriverBy::id('q')\r\n);\r\n\/\/ rellenarlo con php y hacer submit en el form\r\n$input-&gt;sendKeys('php')-&gt;submit();\r\n\r\n\/\/ Esperar diez segundos a ver si hay resultado...\r\n$driver-&gt;wait(10)-&gt;until(\r\n  WebDriverExpectedCondition::presenceOfAllElementsLocatedBy(\r\n    WebDriverBy::className('gsc-result')\r\n  )\r\n);\r\n\r\n\/\/ Y fundamental, cerrar el proceso\r\n$driver-&gt;quit();<\/pre>\n<p>Gran parte del c\u00f3digo podemos generarlo autom\u00e1ticamente desde el plugin de Firefox, pero es bastante intuitivo y sencillo, aunque hacer una buena bater\u00eda de test en Selenium es un proceso largo y costoso.<\/p>\n<p>Os dejo el ejemplo anterior y las librer\u00edas necesarias (desarrolladas por Facebook para sus pruebas en PHP) en el siguiente <a title=\"Selenium en PHP\" href=\"http:\/\/dgcmedia.es\/recursosExternos\/php-webdriver-master.zip\" target=\"_blank\">enlace<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoy vamos a tratar un tema interesante. Probar de forma eficiente una aplicaci\u00f3n web de cierta magnitud es un proceso complicado. Lo es m\u00e1s si \u00e9sta es actualizada con asiduidad, modificando procesos que pueden afectar a otros de forma indirecta, &hellip; <a href=\"https:\/\/www.dgcmedia.es\/blog\/probar-tu-aplicacion-web-instalar-y-configurar-selenium-y-phpunit\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[37,23,139],"tags":[145,144,25,141,142,140,143],"_links":{"self":[{"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/posts\/289"}],"collection":[{"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/comments?post=289"}],"version-history":[{"count":6,"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/posts\/289\/revisions"}],"predecessor-version":[{"id":296,"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/posts\/289\/revisions\/296"}],"wp:attachment":[{"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/media?parent=289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/categories?post=289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dgcmedia.es\/blog\/wp-json\/wp\/v2\/tags?post=289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}