WSL2でWordPressプラグインのユニットテスト環境を構築する

プラグイン開発はしたことがあったものの、テストについては実際にWordPress上でポチポチする程度の動作確認しかしていなかったので、下記文献を参考にして環境を構築しようとしたものの、想定上に苦労したのでメモしておきます。

WordPress テスト入門 – 1章 – – WordPressテーマ&プラグイン – Kunoichi Market

元々は、composerやWP-CLIがインストール済みのLocal(WordPressの開発環境)内で構築しようとしていたものの、sh(シェルスクリプト)を実行する段階になって(Windowsでは普通に実行することは出来ないので)WSL上に構築する方法に切り替えました。

仮想環境の構築

WSL2

WSL のインストール
コマンド wsl --install を使用して Linux 用 Windows サブシステムをインストールします。 Windows コンピューター上で、好みの Linux ディストリビューションによって実行される Bash ターミナルを使...
$ wsl --install

PCを再起動し、デスクトップショートカットまたはスタートメニューからUbuntuを起動して、設定したパスワードでログインします。

Ubuntuを最新の状態にしておきます。

$ sudo apt update
$ sudo apt upgrade

Apache

$ sudo apt update
$ sudo apt install apache2
$ sudo service apache2 start

PHP

下記を参考に作業します。

LAMP(Linux,Apache,MySQL,PHP)環境構築【Ubuntu20.04】|Lunaris CODE ルナリスコード
LAMPのインストールをすることで、Webサーバーの構築及び、Webサービスの開発環境を構築します。
$ sudo apt install php libapache2-mod-php php-mysql php-curl php-mbstring php-xml php-zip

このコマンドだと比較的新しいバージョンのPHPがインストールされます。(著者環境では8.1でした)

ただし、利用したWordPressのユニットテストが対応するPHPのバージョンが低かったので、後で別バージョンのPHPもインストールすることになりました。(後述)

composer

下記を参考に作業します。

PHPフレームワーク、Laravel開発環境構築【Ubuntu 20.04】|Lunaris CODE ルナリスコード
Ubuntu上でのLaravelの開発環境構築を解説します。
$ 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

下記を参考に作業します。

LAMP(Linux,Apache,MySQL,PHP)環境構築【Ubuntu20.04】|Lunaris CODE ルナリスコード
LAMPのインストールをすることで、Webサーバーの構築及び、Webサービスの開発環境を構築します。
$ sudo apt install mysql-server
$ sudo service mysql start

ただし、パスワードが設定されていないので設定しておきます。

Ubuntu20.04でMySQL8のmysql_secure_installationでパスワードが設定されない。
はじめに 久しぶりにMySQLをAzure VMのUbuntu20.04にインストールする機会がありました。 そこで、気になったことがありました。 インストール後にmysql_secure_insta
$ 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を調べます。

【簡単】Windows WSLにApacheをインストールする | Web Apps Labo
こんにちは。今回はwindows 10のWSLにApache HTTP Serverをインストールする手順を解説します。とても簡単にセットアップできるのでWindowsだけどLinuxのApacheを使いたいという方にお勧めです。前提条件W...
$ sudo apt install net-tools
$ ifconfig

それをブラウザで指定してWordPressのインストールを完了させます。

WP-CLI

下記を参考に作業します。

Command line interface for 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

下記を参考に作業します。

Ubuntu 22.04 LTS : Subversion : インストール : Server World
Ubuntu 22.04 LTS Subversion インストール
$ 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

これで、ようやくテストを実行できるようになりました。

タイトルとURLをコピーしました