{"id":2291,"date":"2014-04-03T11:45:37","date_gmt":"2014-04-03T11:45:37","guid":{"rendered":"http:\/\/www.fractaliasystems.com\/1868-revision-v1\/"},"modified":"2023-10-11T09:43:19","modified_gmt":"2023-10-11T09:43:19","slug":"desarrollo-dirigido-por-test-tdd-12","status":"publish","type":"post","link":"https:\/\/fractaliasystems.com\/en\/desarrollo-dirigido-por-test-tdd-12\/","title":{"rendered":"Desarrollo dirigido por Test (TDD) 1\/2"},"content":{"rendered":"<p>El sistema llamada TDD (Test Driver Developer o Desarrollo Dirigido por Test) es una nueva metodolog\u00eda para <b>trabajar en el desarrollo web<\/b> basado en la idea de desarrollar pruebas, codificar y refactorizar el c\u00f3digo construido. El TDD establece un <b>nuevo modelo<\/b> esencial para <b>la productividad<\/b> que aporta resultados m\u00e1s legibles, menos redundantes y f\u00e1ciles de mantener, que hace posible que nuestras aplicaciones den un salto de calidad considerable.<!--more--><\/p>\n<p>Este tutorial desea aportar las bases necesarias para seguir esta metodolog\u00eda, en concreto se van a indicar los pasos necesarios para realizar pruebas TDD en aplicaciones web efectuadas sobre Angular js (framework JavaScript) y Node js (entorno JavaScript de lado del servidor).<\/p>\n<p>Por el momento se han identificado <b>tres modos<\/b> de efectuar las pruebas, dos desde el lado del cliente y una desde el lado del servidor. Estos m\u00e9todos son:<\/p>\n<ul>\n<li>Jasmine &#8211; Independiente en el lado del cliente<\/li>\n<li>Karma &#8211; Usando Jasmine en el lado del cliente<\/li>\n<li>Jamine &#8211; \u00a0node en el lado del servidor<\/li>\n<\/ul>\n<p><b>\u00bfQu\u00e9 es Jasmine?<\/b><\/p>\n<p><b><\/b>Jasmine es un framework de pruebas de comportamiento que nos ofrece herramientas para poner a prueba nuestro c\u00f3digo. Por ejemplo, si lo que necesitamos es saber si nuestra funci\u00f3n devuelve true, podemos usar esta estructura sin necesidad de introducir ning\u00fan de introducir ning\u00fan otro dato.<\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-281\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd1.png\" alt=\"tdd1. C\u00f3digo ejemplo\" width=\"456\" height=\"86\" \/><\/a><\/p>\n<p>En este caso, esperamos que nuestra funci\u00f3n devuelva <b>true<\/b>, por lo que debemos ejecutar dicha funci\u00f3n y comprobar la salida con toBe\u00a0 para ver si es realmente cierto. Por lo que si nuestra funci\u00f3n devuelve true, deber\u00edamos ver una salida como esta:<\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-282\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd2.png\" alt=\"TDD2. C\u00f3digo ejemplo\" width=\"299\" height=\"33\" \/><\/a><\/p>\n<p><b>\u00bfQu\u00e9 es Karma?<\/b><\/p>\n<p>Karma es un corrector de pruebas que usa el framework de pruebas para ayudar al desarrollador a evitar el desarrollo de configuraciones complejas y crea un flujo de trabajo din\u00e1mico que permite ahorrar tiempo y esfuerzo. Funciona principalmente analizando nuestras fuentes y pruebas de c\u00f3digo y ejecutando los test autom\u00e1ticamente. Por ejemplo, podemos probar nuestro c\u00f3digo en distintos navegadores o podemos excluir archivos en nuestras pruebas.<\/p>\n<p><b>\u00bfQu\u00e9 es Jasmine- Node?<\/b><\/p>\n<p>B\u00e1sicamente, podemos definir Jasmine-Node, como el puerto de Jasmine al nodo, muy \u00fatil para la realizaci\u00f3n de pruebas de funcionalidades en el lado del servidor.<\/p>\n<p><b>\u00bfC\u00f3mo obtener las herramientas?<\/b><\/p>\n<ul>\n<li>Para instalar Jasmine y utilizarlo de modo independiente en el lado del cliente s\u00f3lo se debe de ir al sitio web y descargar el zip.<\/li>\n<li>Para instalar Karma, necesitamos tener instalado previamente Node js. Y posteriormente debemos utilizar <b>npm<\/b> para instalarlo. Se recomienda instalarlo a nivel global ya que se va a utilizar como una herramienta del lado del terminal.<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-283\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd3.png\" alt=\"TDD3. C\u00f3digo ejemplo\" width=\"267\" height=\"31\" \/><\/a><\/li>\n<\/ul>\n<ul>\n<li>Para instalar Jasmine-Node, usamos de nuevo el terminal y npm. En este caso tambi\u00e9n se recomienda instalarlo de forma global para poder usarlo en el terminal.<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-284\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd4.png\" alt=\"TDD4. C\u00f3digo ejemplo\" width=\"316\" height=\"29\" \/><\/a><\/li>\n<\/ul>\n<p><b>\u00bfC\u00f3mo integrar las herramientas en un proyecto existente?<\/b><\/p>\n<p>Pongamos un ejemplo de una aplicaci\u00f3n web sencilla desarrollada con Angular js, con la siguiente estructura:<\/p>\n<p><b>\u00a0<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-286\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd5.png\" alt=\"TDD5. C\u00f3digo ejemplo\" width=\"235\" height=\"140\" \/><\/a><\/b><\/p>\n<p><b>Jasmine empleado \u00fanicamente como soporte<\/b><\/p>\n<p>Este m\u00e9todo es la forma m\u00e1s f\u00e1cil de ejecutar pruebas unitarias en dos situaciones diferentes, o bien cuando el c\u00f3digo a analizar no es demasiado extenso o bien cuando no es demasiado complicado. Una vez que se haya descargado Jasmine, s\u00f3lo ser\u00e1 necesario descomprimirlo y comprobar su estructura interna. Esto es lo que obtendremos:<\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/Jasmine.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-356\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/Jasmine.png\" alt=\"C\u00f3digo ejemplo Jasmine\" width=\"191\" height=\"110\" \/><\/a><\/p>\n<p>A continuaci\u00f3n, emplearemos la carpeta Jasmine 2.0.0 (que contiene los archivos que hacen posible que las pruebas funcionen) y SpecRunner.html (p\u00e1gina web que integra todos los archivos que necesitamos y muestra los resultados de la prueba en el navegador). El resto de carpetas \/spec y \/rsc contienen las especificaciones.<\/p>\n<p>Nosotros en este ejemplo que presentamos, no vamos a utilizar las carpetas \/spec y \/src pero nos pueden dar una primera idea de la estructura de carpetas disponibles en Jasmine 2.0.0. Este programa contiene una carpeta de especificaciones donde estar\u00e1 localizado el c\u00f3digo original de nuestra aplicaci\u00f3n. As\u00ed lo que necesitamos, es integrar Jasmine en nuestra aplicaci\u00f3n, introduciendo la carpeta Jasmine 2.0.0 en nuestra carpeta <b>libs<\/b> y la p\u00e1gina SpecRummer.html en la carpeta principal de la aplicaci\u00f3n. Una vez efectuada esta operaci\u00f3n, nuestra nueva estructura del proyecto ser\u00e1:<\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd7.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-289\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd7.png\" alt=\"TDD7. C\u00f3digo ejemplo\" width=\"255\" height=\"197\" \/><\/a><\/p>\n<p><b>Importante:<\/b> cuando creemos los archivos de test o pruebas, es necesario mantener la <b>misma nomenclatura siempre<\/b> para poder utilizar los mismos archivos en todas las pruebas. Siempre es necesario <b>terminar con el nombre spec.js<\/b>.<\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd8.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-290\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd8.png\" alt=\"TDD8. C\u00f3digo ejemplo\" width=\"266\" height=\"110\" \/><\/a><\/p>\n<p>Asique ahora tenemos dos acciones m\u00e1s que efectuar sobre nuestro c\u00f3digo:<\/p>\n<ul>\n<li>Configurar el archivo SpecRunner.html para que apunte a las carpetas y los archivos adecuados.<\/li>\n<li>Poner en marcha el sitio de pruebas en nuestro navegador para probar nuestra aplicaci\u00f3n.<\/li>\n<\/ul>\n<p>Para configurar el archivo SpecRunner.html tendremos que cambiar la cabecera que aparece por defecto por la cabecera espec\u00edfica que necesitamos. El encabezado por defecto est\u00e1 configurado para ejecutar el ejemplo que viene en el c\u00f3digo de Jasmine y tiene la siguiente apariencia:<\/p>\n<p><i>El estilo para el sitio de la prueba<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd9.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-291\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd9.png\" alt=\"TDD9. C\u00f3digo ejemplo\" width=\"653\" height=\"24\" \/><\/a><\/i><\/p>\n<p><i>Los archivos de Jasmine contenidos en la carpeta de Jasmine 2.0.0.<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd10.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-292\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd10.png\" alt=\"TDD10. C\u00f3digo ejemplo\" width=\"718\" height=\"54\" \/><\/a><\/i><\/p>\n<p><i>Los archivos de or\u00edgenes de nuestra aplicaci\u00f3n.<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd11.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-293\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd11.png\" alt=\"TDD11. C\u00f3digo ejemplo\" width=\"521\" height=\"40\" \/><\/a><\/i><\/p>\n<p><i>Los archivos de texto de nuestro c\u00f3digo<\/i><\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd12.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-294\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd12.png\" alt=\"TDD12. C\u00f3digo ejemplo\" width=\"562\" height=\"39\" \/><\/a><\/p>\n<p>Para probar nuestra aplicaci\u00f3n que estamos utilizando como ejemplo, debemos de modificar este c\u00f3digo predeterminado por Jasmine por el siguiente:<\/p>\n<p><i>El estilo para el sitio de la prueba\u00a0<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd13.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-295\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd13.png\" alt=\"TDD13. C\u00f3digo ejemplo\" width=\"477\" height=\"40\" \/><\/a><\/i><\/p>\n<p><i>Los archivos de Jasmine contenidos en la carpeta de Jasmine 2.0.0.<\/i><\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd14.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-296\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd14.png\" alt=\"TDD14. C\u00f3digo ejemplo\" width=\"484\" height=\"63\" \/><\/a><\/p>\n<p><i>Los archivos de Angular js que necesitamos para probar la aplicaci\u00f3n<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd15.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-297\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd15.png\" alt=\"TDD15. C\u00f3digo ejemplo\" width=\"428\" height=\"59\" \/><\/a><\/i><\/p>\n<p><i>Los archivos de or\u00edgenes de nuestra aplicaci\u00f3n<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd16.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-298\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd16.png\" alt=\"TDD16. C\u00f3digo ejemplo\" width=\"556\" height=\"25\" \/><\/a><\/i><\/p>\n<p><i>Los archivos de prueba para nuestro c\u00f3digo<a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd17.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-300\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd17.png\" alt=\"TDD17. C\u00f3digo ejemplo\" width=\"615\" height=\"26\" \/><\/a><\/i><\/p>\n<p>Obs\u00e9rvese que hay un nuevo archivo de Angular js que no estaba en nuestra estructura inicial del proyecto. Debemos descargarlo y a\u00f1adirlo para probar la aplicaci\u00f3n, por lo que ahora nuestra estructura del proyecto debe ser:<\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd18.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-301\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd18.png\" alt=\"TDD18. C\u00f3digo ejemplo\" width=\"244\" height=\"218\" \/><\/a><\/p>\n<p>Ahora nos hace falta s\u00f3lo efectuar alguna prueba, por lo que vamos a crear un ejemplo r\u00e1pido. Vamos a testear si la aplicaci\u00f3n es capaz de definir una variable dentro de un controlador. Por ello debemos de crear un m\u00f3dulo y un controlador en nuestra aplicaci\u00f3n application.js y luego realizar la prueba de control del mismo. Este ser\u00eda el c\u00f3digo dentro de nuestro archivo.<\/p>\n<p><b>application.js<\/b><\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd19.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-302\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd19.png\" alt=\"TDD19. C\u00f3digo ejemplo\" width=\"796\" height=\"62\" \/><\/a><\/p>\n<p><b>application.spec.js<\/b><\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd20.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-303\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd20.png\" alt=\"TDD20. C\u00f3digo ejemplo\" width=\"604\" height=\"394\" \/><\/a><\/p>\n<p>Una vez que se haya instalado PHP, Apache, etc en el equipo. \u00bfC\u00f3mo se puede poner en marcha un servidor de forma r\u00e1pida en la carpeta del proyecto?<\/p>\n<p>Se puede hacer de manera sencilla si utilizamos el terminal para ir a la carpeta del proyecto, donde tenemos el archivo index .html y luego simplemente ejecutar:<\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd21.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-304\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd21.png\" alt=\"TDD21. C\u00f3digo ejemplo\" width=\"245\" height=\"28\" \/><\/a><\/p>\n<p>Por ejemplo, 5000<\/p>\n<p><a href=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd22.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-305\" src=\"http:\/\/fractaliasystems.com\/wp-content\/uploads\/tdd22.png\" alt=\"TDD22. C\u00f3digo ejemplo\" width=\"228\" height=\"29\" \/><\/a><\/p>\n<p>Posteriormente, al ir al navegador, vaya a <a href=\"http:\/\/localhost:5000\/\">http:\/\/localhost:5000<\/a> en lugar de ir a su aplicaci\u00f3n web en funcionamiento. Para mostrar la p\u00e1gina de prueba, s\u00f3lo se debe de a\u00f1adir la ruta al archivo de corredor de especificaciones <a href=\"http:\/\/localhost:5000\/SpecRunner.html\">http:\/\/localhost:5000\/SpecRunner.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El sistema llamada TDD (Test Driver Developer o Desarrollo Dirigido por Test) es una nueva metodolog\u00eda para trabajar en el desarrollo web basado en la idea de desarrollar pruebas, codificar y refactorizar el c\u00f3digo construido. El TDD establece un nuevo modelo esencial para la productividad que aporta resultados m\u00e1s legibles, menos redundantes y f\u00e1ciles de<br \/><a href=\"https:\/\/fractaliasystems.com\/en\/desarrollo-dirigido-por-test-tdd-12\/\" class=\"more\">Read more<\/a><\/p>\n","protected":false},"author":2,"featured_media":2292,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-2291","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-fractalia"],"_links":{"self":[{"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/posts\/2291","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/comments?post=2291"}],"version-history":[{"count":1,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/posts\/2291\/revisions"}],"predecessor-version":[{"id":7181,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/posts\/2291\/revisions\/7181"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/media\/2292"}],"wp:attachment":[{"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/media?parent=2291"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/categories?post=2291"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fractaliasystems.com\/en\/wp-json\/wp\/v2\/tags?post=2291"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}