{"id":230068,"date":"2022-11-26T12:43:00","date_gmt":"2022-11-26T09:43:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230068"},"modified":"2022-11-26T12:46:51","modified_gmt":"2022-11-26T09:46:51","slug":"escritura-de-pruebas-unitarias-con-phpunit-parte-1-la-configuracion","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/escritura-de-pruebas-unitarias-con-phpunit-parte-1-la-configuracion\/","title":{"rendered":"Escritura de pruebas unitarias con PHPUnit, Parte 1: La configuraci\u00f3n"},"content":{"rendered":"\n<p>A principios de este mes, comenzamos a considerar la instalaci\u00f3n <strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/instalacion-de-phpunit-en-visual-studio-code\/\" title=\"de PHPUnit en Visual Studio Code\">de PHPUnit en Visual Studio Code<\/a><\/strong> con el objetivo final de aprender a escribir pruebas unitarias para nuestros proyectos basados \u200b\u200ben WordPress.<\/p>\n<p>Con ese fin, esta publicaci\u00f3n asume que ha le\u00eddo las siguientes publicaciones y asume que se ha puesto al d\u00eda con un pu\u00f1ado de publicaciones anteriores:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/un-entorno-de-desarrollo-de-wordpress-usando-un-administrador-de-paquetes\/\" title=\"Un entorno de desarrollo de WordPress (usando un administrador de paquetes)\">Un entorno de desarrollo de WordPress (usando un administrador de paquetes)<\/a><\/strong><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/es\/un-ide-para-el-desarrollo-de-wordpress-independientemente-de-la-experiencia\/\" title=\"Un IDE para el desarrollo de WordPress\">Un IDE para el desarrollo de WordPress<\/a><\/li>\n<li><strong><a href=\"https:\/\/wordpress.mediadoma.com\/es\/trabajar-con-la-configuracion-de-usuario-en-visual-studio-code\/\" title=\"Trabajar con la configuraci\u00f3n de usuario en Visual Studio Code\">Trabajar con la configuraci\u00f3n de usuario en Visual Studio Code<\/a><\/strong><\/li>\n<\/ol>\n<p>Y, por supuesto, instalar PHPUnit en Visual Studio Code como se vincula anteriormente. Una vez hecho esto, estaremos listos para continuar. Pero una cosa a tener en cuenta es que esta noche ser\u00e1 un curso tradicional o completo sobre c\u00f3mo escribir pruebas unitarias.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d45682b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d45682b.png\" alt=\"Escritura de pruebas unitarias con PHPUnit, Parte 1: La configuraci\u00f3n\"><\/a><\/p>\n<p>En cambio, se trata de escribir pruebas unitarias para proyectos de WordPress.<\/p>\n<h2>Pruebas unitarias con PHPUnit, Parte 1: La configuraci\u00f3n<\/h2>\n<p>Antes de profundizar demasiado en esto, quiero dejar en claro que esta no es tanto una publicaci\u00f3n sobre desarrollo basado en pruebas, sino una publicaci\u00f3n que sienta las bases para comprender la escritura de pruebas unitarias. Y luego, en \u00faltima instancia, trabajaremos para escribir pruebas unitarias para nuestro c\u00f3digo.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d8c4801.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-164223-61e760d8c4801.png\" alt=\"Escritura de pruebas unitarias con PHPUnit, Parte 1: La configuraci\u00f3n\"><\/a><\/p>\n<p>Para aquellos de ustedes que hayan le\u00eddo antes sobre pruebas unitarias, entonces saben que escribir pruebas unitarias es un tema sobre el cual hay mucha informaci\u00f3n y esta publicaci\u00f3n no intentar\u00e1 cubrir todo eso. En cambio, tomar\u00e1 un enfoque m\u00e1s pragm\u00e1tico para escribir pruebas unitarias contra complementos, aplicaciones web y similares basados \u200b\u200ben WordPress.<\/p>\n<h3>1 Escritura de pruebas unitarias<\/h3>\n<p>Cada vez que comience a escribir pruebas unitarias por primera vez, se le presentar\u00e1 la idea de los <strong>m\u00e9todos de configuraci\u00f3n<\/strong> y <strong>eliminaci\u00f3n<\/strong>. Esto es com\u00fan en <strong><a href=\"https:\/\/phpunit.de\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">PHPUnit<\/a><\/strong> (al igual que con otros marcos de prueba). Hay algunas cosas sobre estos dos m\u00e9todos particulares que a menudo causan problemas.<\/p>\n<p>En resumen, las personas tratan las funciones de la siguiente manera:<\/p>\n<ul>\n<li><strong>setUp<\/strong> es como el constructor en el que crea una instancia de su clase y luego prepara todo lo que necesita para su prueba, incluido el objeto que se probar\u00e1, los datos que se necesitan, etc.<\/li>\n<li><strong>tearDown<\/strong> es el destructor donde reinicias todo y luego te deshaces de tus objetos. Esto suele ser m\u00e1s com\u00fan en lenguajes compilados, pero tampoco se puede perder dentro de PHPUnit.<\/li>\n<\/ul>\n<p>Y aunque puedo entender esto completamente, no siempre es as\u00ed. Estoy hablando por experiencia aqu\u00ed, tambi\u00e9n. En cambio, aqu\u00ed es de donde proviene la prueba de unidad de frase real. Se trata de probar el c\u00f3digo de las unidades y hacerlo de una manera limpia y concisa.<\/p>\n<p>Entonces, \u00bfpara qu\u00e9 son estos m\u00e9todos, de todos modos? Este puede ser un h\u00e1bito especialmente dif\u00edcil de romper o incluso un modelo conceptual de romper cuando te est\u00e1s metiendo en el proceso por primera vez. Con ese fin, quiero examinar el prop\u00f3sito de cada m\u00e9todo y luego c\u00f3mo abordarlo cuando se trabaja con proyectos basados \u200b\u200ben WordPress.<\/p>\n<p>Y, como de costumbre, tratar\u00e9 de mantener esto lo m\u00e1s simple y pragm\u00e1tico posible. Estoy mucho menos interesado en la teor\u00eda detr\u00e1s de ciertas cosas que en c\u00f3mo puede servir tanto a mi negocio como a mis proyectos. (Esto no es para descartar la teor\u00eda, por supuesto, pero hay un momento y no un lugar para eso y este blog no lo es).<\/p>\n<h3>2 La funci\u00f3n de configuraci\u00f3n<\/h3>\n<p>Aunque estoy comenzando con una breve discusi\u00f3n sobre el m\u00e9todo <strong>setUp<\/strong>, es importante tener en cuenta que su funci\u00f3n hermana (como algunos la consideran) no siempre es necesaria.<\/p>\n<p>Por ejemplo, si est\u00e1 escribiendo c\u00f3digo donde todo lo que est\u00e1 haciendo es instanciar un objeto o un conjunto de objetos, es posible que el m\u00e9todo <strong>tearDown<\/strong> no sea necesario. Voy a entrar en m\u00e1s detalles sobre esto en la siguiente secci\u00f3n.<\/p>\n<p>Dicho esto, digamos que tiene una clase que es responsable de ejecutar un poco de l\u00f3gica de dominio. Recuerde, para los fines de esta publicaci\u00f3n, no nos preocupamos por el c\u00f3digo que har\u00e1 las cosas que WordPress hace de forma natural y que ya tiene su propio conjunto de pruebas.<\/p>\n<p>Con eso quiero decir que nos preocupa el c\u00f3digo que funciona espec\u00edficamente dentro de un dominio problem\u00e1tico. Por ejemplo, tal vez nos preocupe escribir una clase que almacene datos en la base de datos. Una de las piezas de informaci\u00f3n que es responsable de almacenar informaci\u00f3n en cach\u00e9 es cu\u00e1nto tiempo se deben almacenar en cach\u00e9. Por lo tanto, un candidato para la prueba unitaria har\u00eda uso de que podemos establecer y cambiar la cantidad de tiempo, \u00bfverdad?<\/p>\n<p>Por supuesto, tal vez estos datos est\u00e9n codificados de forma r\u00edgida, pero a los efectos del ejemplo, supongamos lo contrario. Esto implica lo siguiente:<\/p>\n<ul>\n<li>Tenemos una clase que sirve como nuestro cach\u00e9,<\/li>\n<li>La clase mantiene una parte de los datos de la instancia durante cu\u00e1nto tiempo se debe configurar el cach\u00e9,<\/li>\n<li>El tiempo de cach\u00e9 se puede configurar desde clases de terceros,<\/li>\n<li>El tiempo de cach\u00e9 se puede leer de clases de terceros.<\/li>\n<\/ul>\n<p>Esto significa que una prueba unitaria incluir\u00eda:<\/p>\n<ol>\n<li>Preparando la clase,<\/li>\n<li>Definici\u00f3n de un valor,<\/li>\n<li>Afirmando que el valor que se defini\u00f3 es el esperado,,<\/li>\n<li>Cambiando el valor,<\/li>\n<li>Afirmar que se actualiz\u00f3 el valor que se cambi\u00f3.<\/li>\n<\/ol>\n<p>Entonces, la clase b\u00e1sica puede verse <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/248c7741273e6be414c1f98c11085fe7#file-00-acme-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">as\u00ed<\/a><\/strong> (toda la documentaci\u00f3n se deja fuera de la clase con el fin de mantener el c\u00f3digo lo m\u00e1s conciso posible):<\/p>\n<pre><code>&lt;?php\n\nclass AcmeCache\n{\n    private $duration;\n\n    public function __construct()\n    {\n        $this-&gt;duration = 43200;\n    }\n\n    public function setDuration($duration)\n    {\n        $this-&gt;duration = $duration;\n    }\n\n    public function getDuration()\n    {\n        return $this-&gt;duration;\n    }\n\n    \/\/ More cache code omitted...\n}\n<\/code><\/pre>\n<p>Tenga en cuenta que, de forma predeterminada, tenemos el tiempo de cach\u00e9 establecido en 12 horas (en segundos). La clase tambi\u00e9n admite la capacidad de cambiar y leer la duraci\u00f3n.<\/p>\n<p>Esto significa que podemos escribir pruebas que prueben:<\/p>\n<ul>\n<li>si el valor inicial es el esperado,<\/li>\n<li>si el nuevo valor es el esperado (y que sobrescribe el valor inicial)<\/li>\n<\/ul>\n<pre><code>&lt;?php\n\nuse PHPUnitFrameworkTestCase;\n\nclass AcmeCacheTest extends TestCase\n{\n  protected $cache;\n\n  protected function setUp()\n  {\n    $this-&gt;cache = new AcmeCache();\n  }\n\n  public function testDefaultDuration()\n  {\n    $this-&gt;assertTrue($this-&gt;cache-&gt;getDuration() === 43200);\n  }\n\n  public function testNewDuration()\n  {\n    $this-&gt;cache-&gt;setDuration(1000);\n\n    $this-&gt;assertFalse($this-&gt;cache-&gt;getDuration() === 43200);\n    $this-&gt;assertTrue($this-&gt;cache-&gt;getDuration() === 1000);\n  }\n\n  \/\/ More to come...\n}<\/code><\/pre>\n<p>Una de las cosas que me gustar\u00eda se\u00f1alar en el c\u00f3digo anterior es que puede leer que cada prueba debe tener una sola afirmaci\u00f3n, mientras que <strong>testNewDuration<\/strong> claramente tiene dos afirmaciones.<\/p>\n<p>Tiendo a tomar la idea de una afirmaci\u00f3n por prueba como regla general. Por ejemplo, en este caso, quiero afirmar que el valor inicial se sobrescribe o no se almacena en ning\u00fan lugar y se almacena el nuevo valor.<\/p>\n<p>Sin embargo, es posible que este no sea siempre el caso, por lo que es posible que deba tratar este tipo de situaciones con cuidado.<\/p>\n<p>Como puedes ver, esto no tiene nada que ver con WordPress; sin embargo, tiene que ver con la l\u00f3gica de prueba relacionada espec\u00edficamente con el dominio en cuesti\u00f3n. A saber, la duraci\u00f3n del cach\u00e9. Y esto es de lo que se trata el n\u00facleo de las pruebas unitarias: probar el comportamiento l\u00f3gico de las unidades de c\u00f3digo para asegurarnos de que todo funcione como se espera.<\/p>\n<p>Y dependiendo de cu\u00e1ndo escriba este c\u00f3digo, es posible que tenga pruebas fallidas. En \u00faltima instancia, esto puede ayudar con el dise\u00f1o de la clase, pero ese es otro tema y no forma parte de esta publicaci\u00f3n.<\/p>\n<h2>Ejecutando las pruebas<\/h2>\n<p>Una vez que se escriben las pruebas, es importante poder ejecutarlas para ver si pasan, si fallan, qu\u00e9 pasa y qu\u00e9 no. Pero a\u00fan no hemos terminado. Quiero brindar una visi\u00f3n integral de las pruebas unitarias en el contexto de WordPress y esto se trata de discutir qu\u00e9 ofrece WordPress, qu\u00e9 no, algunos conceptos err\u00f3neos y c\u00f3mo ejecutar estas pruebas en la terminal o dentro de Visual Studio Code.<\/p>\n<p>En la pr\u00f3xima publicaci\u00f3n de esta serie, veremos la funci\u00f3n <strong>tearDown<\/strong> y c\u00f3mo (y cu\u00e1ndo) usarla, cu\u00e1ndo se necesita, cu\u00e1ndo no, y luego veremos un poco alrededor de la unidad. pruebas en WordPress en general.<\/p>\n<p>En \u00faltima instancia, estamos trabajando para obtener una imagen completa de c\u00f3mo hacer esto y c\u00f3mo hacerlo bien. Pero es importante sentar las bases para eso y hacerlo en el lapso de unas pocas publicaciones es m\u00e1s f\u00e1cil que en una publicaci\u00f3n monol\u00edtica.<\/p>\n<p>As\u00ed que examinar <strong>tearDown()<\/strong>, su uso y c\u00f3mo ejecutar pruebas desde la l\u00ednea de comandos ser\u00e1 el tema de la pr\u00f3xima publicaci\u00f3n de esta serie.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una gu\u00eda para comenzar a escribir pruebas de PHPUnit mediante el uso de un cach\u00e9 b\u00e1sico y el m\u00e9todo de configuraci\u00f3n del marco.<\/p>\n","protected":false},"author":1,"featured_media":164224,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[716,800,840],"tags":[1172],"class_list":["post-230068","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollador","category-php-2","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230068","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=230068"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/230068\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/164224"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=230068"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=230068"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=230068"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}