Pruebas de WordPress para empresas de hosting

Última actualización: 26 de abril de 2020

Tabla de contenidos

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.

Requerimientos

Para hacer las pruebas hace falta poca cosa. Lo primero es tener una infraestructura con la configuración habitual de tu sistema. Por otro lado, una base de datos en la que se puedan hacer pruebas (ya que se creará y destruirá).

Instalando el phpunit-test-runner

El phpunit-test-runner es una pequeña pieza de pruebas de PHPUnit específicamente pensado 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 con Travis. Para ver el funcionamiento y el objetivo de este documento haremos las pruebas de forma manual.

Instalación del test

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

cd /tmp/
git clone https://github.com/WordPress/phpunit-test-runner.git
cd phpunit-test-runner/

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/wordpress
export WPT_TEST_DIR=/tmp/wordpress
export WPT_REPORT_API_KEY=
export WPT_REPORT_URL=
export WPT_DB_NAME=wordpress
export WPT_DB_USER=wordpress
export WPT_DB_PASSWORD=__PASSWORD__
export WPT_DB_HOST=localhost
export WPT_TABLE_PREFIX=${WPT_TABLE_PREFIX-wptests_}
export WPT_PHP_EXECUTABLE=${WPT_PHP_EXECUTABLE-php}
WPT_PHPUNIT_CMD=
WPT_RM_TEST_DIR_CMD=
export WPT_SSH_CONNECT=
export WPT_SSH_OPTIONS=
export WPT_SSH_PRIVATE_KEY_BASE64=

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.

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 /tmp/phpunit-test-runner/
git pull
npm update
source .env

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 report. 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/wordpress/env.json
cat /tmp/wordpress/junit.xml

Y, para acabar, una vez tienes el sistema terminado, sólo 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 usuarios 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», 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'.

Probando un entorno desde cero

Si quieres hacer pruebas en un entorno de desarrollo (sin necesidad de enviar los datos), puedes hacerlo sin problema. El objetivo de esta prueba es trabajar con múltiples opciones y configuraciones, con el objetivo final de que encuentres el mejor entorno para trabajar.

Requisitos

Aunque no hay unos requisitos mínimos de por sí, en las pruebas que he podido hacer me he encontrado que, al menos, se recomienda:

  • VPS (también se puede usar un entorno local)
    • 1 CPU
    • 2 GB RAM
    • 10 GB SSD
  • Ubuntu, CentOS, Debian… (el ejemplo es con Ubuntu 18.04 LTE)
  • MySQL, MariaDB, Percona for MySQL (el ejemplo es con MariaDB 10.4)
  • PHP (el ejemplo es con PHP 7.4)

Hay que tener en cuenta que este ejemplo no plantea una máquina en producción, si no un ejemplo de distintos elementos y pruebas que se pueden ejecutar, contando la instalación se sistemas de caché, extensiones de PHP…

Instalación base

La instalación base plantea disponer los elementos mínimos para que el sistema funcione.

Configuración del Sistema Operativo

Lo primero que haremos será poner el sistema en hora. Para evitar problemas y teniendo en cuenta que puede ser una máquina que mande información al WordPress, lo mejor sería configurar el reloj en modo UTC de forma universal.

timedatectl set-timezone UTC
timedatectl set-ntp on

Lo siguiente que haremos es poner la máquina al día en todo su sistema. Con esto nos aseguraremos que todo esté al día y que los conflictos se reducen al mínimo.

apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove

Instalaremos algunas herramientas necesarias y habituales como curl, vim, zip o el propio git.

apt -y install software-properties-common curl vim unzip git

Instalación de la base de datos

Instalaremos MariaDB 10.4 en la prueba. En principio sirve cualquier base de datos compatible con WordPress.

curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version="mariadb-10.4"
apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove
apt -y install mariadb-server mariadb-client
systemctl restart mysql.service

Una vez acabada la instalación haremos una primera configuración para dejarla lista.

mysql_secure_installation

A partir de este momento el sistema nos hará una serie de preguntas y configuraremos la contraseña de root de la propia base de datos.

Enter current password for root (enter for none):
Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] y
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

Reiniciaremos la base de datos para que tome todos los datos y deje el sistema listo.

systemctl restart mysql.service

Instalación de PHP

Para esta prueba instalaremos PHP 7.4. En un primer momento sólo vamos a instalar los elementos mínimos, por lo que seguramente tengamos que ampliar posteriormente con algunas extensiones. Como decía al inicio, el objetivo es probar el sistema, por lo que en este momento tiene sentido que nos de error por falta de elementos.

add-apt-repository -y ppa:ondrej/php
apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove
apt -y install php7.4 php7.4-curl php7.4-dev php7.4-fpm php7.4-mbstring php7.4-mysql php7.4-mysqlnd
apt -y install php-pear pkg-config
pecl channel-update pecl.php.net

Aunque podemos dejar la configuración de PHP como la tengamos en el sistema habitual que se ofrece a los clientes, para esta prueba haremos unos pequeños cambios.

vim /etc/php/7.4/fpm/php.ini

Y cambiaremos estas configuraciones.

max_execution_time = 60
memory_limit = 256M
post_max_size = 128M
upload_max_filesize = 128M
date.timezone = 'UTC'

Una vez finalizara la reconfiguración, reiniciaremos el servicio y lo activaremos por defecto.

systemctl stop php7.4-fpm.service
systemctl enable php7.4-fpm.service
systemctl start php7.4-fpm.service

Instalación de Node

Para que las pruebas funcionen correctamente necesitaremos algunos elementos que quizá habitualmente no estén disponibles. Entre ellos etsá NodeJS, Grunt y PhantomJS.

Primero instalamos NodeJS

cd
curl -sL https://deb.nodesource.com/setup_13.x | bash -
apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove
apt -y install nodejs

Posteriormente instalamos Grunt

npm install -g grunt

Y finalmente instalamos PhantomJS

apt -y install build-essential chrpath libssl-dev libxft-dev libfreetype6 libfreetype6-dev libfontconfig1 libfontconfig1-dev
cd
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar xvjf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/share/
ln -sf /usr/local/share/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin
rm -rf phantomjs-2.1.1-linux-x86_64.tar.bz2

Finalizando la configuración

Para acabar la configuración de la máquina, haremos algunos ajustes. Para empezar, actualizaremos todo de nuevo y nos aseguramos que no haya quedado ninguna biblioteca colgada.

apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove

Y configuraremos la base de datos de pruebas que vamos a utilizar en los test. Entraremos en el servidor.

mysql -u root -p

Y crearemos una base de datos de prueba. En este caso se llamará wordpress y el usuario también será wordpress. Configura la contraseña que veas conveniente.

CREATE DATABASE wordpress CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;
GRANT ALL ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY '__PASSWORD__';
GRANT ALL ON wordpress.* TO 'wordpress'@'127.0.0.1' IDENTIFIED BY '__PASSWORD__';
FLUSH PRIVILEGES;
quit

A partir de este momento tenemos toda la base para poder hacer nuestro primer test.

Instalación del PHPUnit test

Seguiremos las instrucciones que hemos tenido previamente. Por defecto haremos las pruebas en la carpeta /tmp/.

cd /tmp/
git clone https://github.com/WordPress/phpunit-test-runner.git
cd /tmp/phpunit-test-runner/
cp .env.default .env

Y estableceremos los contenidos del entorno con los datos de acceso que hemos creado previamente.

vim .env

Recuerda incluir la carpeta donde está instalado el software y donde estará instalado el WordPress, además de los datos de acceso a la base de datos.

export WPT_PREPARE_DIR=/tmp/wordpress
export WPT_TEST_DIR=/tmp/wordpress
export WPT_REPORT_API_KEY=
export WPT_REPORT_URL=
export WPT_DB_NAME=wordpress
export WPT_DB_USER=wordpress
export WPT_DB_PASSWORD=__PASSWORD__
export WPT_DB_HOST=localhost
export WPT_TABLE_PREFIX=${WPT_TABLE_PREFIX-wptests_}
export WPT_PHP_EXECUTABLE=${WPT_PHP_EXECUTABLE-php}
WPT_PHPUNIT_CMD=
WPT_RM_TEST_DIR_CMD=
export WPT_SSH_CONNECT=
export WPT_SSH_OPTIONS=
export WPT_SSH_PRIVATE_KEY_BASE64=

Preparando el entorno

Antes de hacer la primera prueba, pondremos al día todo. Este proceso se puede ejecutar antes de hacer cada prueba en este entorno si queremos tenerlo al día, aunque dependerá más si es en un entorno en producción.

apt -y update && apt -y upgrade && apt -y dist-upgrade && apt -y autoremove
cd /tmp/phpunit-test-runner/
git pull
npm update
source .env

Preparando la prueba

Ahora que tenemos el entorno listo, podemos ejecutar la preparación de la prueba.

cd /tmp/phpunit-test-runner/
php prepare.php

El sistema ejecutará una larga serie de instalaciones, configuraciones y compilaciones de distintos elementos para poder preparar la prueba. Si salen avisos y warnings no deberías preocuparte mucho, ya que es bastante normal. Al fnal del proceso te avisará si necesita algo que no tiene. En principio, debería quedar algo tal que esto:

Done.
Replacing variables in wp-tests-config.php
Success: Prepared environment.

Si el entorno ha quedado preparado, el siguiente paso es hacer una primera prueba.

Ejecutando la prueba

Ahora que ya tenemos el entorno listo, vamos a por la prueba. Para ello ejecutaremos el fichero que la realizará.

cd /tmp/phpunit-test-runner/
php test.php

¿Qué significa los símbolos?

  • .: Cada punto significa que la prueba ha sido pasada correctamente.
  • S: Significa que la prueba se ha saltado. Suele ser porque estas pruebas sólo son válidas en determinadas configuraciones.
  • F: Significa que la prueba ha fallado. Al final aparece información del porqué.
  • E: Significa que la prueba ha fallado debido a un error de PHP, que puede ser error, warning o notice.
  • I: Significa que la prueba se ha marcado como incompleta.

Si has seguido todos los pasos hasta este momento es muy probable que la prueba que has ejecutado falle bastante (por ejemplo, porque por defecto no podrá hacer el tratamiento de imágenes). Pero no pasa nada, como he comentado, esto es un ejemplo para comprobar y verificar el funcionamiento.

Creando un informe

Aunque la prueba haya fallado, podemos generar el informe y (si se diera el caso) enviarlo. Pero primero lo primero, que es la creación de los informes. Para ello ejecutaremos el fichero que lo hace.

cd /tmp/phpunit-test-runner/
php report.php

Este sistema generará los dos ficheros que se mandan como informes.

En el primero de ellos podemos ver la información sobre nuestro entorno.

cat /tmp/wordpress/env.json

El contenido de este fichero es algo similar a esto:

{
    "php_version": "7.4.5",
    "php_modules": {
        "bcmath": false,
        "curl": "7.4.5",
        "filter": "7.4.5",
        "gd": false,
        "libsodium": false,
        "mcrypt": false,
        "mod_xml": false,
        "mysqli": "7.4.5",
        "imagick": false,
        "pcre": "7.4.5",
        "xml": "7.4.5",
        "xmlreader": "7.4.5",
        "zlib": "7.4.5"
    },
    "system_utils": {
        "curl": "7.58.0 (x86_64-pc-linux-gnu) libcurl\/7.58.0 OpenSSL\/1.1.1g zlib\/1.2.11 libidn2\/2.3.0 libpsl\/0.19.1 (+libidn2\/2.0.4) nghttp2\/1.30.0 librtmp\/2.3",
        "ghostscript": "",
        "imagemagick": false,
        "openssl": "1.1.1g  21 Apr 2020"
    },
    "mysql_version": "mysql  Ver 15.1 Distrib 10.4.12-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2",
    "os_name": "Linux",
    "os_version": "4.15.0-20-generic"
}

Como se puede comprobar, entre los elementos más detacados están las extensiones que habitualmente se utilizan en WordPress y algunas utilidades que por norma general también son últiles.

El otro fichero es el que incluye todas las pruebas que se realizan (más de 10.000) dando información del tiempo que tandan en ejecutarse, problemas que han podido surgir…

cat /tmp/wordpress/junit.xml

Limpiando el entorno para otras pruebas

Ahora que ya tenemos las pruebas funcionando, lo que nos queda por hacer es eliminar todos los ficheros que se han creado para poder volver a comenzar. Para ello ejecutaremos el siguiente comando:

cd /tmp/phpunit-test-runner/
php cleanup.php

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.