En la primera parte de esta serie, analizamos metodologías de prueba de alto nivel y dimos algunos ejemplos de por qué es beneficioso para nosotros comenzar a trabajar en nuestros proyectos de WordPress. También nos tomamos tiempo para configurar PHPUnit y WordPress Tests para comenzar a construir nuestro primer complemento comprobable..
En este artículo final, definiremos una metodología para las pruebas unitarias, comenzaremos incorporándolas a nuestro trabajo y saldremos con un complemento totalmente funcional (aunque simple) que también tiene un pequeño conjunto de pruebas para garantizar que funcione exactamente como se esperaba.
Cuando se trata de pruebas, generalmente hay dos formas de hacerlo:
En mi experiencia, el primer enfoque siempre es mejor. Por supuesto, esto es prácticamente imposible de hacer dentro del contexto de una aplicación que ya existe, pero si está comenzando desde cero, lo que es, es un enfoque mejor y el siguiente es el motivo: una vez que haya escrito una solicitud, saber como funciona Como tal, puede ser extremadamente difícil escribir pruebas que extiendan la aplicación cuando usted sabe inherentemente cómo se supone que funciona..
Para ello, me parece mejor escribir las pruebas. primero. De esta manera, sus pruebas no solo incluyen la forma en que el programa es supuesto para trabajar, pero también se convierte en una forma de documentación que muestra qué funcionalidad se pretende y, en última instancia, producirá un error cuando la funcionalidad no funciona como debería.
Con eso en mente, vamos a construir con esta sencilla metodología:
Finalmente, como complemento, nuestro complemento le dará un mensaje de bienvenida especializado al visitante en función de si ha hecho clic en el sitio desde Google o Twitter. También lo escribiremos de tal manera que sea más fácil expandirlo con servicios adicionales, en caso de que desee hacerlo en el futuro..
En este punto, es hora de comenzar a escribir algo de código; Sin embargo, a diferencia de la mayoría de los proyectos, todavía no vamos a saltar al código específico de WordPress. En su lugar, vamos a apagar nuestra clase de prueba de unidad. Si ha estructurado el directorio de su complemento según lo que compartimos en la primera publicación o cómo lo configuramos en GitHub, entonces debería tener un hello_reader_tests.php archivo ubicado en su pruebas / wordpress-tests directorio. No tiene que seguir esa organización, por supuesto, pero nos ayudará a medida que avancemos en el proyecto..
Apaguemos la clase de prueba de unidad:
require_once ('… /… /plugin.php'); la clase Hello_Reader_Tests amplía WP_UnitTestCase // end class
Ahora, intente ejecutar la prueba desde el terminal usando la unidad PHP. Suponiendo que está ejecutando la unidad PHP desde su instalación MAMP local, debería poder ingresar:
$ /Aplicaciones/MAMP/bin/php/php5.3.6/bin/phpunit ./hello_reader_tests.php
En este punto, deberías ver un fallo:
¡Eso es bueno! Significa que PHPUnit está instalado y en ejecución y que su marco de pruebas de WordPress está listo para funcionar. La prueba falló simplemente porque no hemos escrito ninguna prueba. Vamos a empezar a hacer eso.
Primero, escribamos una prueba para asegurarnos de que nuestro complemento esté inicializado, creado y listo para la prueba. Recordemos anteriormente en el primer artículo que almacenamos una referencia a la instancia de Hello Reader en el PHP $ GLOBALES
formación. Así es como accederemos a esa instancia utilizando el marco de prueba. Así que vamos a actualizar nuestra prueba de unidad para que se vea así:
Tenga en cuenta que, por el bien del espacio, omitiré los comentarios de código, pero el complemento y las pruebas totalmente comentados estarán disponibles en GitHub.
require_once ('… /… /plugin.php'); la clase Hello_Reader_Tests extiende WP_UnitTestCase private $ plugin; función setUp () parent :: setUp (); $ this-> plugin = $ GLOBALS ['hello-reader']; // finalizar la función de configuración testPluginInitialization () $ this-> assertFalse (null == $ this-> plugin); // end testPluginInitialization // end class
Anteriormente, hemos configurado una referencia a la instancia del complemento para que podamos acceder a él a través de nuestras pruebas de unidad. Estamos usando el preparar
método para agarrar la referencia al plugin de $ GLOBALES
. Tenga en cuenta, sin embargo, que hemos introducido otra función llamada testPluginInitialization
. Esta función verifica que la referencia que hemos configurado en el preparar
el método no es nulo.
Si vuelve a ejecutar las pruebas, debería obtener una prueba de aprobación y su terminal debería tener este aspecto:
Hay una importante comida para llevar aquí: Tenga en cuenta que la única función que proporcionamos anteriormente tiene un propósito claro: verificar que el complemento se haya inicializado correctamente. Su nombre de función es claro y contiene una sola declaración de afirmación. Esta es una excelente manera de modelar nuestras pruebas restantes principalmente porque facilita la búsqueda de errores cuando aparecen. Piénselo de esta manera: si incluye varias declaraciones de afirmación diferentes en una sola función, será difícil determinar qué declaración de afirmación está fallando..
Ahora que hemos aprendido cómo escribir pruebas unitarias, ejecutar pruebas unitarias y evaluar cómo pasan o cómo fallan, comencemos a implementar la funcionalidad para el complemento. En primer lugar, vamos a necesitar configurar un filtro para el contenido, ya que vamos a agregar texto al principio del contenido. Siguiendo con la metodología que definimos anteriormente en este artículo, escribamos primero nuestra prueba.
Esta prueba en particular se revisará para ver si hemos agregado un conjunto específico de texto a la primera parte de la publicación:
function testAddWelcomeMessage () $ this-> assertEquals ('TEST CONTENT', $ this-> plugin-> add_welcome_message ('Este es el contenido de la publicación de ejemplo. Esto simula que WordPress volvería al ver una publicación de blog.'), 'add_welcome_message ( ) añade un mensaje de bienvenida al contenido de la publicación. '); // end testAddWelcomeMessage
Si ejecuta la prueba exactamente como está, ni siquiera fallará; en su lugar, PHPUnit devolverá un error fatal porque el método no está definido en el complemento. Así que vamos a añadir eso ahora. Actualice el complemento para que se vea así:
clase Hello_Reader function __construct () add_filter ('the_content', array (& $ this, 'add_welcome_message')); // final del constructor función pública add_welcome_message ($ content) // end add_welcome_message // end class
Ahora intenta ejecutar la prueba. La prueba no va a estallar, pero en realidad debería ver una falla junto con un mensaje claro sobre por qué falló la prueba:
1) Hello_Reader_Tests :: testAddWelcomeMessage add_welcome_message () agrega el mensaje de bienvenida al contenido de la publicación. Error al afirmar que las coincidencias nulas esperadas 'CONTENIDO DE PRUEBA'
Por lo tanto, de acuerdo con nuestra metodología, queremos que esta prueba sea aprobada. Para hacerlo, debemos asegurarnos de que el contenido de la publicación contenga la cadena de texto, en este caso 'CONTENIDO DE LA PRUEBA
', para hacerla pasar. Así que intentemos esto. Actualice la función correspondiente en el complemento para agregar la cadena antes del contenido:
función pública add_welcome_message ($ content) return 'TEST CONTENT'. $ contenido; // finalizar add_welcome_message
Y de nuevo, volvemos a ejecutar la prueba solo para ver si falla. Si observa nuestra prueba, esto se debe a que está buscando ver nuestro contenido. es igual a la 'CONTENIDO DE LA PRUEBA
' cuerda. En su lugar, debemos asegurarnos de que la cadena comience en el contenido. Esto significa que necesitamos actualizar nuestra prueba. Afortunadamente, PHPUnit tiene una función assertContains. Así que vamos a actualizar nuestro código para usarlo:
function testAddWelcomeMessage () $ this-> assertContains ('TEST CONTENT', $ this-> plugin-> add_welcome_message ('Este es el contenido de la publicación de ejemplo. Esto simula que WordPress volvería al ver una publicación de blog.'), 'add_welcome_message ( ) añade un mensaje de bienvenida al contenido de la publicación. '); // end testAddWelcomeMessage
Una vez más, vuelva a ejecutar la prueba y verá que la prueba ahora pasa. ¡Increíble! Ahora necesitamos escribir mensajes personalizados para las personas que vienen de Twitter y las personas que vienen de Google..
Hay varias formas diferentes en las que podemos verificar cómo un usuario ha llegado a una página determinada. A veces podemos comprobar los valores en el $ _GET
Array, a veces podemos interrogar al $ _SERVER
matriz, o en ocasiones podemos comprobar la sesión de un usuario. Para los propósitos de este ejemplo, vamos a buscar 'twitter.com' que se encuentra en el $ _SERVER ['HTTP_REQUEST']
. Digo esto solo para que ustedes puedan seguir con lo que estamos haciendo en el código.
Así que, en general, el mensaje_de_welcome
debe verificar si la solicitud proviene de Twitter y luego adaptar el mensaje de manera adecuada. Ya que estamos en el negocio de probar cada pieza de funcionalidad, podemos escribir una función que pueda evaluar si la solicitud proviene de Twitter. Así que vamos a escribir una nueva prueba:
En el plugin:
función pública is_from_twitter () // end is_from_twitter
En la prueba:
function testIsComingFromTwitter () $ _SERVER ['HTTP_REFERER'] = 'http://twitter.com'; $ this-> assertTrue ($ this-> plugin-> is_from_twitter (), 'is_from_twitter () devolverá verdadero cuando el sitio de referencia sea Twitter.'); // end testIsComingFromTwitter
Obviamente estamos engañando al HTTP_REFERER
valor, pero eso está bien para los propósitos de este ejemplo. El punto sigue siendo: ejecute la prueba, fallará, por lo que necesitaremos implementar la función en el complemento para que sea aprobada:
la función pública is_from_twitter () return strpos ($ _SERVER ['HTTP_REFERER'], 'twitter.com')> 0; // end is_from_twitter
La ejecución de la prueba ahora debe dar como resultado una prueba de aprobación. Pero espera, necesitamos estar completos. Asegurémonos de que ejecutamos una prueba para verificar que esta función falla cuando la referencia es no de Twitter.
function testIsNotComingFromTwitter () // falsificando el HTTP_REFERER para los fines de esta prueba y la publicación complementaria del blog $ _SERVER ['HTTP_REFERER'] = 'http://facebook.com'; $ this-> assertFalse ($ this-> plugin-> is_from_twitter (), 'is_from_twitter () devolverá true cuando el sitio de referencia sea Twitter.'); // end testIsNotComingFromTwitter
Tenga en cuenta que hemos actualizado el HTTP_REFERER
y hemos cambiado afirmar la verdad
a assertFalse
. Permitir que todo lo demás sea correcto, ejecutar las pruebas y deben pasar.
Proporcionar un mensaje personalizado para Google requerirá lo mismo que hicimos para Twitter, es decir, parodia de HTTP_REFERER
y luego devuelve verdadero o falso para la función auxiliar. Por lo tanto, para evitar que suene redundante, mantendré esta sección lo más concisa posible. Se deben seguir los mismos pasos que para Twitter..
Primero, apagamos la función de ayuda en el complemento:
función pública is_from_google () // end is_from_google
Luego apagamos la prueba:
function testIsComingFromGoogle () $ _SERVER ['HTTP_REFERER'] = 'http://google.com'; $ this-> assertTrue ($ this-> plugin-> is_from_google (), 'is_from_google () devolverá true cuando el sitio de referencia sea Google.'); // finalizar testIsComingFromGoogle
La ejecución de la prueba tal como está ahora dará lugar a un error. Entonces, implementemos el is_from_google ()
función:
la función pública is_from_google () return strpos ($ _SERVER ['HTTP_REFERER'], 'google.com')> 0; // end is_from_twitter
Y ahora, la prueba debe pasar. Pero, una vez más, debemos estar completos, así que escribamos la prueba de falla para asumir que la función no se volverá verdadera cuando los usuarios vengan de otra parte:
function testIsNotComingFromGoogle () // Spoofing el HTTP_REFERER para los fines de esta prueba y la publicación complementaria del blog $ _SERVER ['HTTP_REFERER'] = 'http://facebook.com'; $ this-> assertFalse ($ this-> plugin-> is_from_google (), 'is_from_google () devolverá true cuando el sitio de referencia sea Google.'); // finalizar testIsNotComingFromGoogle
Por último, ejecute sus pruebas. Permitir que todo lo demás sea correcto, deberías tener seis pruebas aprobatorias.
En este punto, tenemos todo lo que necesitamos para comenzar a mostrar mensajes de bienvenida personalizados para nuestros usuarios. Lo único es que tendremos que refactorizar nuestra prueba inicial que verifica el "CONTENIDO DE LA PRUEBA". Ahora, tendremos que introducir pruebas para los siguientes casos:
Así que vamos a eliminar la prueba que creamos anteriormente testAddWelcomeMessage
en lugar de agregar tres nuevas pruebas.
Primero, agregaremos una prueba que verifique el mensaje de bienvenida de Twitter..
En el plugin, reduciremos la mensaje_de_welcome
a esto:
función pública add_welcome_message ($ content) return $ content; // finalizar add_welcome_message
Y añadiremos la prueba de Twitter, primero:
function testDisplayTwitterWelcome () // Spoof the HTTP_REFERER for Twitter $ _SERVER ['HTTP_REFERER'] = 'http://twitter.com'; $ this-> assertContains ('¡Bienvenido desde Twitter!', $ this-> plugin-> add_welcome_message ('Este es el contenido de la publicación de ejemplo. Esto simula que WordPress volvería al ver una publicación de blog.'), 'add_welcome_message () mensaje al contenido de la publicación. '); // end testDisplayTwitterWelcome
En este punto, este es el viejo sombrero, ¿verdad? Ejecutalo, la prueba fallará. Implementar el mensaje_de_welcome
para parecerse a esto:
función pública add_welcome_message ($ content) if ($ this-> is_from_twitter ()) $ content = '¡Bienvenido desde Twitter!' . $ contenido; // termina si devuelve $ contenido; // finalizar add_welcome_message
Ejecútalo de nuevo, y pasará. El siguiente es el test de Google:
function testDisplayGoogleWelcome () // Spoof the HTTP_REFERER for Google $ _SERVER ['HTTP_REFERER'] = 'http://google.com'; $ this-> assertContains ('¡Bienvenido de Google!', $ this-> plugin-> add_welcome_message ('Este es un contenido de publicación de ejemplo. Esto simula que WordPress volvería al ver una publicación de blog.'), 'add_welcome_message () recibe la bienvenida mensaje al contenido de la publicación. '); // end testDisplayGoogleWelcome
Ejecute la prueba, haga que falle, luego actualice la mensaje_de_welcome
en el complemento para contener una verificación usando la función de ayuda que escribimos anteriormente:
función pública add_welcome_message ($ content) if ($ this-> is_from_twitter ()) $ content = '¡Bienvenido desde Twitter!' . $ contenido; else if si ($ this-> is_from_google ()) $ content = 'Welcome from Google!' . $ contenido; // termina si devuelve $ contenido; // finalizar add_welcome_message
En este punto, debe tener un complemento totalmente funcional que tenga siete pruebas de unidades aprobadas!
Como puede ver, las pruebas unitarias introducen un nivel adicional de desarrollo, pero pueden dar resultados significativos en códigos comprobables, bien organizados y comprobables. A medida que su aplicación crezca, la ejecución continua de pruebas para verificar que sus proyectos funcionan como se espera puede darle tranquilidad. Por supuesto, esto es solo un pequeño ejemplo de cómo funcionan las pruebas unitarias. La aplicación de estas prácticas puede dar resultados en proyectos mucho más grandes y / o complicados.
Finalmente, puede encontrar este complemento, las pruebas de WordPress y las pruebas de la unidad Hello Reader completamente comentadas en GitHub.