🧪 テストの種類と目的

ユニットテスト

個々の関数・メソッドを単独で検証。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

✏️ 演習:はじめてのユニットテストを書こう

📝 課題

  1. PHPUnitを使って、STEP 4で作成したショートコード関数のテストを書く
  2. 正常系(入力が正しい場合)と異常系(空文字・不正な値)のテストを書く
  3. self::factory()->post->create()でテスト用投稿を作成して検証する
  4. (発展)GitHub Actionsのワークフローファイルを作成して自動テストを設定する

✅ この章のチェックリスト

  • wp-config.phpにデバッグ設定を追加できた
  • Query MonitorでSQLクエリを分析できた
  • PHPUnitのテスト環境をセットアップできた
  • WP_UnitTestCaseを使ったテストクラスを作成できた
  • ファクトリで投稿・ユーザーのテストデータを作成できた
  • GitHub Actionsで自動テストを設定できた

🔗 関連ページ・次のステップ

📘 前提知識

🚀 あわせて学ぶ

📚 補足