{"id":51612,"date":"2019-01-20T17:40:45","date_gmt":"2019-01-20T16:40:45","guid":{"rendered":"http:\/\/www.nerdilandia.com\/?p=51612"},"modified":"2019-01-20T17:40:45","modified_gmt":"2019-01-20T16:40:45","slug":"programando-test-e2e-aplicaciones-angular-protractor","status":"publish","type":"post","link":"https:\/\/nerdilandia.com\/index.php\/2019\/01\/20\/programando-test-e2e-aplicaciones-angular-protractor\/","title":{"rendered":"Programando test e2e para aplicaciones Angular con Protractor"},"content":{"rendered":"<p><strong>Un buen developer mobile debe exigirse siempre\u00a0ser lo m\u00e1s eficiente posible a la hora de crear una app.<\/strong>\u00a0En los desarrollos de hoy en d\u00eda ya no podemos invertir mucho tiempo\u00a0buscando\u00a0<em>bugs<\/em>, errores o simplemente funcionalidad que no funciona como\u00a0deber\u00eda. Para que esto no ocurra,\u00a0<strong>es importante tener nuestro\u00a0c\u00f3digo limpio\u00a0y\u00a0haberlo probado con anterioridad.<\/strong>\u00a0Una forma de probar nuestras aplicaciones es ir ejecutando y realizando los\u00a0pasos necesarios para comprobar que todo est\u00e1 como se hab\u00eda definido. Pero,<strong>\u00a0\u00bfy si pudi\u00e9ramos automatizar nuestras pruebas E2E y no tener que ejecutar\u00a0las pruebas de forma manual?\u00a0<\/strong><\/p>\n<p>Como ya sabr\u00e9is, las pruebas son esenciales para saber c\u00f3mo funciona la\u00a0aplicaci\u00f3n.\u00a0Vamos a ver\u00a0<strong>c\u00f3mo configurar y automatizar nuestras pruebas de extremo a\u00a0extremo comprobando que todo nuestro sistema funciona como deber\u00eda\u00a0hacerlo.<\/strong>\u00a0Para esto vamos a utilizar\u00a0<strong><a href=\"http:\/\/www.protractortest.org\/#\/\" target=\"_blank\">Protractor\u00a0<\/a>como framework de pruebas E2E.<\/strong>\u00a0Protractor est\u00e1 construido sobre\u00a0<a href=\"http:\/\/www.seleniumhq.org\/projects\/webdriver\/\" target=\"_blank\">Selenium WebDriver<\/a>\u00a0y utiliza el framework\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Jasmine_(JavaScript_testing_framework)\" target=\"_blank\">Jasmine<\/a>.<\/p>\n<h3>INSTALACI\u00d3N<\/h3>\n<p>Usaremos npm para\u00a0<strong>instalar Protractor<\/strong>\u00a0de forma global:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-17859\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/0.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/0.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/0-150x3.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/0-300x6.png 300w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/0-768x15.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/0-330x6.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/0-736x14.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/0-414x8.png 414w\" alt=\"protactor slashmobility\" width=\"1000\" height=\"19\" \/><\/p>\n<p><strong>Esto nos instalar\u00e1 dos herramientas: Protractor y Webdriver-Manager<\/strong>.\u00a0La herramienta Webdriver-Manager nos proporciona una forma sencilla de\u00a0obtener una instancia del servidor de Selenium.\u00a0Nos descargamos los binarios necesarios:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17858\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/1.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/1.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/1-150x3.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/1-300x6.png 300w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/1-768x15.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/1-330x6.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/1-736x14.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/1-414x8.png 414w\" alt=\"Protactor slashmobility\" width=\"1000\" height=\"19\" \/><\/p>\n<p>Arrancamos el servidor con el siguiente comando:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17860\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/2.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/2.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/2-150x3.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/2-768x15.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/2-330x6.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/2-736x14.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/2-414x8.png 414w\" alt=\"protactor slashmobility\" width=\"1000\" height=\"19\" \/><\/p>\n<p>Esto levantar\u00e1 el servidor de Selenium en el que vamos a probar.<\/p>\n<h3>CONFIGURACI\u00d3N<\/h3>\n<p><strong>Protractor necesita un fichero de configuraci\u00f3n que le indica c\u00f3mo ejecutar,\u00a0c\u00f3mo conectar con Selenium, etc.<\/strong>\u00a0Una buena pr\u00e1ctica es crearnos un directorio dentro de nuestro proyecto donde\u00a0estar\u00e1n todos los tests y configuraciones. En nuestro caso nos creamos un\u00a0directorios llamado \u201ctests\u201d.\u00a0Dentro del cual, crearemos un fichero llamado conf.js que ser\u00e1 el\u00a0fichero de configuraci\u00f3n que utilizar\u00e1 Protractor. Una vez creado, dentro de\u00a0nuestro fichero a\u00f1adiremos:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17869\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/3.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/3.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/3-150x16.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/3-768x81.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/3-330x35.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/3-736x77.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/3-414x43.png 414w\" alt=\"protactor slashmobility\" width=\"1000\" height=\"105\" \/><\/p>\n<p>Como vemos en el fichero, en este caso le indicamos el framework que\u00a0utilizar\u00e1, la direcci\u00f3n del servidor Selenium y los ficheros de tests que vamos a\u00a0ejecutar. Nuestro fichero de test para este ejemplo se llamar\u00e1 login.js. Adem\u00e1s, se pueden configurar muchas m\u00e1s cosas, por ejemplo, el navegador\u00a0en donde queremos que se ejecuten las pruebas, la url base de nuestro\u00a0proyecto, etc. Si queremos a\u00f1adir directamente en que navegador queremos\u00a0ejecutar las pruebas s\u00f3lo necesitaremos agregarlo al fichero de conf.js<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17863\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/4-1.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/4-1.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/4-1-150x29.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/4-1-300x57.png 300w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/4-1-768x147.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/4-1-330x63.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/4-1-736x141.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/4-1-414x79.png 414w\" alt=\"protactor slashmobility\" width=\"1000\" height=\"191\" \/><\/p>\n<h3>TEST<\/h3>\n<p>Para escribir nuestros test, vamos a crearnos un fichero llamado login.js donde\u00a0introduciremos las pruebas que deber\u00e1 pasar nuestra aplicaci\u00f3n. En nuestro\u00a0caso, nosotros separamos las pruebas por funcionalidad, al igual que se separa\u00a0las funcionalidad de nuestro proyecto. Para esta prueba simplemente nos\u00a0crearemos el fichero login.js.\u00a0En este ejemplo nos vamos a basar en que nuestra aplicaci\u00f3n tendr\u00e1 una vista\u00a0de login en la cual deberemos introducir el username, un password y pulsar un\u00a0bot\u00f3n para loguearnos.<\/p>\n<p>Dentro de nuestro fichero introduciremos:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17862\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/5.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/5.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/5-150x82.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/5-768x419.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/5-330x180.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/5-736x401.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/5-414x226.png 414w\" alt=\"protactor\" width=\"1000\" height=\"545\" \/><\/p>\n<p>Vamos a ver el c\u00f3digo escrito.\u00a0Como vemos utilizamos Jasmine para escribir nuestros tests, cada test deber\u00e1\u00a0contener\u00a0<em>describe.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17864\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/6.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/6.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/6-150x3.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/6-300x6.png 300w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/6-768x15.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/6-330x6.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/6-736x14.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/6-414x8.png 414w\" alt=\"protactor slashmobility \" width=\"1000\" height=\"19\" \/><\/p>\n<p>En nuestro caso definimos tres variables que utilizaremos para los distintos\u00a0casos de pruebas que vamos a realizar.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17865\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/7.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/7.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/7-150x3.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/7-300x6.png 300w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/7-768x15.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/7-330x6.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/7-736x14.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/7-414x8.png 414w\" alt=\"protactor slashmobility\" width=\"1000\" height=\"19\" \/><\/p>\n<p>Utilizando\u00a0<em>beforeEach<\/em>\u00a0le estamos diciendo que ejecute el c\u00f3digo dentro antes\u00a0de comenzar a validar las pruebas.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17866\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/8.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/8.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/8-150x19.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/8-768x97.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/8-330x42.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/8-736x93.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/8-414x52.png 414w\" alt=\"protactor slashmobility\" width=\"1000\" height=\"126\" \/><\/p>\n<p>Le estamos indicando que se sit\u00fae en la url \u201c<em>\/login<\/em>\u201d y asigne a nuestras\u00a0variables los elementos de la vista. Tendremos los elementos de<em>\u00a0username<\/em>\u00a0y\u00a0<em>password<\/em>, los cuales hemos identificado en la vista con ng-\u00a0model=\u2018username\u2019 y ng-model=\u2018password\u2019. Nuestro bot\u00f3n para\u00a0loguearnos lo definimos de esta forma en la vista &lt;button ng-\u00a0click=\u2018login()\u2019&gt;Entrar&lt;\/button&gt;<\/p>\n<p>Una vez hemos obtenido los elementos de nuestra vista, vamos a definir la\u00a0prueba que debemos pasar. El primer caso que vamos a comprobar es que\u00a0intente logarse con un usuario y contrase\u00f1a incorrecto y en tal caso muestre un\u00a0<em>popup<\/em>\u00a0con un error.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17870\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/9.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/9.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/9-150x29.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/9-300x57.png 300w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/9-768x147.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/9-330x63.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/9-736x141.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/9-414x79.png 414w\" alt=\"protactor slashmobility\" width=\"1000\" height=\"191\" \/><\/p>\n<p>Nuestra prueba deber\u00e1 contener<em>\u00a0it<\/em>\u00a0que definir\u00e1 la prueba que estamos\u00a0comprobando y un\u00a0<em>expect<\/em>\u00a0que ser\u00e1 lo que esperamos de esa prueba. Dentro\u00a0de cada prueba se puede definir varios\u00a0<em>expect<\/em>, pero hacer esto nos dificultar\u00e1\u00a0a la hora de ver cuando algo no se ha realizado correctamente.<\/p>\n<p>Dentro de nuestra prueba asignamos los valores para realizar la prueba.\u00a0Introducimos para el\u00a0<em>username \u201cadmin\u201d<\/em>\u00a0y para el\u00a0<em>password \u201cfail\u201d<\/em>\u00a0para que no\u00a0sea capaz de loguearse. Una vez asignados estos valores, le indicaremos al\u00a0bot\u00f3n que haga click y esperamos a que aparezca un\u00a0<em>popup<\/em>\u00a0con el error.<\/p>\n<p>Para el caso contrario, es decir, donde se loguea correctamente:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17867\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/10.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/10.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/10-150x26.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/10-768x132.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/10-330x57.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/10-736x127.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/10-414x71.png 414w\" alt=\"protactor slashmobility\" width=\"1000\" height=\"172\" \/><\/p>\n<p>Vemos que asignamos los datos correctos tanto para el username y el\u00a0password y una vez hacemos click en el bot\u00f3n comprobamos que se ha\u00a0logueado y ha navegado a la url \u201c\/home\u201d<\/p>\n<p>Al finalizar de configurar y escribir los tests que necesitamos que pase nuestra\u00a0aplicaci\u00f3n deberemos ejecutarlas. Teniendo el servidor de Selenium iniciado\u00a0ejecutaremos el comando:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-17868\" src=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/11.png\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" srcset=\"https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/11.png 1000w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/11-150x3.png 150w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/11-768x15.png 768w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/11-330x6.png 330w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/11-736x14.png 736w, https:\/\/slashmobility.com\/wp-content\/uploads\/2016\/05\/11-414x8.png 414w\" alt=\"protactor slashmobility\" width=\"1000\" height=\"19\" \/><\/p>\n<p>Esto iniciar\u00e1 las pruebas en el navegador que le hayamos indicado y podremos\u00a0ver en la consola el resultado de las pruebas realizadas.<\/p>\n<p>Con esto hemos visto un ejemplo de c\u00f3mo crear, con Protractor, nuestras\u00a0pruebas E2E con AngularJS. Protractor es un framework muy potente y con\u00a0una gran comunidad detr\u00e1s que nos hace pensar que acabar\u00e1 convirti\u00e9ndose en el framework oficial\u00a0de pruebas E2E para AngularJS.<\/p>\n<p>Y vosotros \u00bfos un\u00eds a la comunidad de Protractor?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un buen developer mobile debe exigirse siempre\u00a0ser lo m\u00e1s eficiente posible a la hora de crear una app.\u00a0En los desarrollos de hoy en d\u00eda ya no podemos invertir mucho tiempo\u00a0buscando\u00a0bugs, errores o simplemente funcionalidad que no funciona como\u00a0deber\u00eda. Para que &#8230; <a class=\"styledbutton\" href=\"https:\/\/nerdilandia.com\/index.php\/2019\/01\/20\/programando-test-e2e-aplicaciones-angular-protractor\/\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":1,"featured_media":51613,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[72,107],"class_list":["post-51612","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-app-moviles","tag-aprendizaje","tag-internet"],"_links":{"self":[{"href":"https:\/\/nerdilandia.com\/index.php\/wp-json\/wp\/v2\/posts\/51612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nerdilandia.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nerdilandia.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nerdilandia.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nerdilandia.com\/index.php\/wp-json\/wp\/v2\/comments?post=51612"}],"version-history":[{"count":0,"href":"https:\/\/nerdilandia.com\/index.php\/wp-json\/wp\/v2\/posts\/51612\/revisions"}],"wp:attachment":[{"href":"https:\/\/nerdilandia.com\/index.php\/wp-json\/wp\/v2\/media?parent=51612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nerdilandia.com\/index.php\/wp-json\/wp\/v2\/categories?post=51612"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nerdilandia.com\/index.php\/wp-json\/wp\/v2\/tags?post=51612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}