Pruebas de WordPress para empresas de hosting

Última revisión: 26 de enero de 2022

Las empresas de hosting pueden tener alojados centenares de sitos web con WordPress, y por eso es importante que su configuración sea lo más compatible posible con el software.

Para verificar esta compatibilidad, el equipo de la Comunidad Hosting de WordPress pone a disposición una serie de pruebas PHPUnit con las que poder comprobar el funcionamiento de WordPress en cualquier entorno.

Requisitos

El objetivo de estas pruebas es el de comprobar y validar que las próximas actualizaciones de WordPress funcionan correctamente en tu entorno, por lo que lo ideal es tener un alojamiento lo más parecido al que le ofreces a tus clientes.

Esto significa que necesitaremos, al menos:

  • Una base de datos (se creará y eliminarán sus contenidos). Puedes usar MySQL, MariaDB o cualquier sistema compatible.
  • Una carpeta donde alojar el software (no público).
  • Una carpeta temporal donde se generarán y eliminarán contenidos.

Además de esto, de forma extra, se necesitarán los siguientes elementos:

Instalación en Ubuntu (ejemplo)

npm en Ubuntu

apt-get -y install npm

Composer 2.x en Ubuntu

cd
curl -sS https://getcomposer.org/installer -o composer-setup.php
php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Git en Ubuntu

apt-get -y install git

Instalando el phpunit-test-runner

El phpunit-test-runner es una pequeña pieza de pruebas de PHPUnit específicamente pensada para empresas de hosting. Existe toda una documentación sobre esta herramienta. Además, si lo quieres, puedes hacer aparecer los resultados de tus pruebas en la página de Host Test Results de WordPress.

La herramienta se puede ejecutar de forma manual o a través de un sistema automatizado. Para ver el funcionamiento y el objetivo de este documento haremos las pruebas de forma manual, y al final añadiremos un sistema de automatización.

Instalación del Runner

Lo primero que haremos será descargar y sincronizar la herramienta.

cd /home/wordpressbot/
git clone https://github.com/WordPress/phpunit-test-runner.git wordpress-test
cd /home/wordpressbot/wordpress-test/

El siguiente paso será el de configurar el entorno. Para ello primero haremos una copia del fichero de ejemplo y posteriormente lo configuraremos.

cp .env.default .env
vim .env

El contenido (de forma resumida) puede ser algo así:

export WPT_PREPARE_DIR=/tmp/wp-test-runner
export WPT_TEST_DIR=/tmp/wp-test-runner
export WPT_REPORT_API_KEY=
export WPT_REPORT_URL=
export WPT_DB_NAME=wordpressdatabase
export WPT_DB_USER=wordpressusername
export WPT_DB_PASSWORD=wordpresspassword
export WPT_DB_HOST=localhost
export WPT_TABLE_PREFIX=${WPT_TABLE_PREFIX-wptests_}
export WPT_PHP_EXECUTABLE=${WPT_PHP_EXECUTABLE-php}
export WPT_PHPUNIT_CMD=
export WPT_RM_TEST_DIR_CMD=
export WPT_SSH_CONNECT=
export WPT_SSH_OPTIONS=
export WPT_SSH_PRIVATE_KEY_BASE64=
export WPT_DEBUG=

Configuraremos la carpeta donde se harán las pruebas de descarga del software de WordPress y los accesos de la base de datos para poder preparar las pruebas.

Para este ejemplo, usaremos una carpeta de pruebas del sistema como puede ser /tmp/wp-test-runner. Se puede usar una carpeta temporal o una existente para ese mismo usuario, por ejemplo. Configuraremos esta ruta completa en:

export WPT_PREPARE_DIR=/tmp/wp-test-runner
export WPT_TEST_DIR=/tmp/wp-test-runner

Lo siguiente será incluir la configuración de la base de datos que hayamos creado previamente. Por ejemplo podemos crearla con este comando:

CREATE DATABASE wordpressdatabase CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;
GRANT ALL ON wordpressdatabase.* TO 'wordpressusername'@'localhost' IDENTIFIED BY 'wordpresspassword';
FLUSH PRIVILEGES;

Esta base de datos no debe utilizarse para nada más que no sea el uso de estas pruebas.

Posteriormente, configuraremos los datos en el fichero de configuración:

export WPT_DB_NAME=wordpressdatabase
export WPT_DB_USER=wordpressusername
export WPT_DB_PASSWORD=wordpresspassword
export WPT_DB_HOST=localhost

Con esto debería ser suficiente para la ejecución de las pruebas.

Ahora que ya tenemos la configuración lista, podemos hacer la primera prueba para validar que todo funciona correctamente.

Probando el test

Antes de hacer las pruebas actualizaremos todo lo necesario a la última versión y activaremos la configuración del entorno.

cd /home/wordpressbot/wordpress-test/
git pull
npm update
source .env

Entraremos en la carpeta donde tenemos el software de pruebas y lo actualizamos descargando la última versión. También actualizaremos el npm por si hay actualizaciones, y finalmente, cargaremos la configuración.

A partir de aquí, sólo hemos de ejecutar los 4 ficheros que hacen el conjunto de las pruebas.

El primero de ellos es el sistema que verifica que el entorno está listo para funcionar.

php prepare.php

El segundo de ellos es el que realiza las pruebas en sí.

php test.php

Una vez acaben las pruebas, se puede generar el reporte. Si has configurado un usuario y contraseña se enviará a WordPress.org.

php report.php

Este sistema genera dos ficheros en los que está la información de lo que se mandará como respuesta a las pruebas que se están analizando. Puedes ver el contenido de los ficheros fácilmente.

cat /tmp/wp-test-runner/env.json
cat /tmp/wp-test-runner/junit.xml

El primero de ellos incluye la información de todos los elementos necesarios para WordPress, como son PHP y sus extensiones y versiones, y la base de datos, con su versión.

El segundo de los ficheros es un rsumen de todos los tests lanzados con sus resultados y que, si se mandan a WordPress.org, se mostrarán los que han fallado en la página de resultados, para así poder trabajarlos, tanto si son elementos a solucionar por parte del hosting, como si son errores que afectan a desarrollo y el Core.

Y, para acabar, una vez tienes el sistema terminado, solo hemos de limpiar los ficheros y la base de datos para poder realizar una siguiente prueba en otro momento.

php cleanup.php

Creando tu bot para WordPress.org

Si quieres que los resultados de las pruebas aparezcan en la página de WordPress.org puedes crear un usuario para ello.

Lo primero será crear un usuario en WordPress.org. Si tu empresa se llama, por ejemplo, Somos Hosting, S.L., puedes llamar a tu usuario algo como somoshostingbot. Ten en cuenta que la cuenta de correo asociada debe verificarse con frecuencia, ya que llegarán correos respecto al posible funcionamiento de las pruebas.

Crea una issue en la página del test pidiendo la inclusión del bot en la página de resultados como «Test Reporter request», indicando la cuenta de correo que has usado con ese usuario.

Cuando se haya creado el usuario en el sistema se te dará acceso a una contraseña de forma que puedas configurar que el sistema mande la información de forma automática. Tendrás que entrar en Users -> Your Profile y allí generar la contraseña de aplicación. Posteriormente podrás modificar la constante del entorno con algo similar a export WPT_REPORT_API_KEY='somoshostingbot:ABCD 1234 abcd 4567 EFGH efgh'.

Automatizando el bot

Si va a enviar la información a WordPress.org quizá quieras automatizar el sistema para que mande los informes cuando haya novedades.

En este caso vamos a utilizar una serie de scripts y sistemas para esta automatización, con el objetivo de reducir la cantidad de ejecuciones, y solo lanzarlas cuando sea necesario.

Seguramente hay formas más optimizadas de realizar este sistema, pero este es el que yo he probado y funciona.

Tener una copia de WordPress

cd /home/wordpressbot/
git clone https://github.com/WordPress/wordpress-develop.git wordpress-develop
cd /home/wordpressbot/wordpress-develop/
git pull
git log -n1 --format=format:"%H" > /home/wordpressbot/wordpress-develop.log

Dentro de la carpeta de nuestro usuario haremos una copia del repositorio del WordPress que se usa para desarrollo (y haremos una prueba para validar que se descarga y actualiza correctamente).

Posteriormente (la última línea) generará un fichero en el que se incluirá el identificador del último commit realizado.

Ficheros de control

Crearemos dos ficheros de control.

echo '' > /home/wordpressbot/wordpress-tested.log
echo 0 > /home/wordpressbot/wordpress-running.log

La primera línea crea un fichero sin contenido en la que guardaremos la versión del último test que se ha lanzado.

La segunda línea guardará el estado binario (0 o 1) para saber si se está ejecutando un test o no, a modo de semáforo.

Instalación del runner

Esto no es necesario si ya lo has hecho antes.

cd /home/wordpressbot/
git clone https://github.com/WordPress/phpunit-test-runner.git wordpress-test
cd /home/wordpressbot/wordpress-test/
git pull

Descargamos el PHPUnit test runner, y validamos que se realizan bien las actualizaciones.

Configuramos el entorno. Para ello primero haremos una copia del fichero de ejemplo y posteriormente lo configuraremos.

cp .env.default .env
vim .env

El contenido (de forma resumida) puede ser algo así:

export WPT_PREPARE_DIR=/home/wordpressbot/wp-test-runner
export WPT_TEST_DIR=/home/wordpressbot/wp-test-runner
export WPT_REPORT_API_KEY=somoshostingbot:ABCD1234abcd4567EFGHefgh
export WPT_REPORT_URL=
export WPT_DB_NAME=wordpressdatabase
export WPT_DB_USER=wordpressusername
export WPT_DB_PASSWORD=wordpresspassword
export WPT_DB_HOST=localhost
export WPT_TABLE_PREFIX=${WPT_TABLE_PREFIX-wptests_}
export WPT_PHP_EXECUTABLE=${WPT_PHP_EXECUTABLE-php}
export WPT_PHPUNIT_CMD=
export WPT_RM_TEST_DIR_CMD=
export WPT_SSH_CONNECT=
export WPT_SSH_OPTIONS=
export WPT_SSH_PRIVATE_KEY_BASE64=
export WPT_DEBUG=

A diferencia que en el caso anterior, la configuración de la ruta de las pruebas también es en el mismo usuario. De esta forma, cuando se lancen los test habrá 3 carpetas:

  • /home/wordpressbot/wordpress-develop/: Una copia del Git de desarrollo de WordPress.
  • /home/wordpressbot/wordpress-test/: Una copia del Git de la herramienta de test.
  • /home/wordpressbot/wp-test-runner/: WordPress y ficheros donde se realizarán las pruebas.

El script que ejecuta todo

cat > /home/wordpressbot/wordpressbot.sh << EOF
#!/bin/bash
echo ''
echo '[*] Launching the WordPress testing tool for hosting.'
echo ''
echo '[+] Detecting changes.'
echo ''
cd /home/wordpressbot/wordpress-develop/
git pull
git log -n1 --format=format:"%H" > /home/wordpressbot/wordpress-develop.log
estado=`cat /home/wordpressbot/wordpress-running.log`  
if [ "\$estado" -eq 0 ]; then
  echo ''
  echo '[+] Preparing test.'
  echo ''
  cd /home/wordpressbot/wpsabot-test/
  git pull
  npm update
  file1="/home/wordpressbot/wordpress-develop.log"
  file2="/home/wordpressbot/wordpress-tested.log"
  if cmp -s "\$file1" "\$file2"; then
    echo ''
    echo 'Nothing to do. The last test is the same.'
    echo ''
  else
    echo ''
    echo '[+] Starting test.'
    echo ''
    echo 1 > /home/wordpressbot/wordpress-running.log
    cp /home/wordpressbot/wordpress-develop.log /home/wordpressbot/wordpress-tested.log
    cd /home/wordpressbot/wpsabot-test/
    source .env
    php prepare.php
    php test.php
    php report.php
    cat /home/wordpressbot/wp-test-runner/env.json
    php cleanup.php
    echo 0 > /home/wordpressbot/wordpress-running.log
  fi
else
  echo ''
  echo '[+] Test already in progress.'
  echo ''
fi
echo ''
echo '[*] The End.'
echo ''
EOF

Primero lanzaremos el fichero donde vamos a guardar el script.

cat > /home/wordpressbot/wordpressbot.sh << EOF

Descargaremos la última actualización del WordPress de desarrollo. Guardaremos, en el fichero de log, el identificador del último commit que se ha ejecutado.

cd /home/wordpressbot/wordpress-develop/
git pull
git log -n1 --format=format:"%H" > /home/wordpressbot/wordpress-develop.log

Miraremos si se está ejecutando en este momento un test o no. En caso de que se esté ejecutando actualmente una prueba, no haremos nada (y esperaremos a que acabe).

estado=`cat /home/wordpressbot/wordpress-running.log`  
if [ "$estado" -eq 0 ]; then
...
else
  echo ''
  echo '[+] Test already in progress.'
  echo ''
fi

Si no hay prueba ejecutándose, haremos una actualización de la última versión del software de test.

  echo ''
  echo '[+] Preparing test.'
  echo ''
  cd /home/wordpressbot/wpsabot-test/
  git pull
  npm update

Comprobaremos si hay alguna actualización en el software de desarrollo con respecto a la última prueba.

  file1="/home/wordpressbot/wordpress-develop.log"
  file2="/home/wordpressbot/wordpress-tested.log"
  if cmp -s "$file1" "$file2"; then
  ...
  fi

Si el último commit del software de desarrollo es el mismo sobre el que hicimos ya una prueba, no volveremos a lanzarlo.

    echo ''
    echo 'Nothing to do. The last test is the same.'
    echo ''

Si la prueba es nueva, entonces sí que tendremos que hacer la prueba. Lo primero será establecer los ficheros de configuración. Le diremos al sistema que estamos ejecutando una prueba, y almacenaremos el identificador de la prueba que vamos a realizar (commit).

    echo ''
    echo '[+] Starting test.'
    echo ''
    echo 1 > /home/wordpressbot/wordpress-running.log
    cp /home/wordpressbot/wordpress-develop.log /home/wordpressbot/wordpress-tested.log

Haremos la prueba.

    cd /home/wordpressbot/wpsabot-test/
    source .env
    php prepare.php
    php test.php
    php report.php
    cat /home/wordpressbot/wp-test-runner/env.json
    php cleanup.php

Y, finalmente, le diremos al sistema que hemos acabado la prueba.

    echo 0 > /home/wordpressbot/wordpress-running.log

Y se acabará el test.

echo ''
echo '[*] The End.'
echo ''

Ahora que tenemos el script, lo primero será lanzarlo manualmente al menos una vez para comprobar que funciona correctamente.

bash /home/wordpressbot/wordpressbot.sh

Programando las pruebas (cron)

Ahora que tenemos un script que lo hace todo, podemos programar un cron que, cada minuto, ejecute todo el sistema.

Como el script tiene un sistema de semáforo para no ejecutarse más de una vez en paralelo, se puede lanzar con mucha frecuencia.

* * * * * bash /webs/wpsabot/wpsabot.sh >/dev/null 2>&1

Pruebas completas

Si quieres hacer una prueba completa en una configuración desde cero, tienes algunas opciones:

Mejorando la configuración

No hay que olvidar que el objetivo de esta herramientas es la verificación de que nuestro entorno e infraestructura es la oóptima para que WordPress funcione, por lo que, siguiendo el ejemplo de antes, podríamos hacer varias mejoras como la instalación de la extensión de bcmath, gd, libsodium, mcrypt, mod_xml y imagick o utilidades como ghostscript y imagemagick.

¿El objetivo? Que no haya errores y tener luz verde para la configuración perfecta.

Equipo de Hosting en la Comunidad WordPress

SI eres una empresa que de alguna manera está en el día a día de ofrecer servicios relacionados con WordPress te recomiendo que sigas atento a las publicaciones del equipo Hosting de la Comunidad WordPress, además de seguir atentamente las conversaciones del canal de Slack #hosting-community (ver los horarios de reuniones del equipo), donde podrás estar en contacto con los responsables de otras empresas de hosting.


Sobre este documento

Este documento está regulado por la licencia EUPL v1.2, publicado en WP SysAdmin y creado por Javier Casares. Por favor, si utilizas este contenido en tu sitio web, tu presentación o cualquier material que distribuyas, recuerda hacer una mención a este sitio o a su autor, y teniendo que poner el material que crees bajo licencia EUPL.