プラグイン開発はしたことがあったものの、テストについては実際にWordPress上でポチポチする程度の動作確認しかしていなかったので、下記文献を参考にして環境を構築しようとしたものの、想定上に苦労したのでメモしておきます。
元々は、composerやWP-CLIがインストール済みのLocal(WordPressの開発環境)内で構築しようとしていたものの、sh(シェルスクリプト)を実行する段階になって(Windowsでは普通に実行することは出来ないので)WSL上に構築する方法に切り替えました。
仮想環境の構築
WSL2
$ wsl --install
PCを再起動し、デスクトップショートカットまたはスタートメニューからUbuntuを起動して、設定したパスワードでログインします。
Ubuntuを最新の状態にしておきます。
$ sudo apt update
$ sudo apt upgrade
Apache
$ sudo apt update
$ sudo apt install apache2
$ sudo service apache2 start
PHP
下記を参考に作業します。
$ sudo apt install php libapache2-mod-php php-mysql php-curl php-mbstring php-xml php-zip
このコマンドだと比較的新しいバージョンのPHPがインストールされます。(著者環境では8.1でした)
ただし、利用したWordPressのユニットテストが対応するPHPのバージョンが低かったので、後で別バージョンのPHPもインストールすることになりました。(後述)
composer
下記を参考に作業します。
$ sudo apt install curl git unzip php-cli php-mbstring php-intl php-mysql php-gd php-dom php-xml
$ php -r "copy ( 'https://getcomposer.org/installer', 'composer-setup.php' ) ;";
$ sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer;
$ rm -r composer-setup.php
MySQL
下記を参考に作業します。
$ sudo apt install mysql-server
$ sudo service mysql start
ただし、パスワードが設定されていないので設定しておきます。
$ vim /etc/mysql/mysql.conf.d/mysqld.cnf
下記を追記して保存します。
default_authentication_plugin=mysql_native_password
$ sudo service mysql restart
$ sudo mysql
mysql > ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{rootpass}';
これ以降でコンソールからMySQLに接続する時は”sudo mysql -uroot -p”(パスワードはrootpass)で接続することになります。
また、WordPressの為にwp_testというデータベースを作っておきます。
mysql > create database wp_test;
後で必要になるのでポート番号を調べてメモしておきます。
mysql > SHOW VARIABLES LIKE 'port';
WordPress設置
$ cd /var/www/html/
$ wget https://ja.wordpress.org/latest-ja.tar.gz
$ tar xvf latest-ja.tar.gz -C /var/www/html/
$ chown -R www-data:www-data /var/www/html/wordpress
chownによる所有者変更は、文献だとapache:apacheになっているが、当環境ではwp-config.phpがwww-data:www-dataになっていたので、これを指定しています。
なお、これでも書き込みが出来ないようなら下記を実行します。
$ chmod -R a+w /var/www/html/wordpress
ホストOSのブラウザから接続テストとWordPressインストール
下記を参考に、ifconfigコマンドをインストールしてeth0のIPを調べます。
$ sudo apt install net-tools
$ ifconfig
それをブラウザで指定してWordPressのインストールを完了させます。
WP-CLI
下記を参考に作業します。
$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ chmod +x wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp
SVN
下記を参考に作業します。
$ apt -y install subversion
PHPUnitによるテスト環境の構築
前提として、独自プラグインのテスト環境を構築するものとします。
WordPressルートディレクトリで下記を実行します。
$ wp scaffold plugin my-plugin
プラグインディレクトリで下記を実行します。(ポート番号は”SHOW VARIABLES LIKE ‘port’;”で確認)
$ bin/install-wp-tests.sh wp_test root rootpass localhost:3306 latest true
phpの実行バージョンに対応したPHPUnitをインストールします。本環境ではPHP8.1とします。
https://phpunit.de/supported-versions.html
https://github.com/sebastianbergmann/phpunit/branches/active
$ composer require --dev phpunit/phpunit:10.5
これでテストを実行してみます。
$composer test
Error: The PHPUnit Polyfills library is a requirement for running the WP test suite.
$ composer require --dev yoast/phpunit-polyfills
再度テストを実行するも、今度はクラスが見つからないエラーが大量に出力されます。
そこで、composerで入れるphpunitのバージョンを^7.5に指定して入れなおしてみると、今度はPHP8.1には対応していないエラーとなってしまいました。
仕方ないので別バージョンのPHPをインストールすることにします。
下記を参考にしてPHPのバージョンを切り替えられるようにしてPHP7.3をインストールします。
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt update
$ sudo apt install php7.3
下記コマンドを実行して古いバージョンのPHPに切り替えます。
$ sudo update-alternatives --config php
composer.jsonを修正します。
"minimum-stability": "stable",
"require": {
"php": ">=7.0"
},
"require-dev": {
"phpunit/phpunit": "^7.5",
"yoast/phpunit-polyfills": "^2.0"
}
composer.lockとvendorディレクトリ削除して”composer install”実行。
Problem 1
- phpunit/phpunit[7.5.0, ..., 7.5.20] require ext-dom * -> it is missing from your system. Install or enable PHP's dom extension.
- Root composer.json requires phpunit/phpunit ^7.5 -> satisfiable by phpunit/phpunit[7.5.0, ..., 7.5.20].
足りていなかったものを追加インストールしました。
$ sudo apt install php7.3-dom php7.3-mbstring php7.3-mysql
$ composer test
PHP Warning: PHP Startup: Unable to load dynamic library 'mysqli' (tried: /usr/lib/php/20180731/mysqli (/usr/lib/php/20180731/mysqli: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/mysqli.so (/usr/lib/php/20180731/mysqli.so: undefined symbol: mysqlnd_global_stats)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: /usr/lib/php/20180731/pdo_mysql (/usr/lib/php/20180731/pdo_mysql: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/pdo_mysql.so (/usr/lib/php/20180731/pdo_mysql.so: undefined symbol: mysqlnd_allocator)) in Unknown on line 0
Composer could not detect the root package (horaguchi/global-field-management-tool) version, defaulting to '1.0.0'. See https://getcomposer.org/root-version
> phpunit
PHP Warning: PHP Startup: Unable to load dynamic library 'mysqli' (tried: /usr/lib/php/20180731/mysqli (/usr/lib/php/20180731/mysqli: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/mysqli.so (/usr/lib/php/20180731/mysqli.so: undefined symbol: mysqlnd_global_stats)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: /usr/lib/php/20180731/pdo_mysql (/usr/lib/php/20180731/pdo_mysql: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/pdo_mysql.so (/usr/lib/php/20180731/pdo_mysql.so: undefined symbol: mysqlnd_allocator)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'mysqli' (tried: /usr/lib/php/20180731/mysqli (/usr/lib/php/20180731/mysqli: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/mysqli.so (/usr/lib/php/20180731/mysqli.so: undefined symbol: mysqlnd_global_stats)) in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library 'pdo_mysql' (tried: /usr/lib/php/20180731/pdo_mysql (/usr/lib/php/20180731/pdo_mysql: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/pdo_mysql.so (/usr/lib/php/20180731/pdo_mysql.so: undefined symbol: mysqlnd_allocator)) in Unknown on line 0
PHPの設定ファイルを修正します。
$sudo vim /etc/php/7.3/cli/conf.d/20-mysqli.ini
下記の絶対パスに書き換えます。
extension=/usr/lib/php/20180731/mysqli.so
$ sudo vim /etc/php/7.3/cli/conf.d/20-pdo_mysql.ini
下記の絶対パスに書き換えます。
extension=/usr/lib/php/20180731/pdo_mysql.so
また、下記のファイルでextensionをコメントアウトしてしまった場合はコメントします。
$ sudo vim /etc/php/7.3/cli/php.ini
ウェブサーバー再起動します。
$ sudo service apache2 restart
これで、ようやくテストを実行できるようになりました。