Pruebas con PHPUnit

Última actualización: 14 de diciembre de 2019

Una de las formas de colaborar en el código de WordPress es verificar que el código de PHP está normalizado y funciona correctamente. Para ello el equipo de desarrollo del núcleo de WordPress ha decidido hacer pruebas con PHPUnit.

Los ejemplos y código que aquí se presenta se basan en la instalación y configuración de VPS con Subversion. A partir de esta configuración revisaremos el sistema con PHPUnit.

Instalación de PHPUnit

Lo primero que haremos será instalar y configurar de forma global PHPUnit. Para ello tan sólo hemos de seguir los siguientes pasos.

$ cd
$ wget -O phpunit https://phar.phpunit.de/phpunit-7.phar
$ chmod +x phpunit
$ mv phpunit /usr/local/bin/phpunit
$ phpunit --version

Este último comando nos mostrará la versión actual del software de forma que sabremos que está funcionando.

Base de datos de prueba

Estas pruebas eliminan todo el contenido de la base de datos, por lo que, antes de seguir, crearemos una base de datos paralela en la que se realizarán las pruebas. Usaremos el mismo modelo que en la creación de la base de datos principal.

$ mysql -u root -p

Necesitarás una contraseña para esta base de datos exclusiva para nuestro WordPress de test. Por favor, crea tu propia contraseña que sea algo segura.

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

Configuración de WordPress para la prueba

Ahora que tenemos el software instalado y una base de datos de prueba, crearemos un fichero de configuración en el que incorporar esta información.

$ cd /webs/wordpress-svn/
$ vim wp-tests-config.php

El fichero incorporará una configuración como esta. NOTA: Verifica los datos de conexión y otros elementos a lo largo del fichero.

<?php

/* Path to the WordPress codebase you'd like to test. Add a forward slash in the end. */
if ( defined( 'WP_RUN_CORE_TESTS' ) && WP_RUN_CORE_TESTS ) {
  define( 'ABSPATH', dirname( __FILE__ ) . '/build/' );
} else {
  define( 'ABSPATH', dirname( __FILE__ ) . '/src/' );
}

/*
 * Path to the theme to test with.
 *
 * The 'default' theme is symlinked from test/phpunit/data/themedir1/default into
 * the themes directory of the WordPress installation defined above.
 */
define( 'WP_DEFAULT_THEME', 'default' );

// Test with multisite enabled.
// Alternatively, use the tests/phpunit/multisite.xml configuration file.
// define( 'WP_TESTS_MULTISITE', true );

// Force known bugs to be run.
// Tests with an associated Trac ticket that is still open are normally skipped.
// define( 'WP_TESTS_FORCE_KNOWN_BUGS', true );

// Test with WordPress debug mode (default).
define( 'WP_DEBUG', true );

// ** MySQL settings ** //

// This configuration file will be used by the copy of WordPress being tested.
// wordpress/wp-config.php will be ignored.

// WARNING WARNING WARNING!
// These tests will DROP ALL TABLES in the database with the prefix named below.
// DO NOT use a production database or one that is shared with something else.

define( 'DB_NAME', 'wordpresstest' );
define( 'DB_USER', 'wordpresstest' );
define( 'DB_PASSWORD', '__PASSWORD__' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', 'utf8mb4_bin' );

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 */
define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );

$table_prefix = 'wptests_';   // Only numbers, letters, and underscores please!

define( 'WP_TESTS_DOMAIN', 'example.com' );
define( 'WP_TESTS_EMAIL', 'hello@example.com' );
define( 'WP_TESTS_TITLE', 'Test Blog' );

define( 'WP_PHP_BINARY', 'php' );

Inicio de la prueba con PHPUnit

Lo siguiente que haremos es preparar una configuración de WordPress lista para que se puedan hacer pruebas. Por ello lanzaremos una serie de comandos para preparar el sistema. El último de los comandos ejecutará la prueba de PHPUnit.

$ cd /webs/wordpress-svn/
$ npm update
$ npm run grunt build
$ npm run grunt watch
$ phpunit

Esto debería devolver algo tal que así:

user@wordpress-svn:/webs/wordpress-svn# phpunit
 Installing…
 Running as single site… To run multisite, use -c tests/phpunit/multisite.xml
 Not running ajax tests. To execute these, use --group ajax.
 Not running ms-files tests. To execute these, use --group ms-files.
 Not running external-http tests. To execute these, use --group external-http.
 PHPUnit 7.5.18 by Sebastian Bergmann and contributors.
 …………………………………………………..    59 / 10082 (  0%)
 …
 …………………………………………………..  9086 / 10082 ( 90%)
 …………………………………………………..  9145 / 10082 ( 90%)
 …………………………………………………..  9204 / 10082 ( 91%)
 …………………………………………………..  9263 / 10082 ( 91%)
 …………………………………………………..  9322 / 10082 ( 92%)
 …………………………………………………..  9381 / 10082 ( 93%)
 …………………………………………………..  9440 / 10082 ( 93%)
 …………………………………………………..  9499 / 10082 ( 94%)
 …………………………………………………..  9558 / 10082 ( 94%)
 …………………………………………………..  9617 / 10082 ( 95%)
 …………………………………………………..  9676 / 10082 ( 95%)
 …………………………………………………..  9735 / 10082 ( 96%)
 …………………………………………………..  9794 / 10082 ( 97%)
 …………………………………………………..  9853 / 10082 ( 97%)
 …………………………………………………..  9912 / 10082 ( 98%)
 …………………………………………………..  9971 / 10082 ( 98%)
 ………………………………………………….. 10030 / 10082 ( 99%)
 …………………………………………….        10082 / 10082 (100%)
 You should really fix these slow tests (>150ms)…
 1165ms to run Tests_Image_Functions:test_wp_crop_image_url
 823ms to run Tests_Media:test_multiline_comment_with_embeds
 425ms to run Tests_Media:test_autoembed_no_paragraphs_around_urls
 413ms to run Tests_Media:test_oembed_explicit_media_link
 389ms to run Tests_Dependencies_Scripts:test_no_source_mapping
 377ms to run Tests_Media:test_wp_calculate_image_srcset_no_width
 373ms to run Tests_Media:test_wp_calculate_image_srcset_no_date_uploads
 263ms to run Tests_Import_Import:test_double_import
 227ms to run Tests_Import_Import:test_small_import
 214ms to run Test_Nav_Menus:test_wp_get_associated_nav_menu_items
 …and there are 7 more above your threshold hidden from view 
 Time: 2.07 minutes, Memory: 193.08 MB
 There was 1 error:
 1) Test_WP_Customize_Nav_Menus::test_search_available_items_query
 There were 13 failures:
 1) Tests_Date_Get_Permalink::test_should_return_correct_date_permalink_with_changed_time_zone
 2) Tests_DB::test_get_col with data set #2 ('SELECT user_login, user_email…_users', 'admin@example.org', array(), 1)
 3) Tests_DB::test_get_col with data set #3 ('SELECT user_login, user_email…_users', 'admin@example.org', array(), '1')
 4) Tests_Dependencies_Scripts::test_wp_add_inline_script_before_after_concat_with_core_dependency
 5) Tests_Meta_Query::test_meta_type_key_should_be_passed_to_meta_query
 6) Tests_Query_MetaQuery::test_duplicate_posts_when_no_key
 7) Tests_Query_MetaQuery::test_compare_key_regexp_rlike
 8) Tests_Query_MetaQuery::test_compare_key_not_regexp
 9) Tests_Query_Search::test_search_order_title_before_excerpt_and_content
 10) WP_Test_REST_Posts_Controller::test_get_items_with_orderby_relevance_two_terms
 11) WP_Test_REST_Users_Controller::test_get_items_orderby_name
 12) WP_Test_REST_Users_Controller::test_update_item_existing_email_case_not_own
 13) Tests_Term_getTerms::test_get_terms_like
 ERRORS!
 Tests: 10082, Assertions: 50670, Errors: 1, Failures: 13, Skipped: 44.

¿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.