{"id":384,"date":"2012-07-10T19:09:26","date_gmt":"2012-07-10T19:09:26","guid":{"rendered":"http:\/\/www.palentino.es\/blog\/?p=384"},"modified":"2012-07-10T19:14:46","modified_gmt":"2012-07-10T19:14:46","slug":"que-es-una-prueba-unitaria-ventajas-que-posee-y-un-ejemplo-practico-en-php","status":"publish","type":"post","link":"https:\/\/www.palentino.es\/blog\/que-es-una-prueba-unitaria-ventajas-que-posee-y-un-ejemplo-practico-en-php\/","title":{"rendered":"Qu\u00e9 es una prueba unitaria, ventajas que posee y un ejemplo pr\u00e1ctico en PHP."},"content":{"rendered":"<p style=\"text-align: justify;\">Una prueba unitaria permite comprobar que una parte especifica de c\u00f3digo de una determinada aplicaci\u00f3n que est\u00e1 siendo programada o codificada no presenta fallos, errores, o c\u00e1lculos inesperados.<\/p>\n<p style=\"text-align: justify;\">Aunque el objetivo de la prueba de forma individual es encontrar fallos (bugs ), la meta final es aumentar la calidad del desarrollo, siendo uno de los objetivos principales de la IS \u00f3 Ingenier\u00eda del Software.<\/p>\n<p style=\"text-align: justify;\"><!--more--><\/p>\n<p style=\"text-align: justify;\">Las pruebas unitarias son vitales, pero a su vez poco empleadas, debido al mal uso del c\u00e1lculo de tiempos en el desarrollo, la falta de conocimiento por parte de los directores de producto, as\u00ed como los tab\u00fas y falsos aforismos t\u00edpicos en inform\u00e1tica, no pierdas tiempo en &#8230;, no merece la pena porque mi experiencia en &#8230;, etc.<\/p>\n<p style=\"text-align: justify;\">Necesitaremos emplear un tiempo (15% aproximadamente) en nuestro desarrollo para llevarlas a cabo. Ese tiempo se escatima al programador.<\/p>\n<p style=\"text-align: justify;\">Pero para realizar estas pruebas, es necesario tener claros unos <strong>conceptos<\/strong>, adem\u00e1s de disponer de herramientas para llevarlas a cabo (aunque no siempre son necesarias).<\/p>\n<p style=\"text-align: justify;\">&#8211; Las pruebas unitarias se tienen que poder ejecutar sin necesidad de intervenci\u00f3n manual, mejorar la automatizaci\u00f3n de la ejecuci\u00f3n.<\/p>\n<p style=\"text-align: justify;\">&#8211; Las pruebas unitarias tienen que poder repetirse tantas veces como uno quiera, deben ser r\u00e1pidas.<\/p>\n<p style=\"text-align: justify;\">&#8211; Deben cubrir casi la totalidad del c\u00f3digo de nuestra aplicaci\u00f3n.<\/p>\n<p style=\"text-align: justify;\">&#8211; Deben poder ser ejecutadas bajo cualquier entorno, es decir, que los casos de error sean reales entre plataformas.<\/p>\n<p style=\"text-align: justify;\">&#8211; Deben ser independientes en su ejecuci\u00f3n, no puede afectar la ejecuci\u00f3n de otra.<\/p>\n<p style=\"text-align: justify;\">&#8211; Deben ser tratadas como si fueran c\u00f3digo (de la misma manera)<\/p>\n<p style=\"text-align: justify;\">Por lo que se demuestra que para que una prueba unitaria sea correcta <strong>debiera ser<\/strong> (no siempre es obligatorio):<\/p>\n<p style=\"text-align: justify;\">Automatizable, Completas, Repetibles o Reutilizables, Independientes, Profesionales.<\/p>\n<p style=\"text-align: justify;\">Por lo tanto, respondiendo a la pregunta inicial\u00a0 <strong>\u00bf Qu\u00e9 ventajas me proporcionan<\/strong> ?<\/p>\n<p style=\"text-align: justify;\">La capacidad de encontrar <strong>errores a tiempo<\/strong>, minimizar los comportamientos program\u00e1ticos an\u00f3malos, \u00a0corregirles <strong>sin que se produzca efecto bola de nieve<\/strong> en nuestro desarrollo, aumentar la <strong>calidad en nuestros programas<\/strong>, <strong>maximizar la satisfacci\u00f3n del cliente (interno, externo)<\/strong>.<\/p>\n<p style=\"text-align: justify;\">Alientan el cambio: Facilitan que el programador cambie el c\u00f3digo para mejorar su estructura (lo que se ha dado en llamar <strong>refactorizaci\u00f3n<\/strong>).<\/p>\n<p style=\"text-align: justify;\">Minimizan \u00a0la integraci\u00f3n: Puesto que permiten llegar a la fase de integraci\u00f3n con un grado alto de seguridad de que el c\u00f3digo est\u00e1 funcionando correctamente. De esta manera se <strong>facilitan las pruebas de integraci\u00f3n<\/strong>. Que son otro tipo de pruebas con mayor grado de integraci\u00f3n.<\/p>\n<p style=\"text-align: justify;\">Documentan el c\u00f3digo: Las <strong>propias pruebas son documentaci\u00f3n<\/strong> del c\u00f3digo puesto que ah\u00ed se puede ver c\u00f3mo utilizarlo.<\/p>\n<p style=\"text-align: justify;\">Separaci\u00f3n de <strong>la interfaz y la implementaci\u00f3n<\/strong>: Dado que la \u00fanica interacci\u00f3n entre los casos de prueba y las unidades bajo prueba son las interfaces de estas \u00faltimas, se puede cambiar cualquiera de los dos sin afectar al otro, a veces usando objetos <strong>mock<\/strong> (mock object) para simular el comportamiento de objetos complejos. Ojo seg\u00fan los foros he<strong> visto discrepancia entre lo que es un mock y un stubs, y la delgada l\u00ednea que los separa<\/strong>. Ambos son <strong>dos recursos que usamos en nuestras pruebas unitarias<\/strong> que nos permiten <strong>simular objetos<\/strong> con los que interact\u00faa el m\u00f3dulo de que est\u00e1 sometido a la prueba. Los stubs se basan m\u00e1s en el <strong>estado<\/strong> y los mocks permiten comprobar en detalle las l<strong>lamadas <\/strong>realizadas entre ellos.<\/p>\n<p>Los errores\u00a0 son m\u00e1s f\u00e1ciles de localizar.<\/p>\n<p><strong>Unit test en PHP<\/strong><\/p>\n<p style=\"text-align: justify;\">Como he comentado, para poder realizar pruebas unitarias existen unas herramientas para facilitar su uso. Estas forman parte de frameworks de prueba. He seleccionado PHP por se un lenguaje de script del lado servidor muy empleado en la actualidad, no sin ello desmerecer a otros entornos, v\u00e1lidos y tambi\u00e9n ampliamente usados.<\/p>\n<p>Voy a emplear SimpleTest<br \/>\n<a href=\"http:\/\/simpletest.org\/\" target=\"_blank\"><strong>http:\/\/simpletest.org\/<\/strong><\/a><\/p>\n<p>El probador SimpleTest PHP est\u00e1 disponible para su descarga desde SourceForge.<\/p>\n<p style=\"text-align: justify;\">Es una clase para hacer pruebas unitarias con PHP y marco de pruebas Web.<\/p>\n<p style=\"text-align: justify;\">Solo hay que descargarlo y colocar la carpeta simpletest dentro de tu proyecto o alg\u00fan directorio global de PHP.<\/p>\n<p style=\"text-align: justify;\">SimpleTest tiene muchas opciones m\u00e1s como el agrupar casos de prueba, escribir tus propias aserciones, mockups (simulaciones de escenarios) y pruebas web (aunque limitado). Efectivamente no es f\u00e1cil de usar, aunque su nombre signifique eso.<\/p>\n<p style=\"text-align: justify;\"><strong>Esta clase corresponde con 2 m\u00e9todos para calcular el IVA:<\/strong><\/p>\n<pre lang=\"php\">class OperacionesConIVA\r\n{\r\n\r\n        function Calcular($precio, $tipo) {\r\n\t\t$iva=($precion*$tipo\/100) + $precio;\r\nreturn ($iva);\r\n\t}\r\n\r\n\tfunction DevolverIva($precio, $tipo) {\r\n\t\t$soloiva=($precio*$tipo\/100);\r\nreturn $soloiva;\r\n\t}\r\n\r\n}<\/pre>\n<p>Se prueba de la siguiente forma:<\/p>\n<pre lang=\"php\">require_once 'simpletest\/autorun.php';\r\nrequire_once 'OperacionesConIVA.php';\r\n\r\nclass TesteoClase extends UnitTestCase\r\n{\r\n\tvar $iva;\r\n\r\n\tfunction setUp() {\r\n\t\t$this-&gt;iva = new OperacionesConIVA ();\r\n\t}\r\n\r\n\tfunction testCalcular()\r\n\t{\r\n\t\t$result = $this-&gt;iva-&gt;Calcular(1200, 16);\r\n\t\t$this-&gt;assertEqual(1392, $result);\r\n\t}\r\n\r\n\tfunction testDevolverIVA()\r\n\t{\r\n\t\t$result = $this-&gt;area-&gt; DevolverIva(1200, 16);\r\n\t\t$this-&gt;assertEqual(10, $result);\r\n\t}\r\n\r\n}<\/pre>\n<p>SimpleTest corre todas las pruebas que note comienzan con el nombre test y nosotros tenemos 2 de ellas.<\/p>\n<p>En caso de ser correcta aparecer\u00e1 una pantalla del tipo:<\/p>\n<p><a href=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/all_tests-php.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-387\" title=\"all_tests-php\" src=\"http:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/all_tests-php.jpg\" alt=\"\" width=\"652\" height=\"158\" srcset=\"https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/all_tests-php.jpg 652w, https:\/\/www.palentino.es\/blog\/wp-content\/uploads\/2012\/07\/all_tests-php-300x72.jpg 300w\" sizes=\"auto, (max-width: 652px) 100vw, 652px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>En caso de producirse un error:<\/p>\n<p>TestOfLogging<br \/>\nFail: testLogCreatesNewFileOnFirstMessage-&gt;True assertion failed.<br \/>\n<span style=\"color: #ff0000;\">1\/1 test cases complete. 1 passes and 1 fails.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una prueba unitaria permite comprobar que una parte especifica de c\u00f3digo de una determinada aplicaci\u00f3n que est\u00e1 siendo programada o codificada no presenta fallos, errores, o c\u00e1lculos inesperados. Aunque el objetivo de la prueba de forma individual es encontrar fallos (bugs ), la meta final es aumentar la calidad del desarrollo, siendo uno de los objetivos principales de la IS \u00f3 Ingenier\u00eda del Software.<\/p>\n","protected":false},"author":1,"featured_media":387,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41,5,7],"tags":[42,667,44],"class_list":["post-384","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ingenieria-del-software","category-programacion","category-software","tag-ingenieria","tag-php","tag-programacion-2"],"_links":{"self":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/384","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/comments?post=384"}],"version-history":[{"count":9,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/384\/revisions"}],"predecessor-version":[{"id":395,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/posts\/384\/revisions\/395"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media\/387"}],"wp:attachment":[{"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/media?parent=384"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/categories?post=384"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.palentino.es\/blog\/wp-json\/wp\/v2\/tags?post=384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}