応用編
🧪 テストとデバッグ
バグのないプラグインを作るためのテスト戦略とデバッグツールを体系的に学びます。PHPUnitによるユニットテスト・統合テスト・GitHub Actionsによる自動化まで解説します。
🧪 テストの種類と目的
ユニットテスト
個々の関数・メソッドを単独で検証。PHPUnitを使用。高速で実行でき、関数の入出力・エッジケースを網羅できます。
統合テスト
複数のコンポーネントが連携して正しく動くかを検証。DBへの保存・取得・フックの動作確認などに使います。WP_UnitTestCaseを使用。
E2Eテスト
実際のブラウザを操作して動作を検証。Playwright/Cypress等を使用。管理画面のフォーム送信など、最も実態に近い検証ができます。
🐛 デバッグ設定
開発環境の wp-config.php にデバッグ設定を追加します。本番環境では WP_DEBUG を必ず false にしてください。
// ─── 開発環境 ────────────────────────────────────────────
define( 'WP_DEBUG', true ); // デバッグ有効化
define( 'WP_DEBUG_LOG', true ); // wp-content/debug.log に記録
define( 'WP_DEBUG_DISPLAY', false ); // 画面には表示しない(XSSリスクあり)
define( 'SCRIPT_DEBUG', true ); // minify前のJS/CSSを読み込む
define( 'SAVEQUERIES', true ); // 実行クエリをメモリに記録
// ─── 本番環境 ────────────────────────────────────────────
define( 'WP_DEBUG', false );
define( 'WP_DEBUG_LOG', false );
define( 'WP_DEBUG_DISPLAY', false );
🔍 デバッグツール
Query Monitor(必須プラグイン)
開発中に必ず導入すべきプラグインです。管理バーにSQLクエリ数・実行時間・使用メモリ・フック・HTTP API呼び出し・条件タグなどをリアルタイム表示します。遅いクエリの特定に最適です。
Log Deprecated Notices
非推奨関数・引数・フックの使用を検出してログに記録します。将来のWordPressバージョンへの対応確認に役立ちます。
コードによるデバッグ手法
// ① debug.logへ出力(本番環境に残してもOK)
error_log( 'mfp: ' . print_r( $variable, true ) );
// ② 型と値を画面に出力(本番では必ず削除)
var_dump( $variable ); die();
// ③ 処理を途中で止めてデータを確認
wp_die( '<pre>' . print_r( $data, true ) . '</pre>' );
// ④ 実行クエリを確認(SAVEQUERIES=true が必要)
global $wpdb;
error_log( 'last_query: ' . $wpdb->last_query );
error_log( 'last_error: ' . $wpdb->last_error );
error_log( 'num_queries: ' . $wpdb->num_queries );
🧪 PHPUnit によるユニットテスト
環境セットアップ
# 1. Composer で PHPUnit をインストール
composer require --dev phpunit/phpunit
# 2. WordPress テストスイートをセットアップ
# 引数: DB名 DBユーザー DBパスワード DBホスト WPバージョン
bash bin/install-wp-tests.sh wordpress_test root '' localhost latest
# 3. テスト実行
./vendor/bin/phpunit
# 特定ファイルのみ実行
./vendor/bin/phpunit tests/test-mfp-functions.php
# 詳細表示
./vendor/bin/phpunit --verbose
テストクラスの書き方
<?php
class Test_MFP_Functions extends WP_UnitTestCase {
// 各テスト前に実行
public function setUp(): void {
parent::setUp();
// テスト用データの初期化
}
// ─ テスト関数名は test_ で始める ──────────────────────
// サニタイズのテスト
public function test_sanitize_removes_html_tags() {
$input = '<script>alert("xss")</script>Hello';
$expected = 'Hello';
$result = mfp_sanitize_input( $input );
$this->assertEquals( $expected, $result );
}
// 空文字列の場合のテスト(エッジケース)
public function test_empty_input_returns_default() {
$result = mfp_get_option( '' );
$this->assertEquals( 'default_value', $result );
}
// DB書き込みのテスト(WP_UnitTestCaseはテスト後にロールバック)
public function test_save_note_stores_in_db() {
$user_id = self::factory()->user->create();
wp_set_current_user( $user_id );
mfp_save_note( 'テストメモ' );
$result = get_user_meta( $user_id, 'mfp_note', true );
$this->assertEquals( 'テストメモ', $result );
}
// 投稿作成のテスト
public function test_popular_posts_returns_correct_count() {
// ファクトリで投稿を5件作成
self::factory()->post->create_many( 5 );
$posts = mfp_get_popular_posts( 3 );
$this->assertCount( 3, $posts );
}
}
💡 WP_UnitTestCase のファクトリを活用する
self::factory()->post->create() で投稿、self::factory()->user->create() でユーザーをテスト用に素早く作成できます。テスト後はDBが自動的にロールバックされるので後処理は不要です。
🔄 GitHub Actions で自動テスト
GitHubにpushするたびに自動でテストが実行されるCI/CD環境を整えます。
name: Run Tests on Push
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
phpunit:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress_test
options: --health-cmd="mysqladmin ping" --health-interval=10s
steps:
- uses: actions/checkout@v4
- name: Setup PHP 8.1
uses: shivammathur/setup-php@v2
with:
php-version: '8.1'
extensions: mysqli
- name: Install dependencies
run: composer install --no-interaction
- name: Install WordPress test suite
run: bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1 latest
- name: Run PHPUnit
run: ./vendor/bin/phpunit --testdox
✏️ 演習:はじめてのユニットテストを書こう
📝 課題
- PHPUnitを使って、STEP 4で作成したショートコード関数のテストを書く
- 正常系(入力が正しい場合)と異常系(空文字・不正な値)のテストを書く
- self::factory()->post->create()でテスト用投稿を作成して検証する
- (発展)GitHub Actionsのワークフローファイルを作成して自動テストを設定する
✅ この章のチェックリスト
- wp-config.phpにデバッグ設定を追加できた
- Query MonitorでSQLクエリを分析できた
- PHPUnitのテスト環境をセットアップできた
- WP_UnitTestCaseを使ったテストクラスを作成できた
- ファクトリで投稿・ユーザーのテストデータを作成できた
- GitHub Actionsで自動テストを設定できた
🔗 関連ページ・次のステップ
📘 前提知識
- STEP 2: 最小構成プラグインを作る
- セキュリティ対策(サニタイズ・エスケープ)
🚀 あわせて学ぶ
- パフォーマンス最適化(Query Monitorの活用)
- WP-CLIコマンド開発(CI/CDでのテスト実行)
📚 補足
- トラブルシューティング(エラー解決ガイド)
- 実例集