Search by

tmswp / testing

tmstack-io

TMStack WordPress Framework - Testing support

v0.10.0 2026-10-30 13:00 UTC

This package is auto-updated.

Last update: 2026-10-30 13:01:12 UTC


README

TMStack WordPress Framework(TMSWP)のパッケージと、TMSWPを使うテーマ・プラグインのテストで使う支援コードです。開発用の依存として入れます。WordPressを起動しないユニットテスト(PHPUnit 11とBrain Monkey)の基底クラスと、メタ・オプションの保存先をメモリに差し替える実装を提供します。

動作環境

  • PHP 8.3〜8.5
  • tmswp/core ^0.10(composer.jsonのrequire)
  • PHPUnit ^11.5・Brain Monkey ^2.6・Mockery ^1.6・psr/log ^3.0を依存として持ちます。

導入

  1. composer require --dev tmswp/testingを実行します。require(本番の依存)には入れません。
  2. phpunit.xml.dist(bootstrapはtests/bootstrap.php、testsuiteはtests/Unit)と、Composerのオートローダを読むだけのtests/bootstrap.phpを置きます。スターターから作ったテーマ・プラグインには既にあります。
  3. テストのクラスはTMSWP\Testing\UnitTestCaseを継承します。

tmswp/testingはKernelの拡張ではないため、tmswp-kernel.phpのKernelConfigには登録しません。テストの中でKernelをbootするときだけ、StorageExtensionをそのテストのKernelConfigのextensionsに渡します。

use TMSWP\Core\Kernel\Kernel;
use TMSWP\Core\Kernel\KernelConfig;
use TMSWP\Testing\MemoryMetaStorage;
use TMSWP\Testing\MemoryOptionStorage;
use TMSWP\Testing\StorageExtension;
use TMSWP\Testing\UnitTestCase;

final class NewsletterOptionTest extends UnitTestCase
{
    protected function setUp(): void
    {
        parent::setUp();
        $GLOBALS['wp_version'] = '7.0';
        $GLOBALS['wp_actions'] = [];
        Kernel::boot(KernelConfig::theme(
            \dirname(__DIR__, 3) . '/app',
            'App',
            debug: true,
            extensions: [new StorageExtension(new MemoryMetaStorage(), new MemoryOptionStorage())],
        ));
    }

    protected function tearDown(): void
    {
        Kernel::reset();
        unset($GLOBALS['wp_version'], $GLOBALS['wp_actions']);
        parent::tearDown();
    }
}

完全な例(phpunit.xml.dist・tests/bootstrap.php・Brain Monkeyで関数を差し替えるテスト・オプショングループのテスト)は、レシピvendor/tmswp/testing/rules/testing.mdにあります。

提供するもの

名前 役割
UnitTestCase ユニットテストの基底。Brain MonkeyとMockeryの検証を全テストに保証し、翻訳関数をソースの文字列を返すスタブにする。createTempDirectory()と、別のPHPのプロセスに渡すcomposerAutoloadFile()を持つ
UsesTempDirectories テストごとの一時ディレクトリを、テストごとに専用の親ディレクトリの下に作り、テストの後に親ディレクトリごと消す
MemoryMetaStorage・MemoryOptionStorage・StorageExtension メタ・オプションの保存先をメモリに差し替える
RecordingLogger 書かれたログを記録するPSR-3のロガー
WpdbTestDouble ユニット層用のwpdbの代役。実行したSQLを記録し、読み取りの結果と、書き込みが影響する行の数・作る行のIDをキューから返す。戻り値と状態(rows_affected・insert_id・last_error)は実際のwpdbと同じ意味にし、代役が対応しない形のSQLと、影響する行の数・IDを入れていない書き込みは例外にする。トランザクションの文(START TRANSACTION・COMMIT・ROLLBACK・SET SESSION innodb_lock_wait_timeout)を受け付け、実行中かどうかとロック待ちの秒数を持つ(ロールバックの効果・ロックの競合・デッドロックは再現しない)。upsert(INSERT … ON DUPLICATE KEY UPDATE)はINSERTとして扱い、影響する行の数が0(変化なし)ならinsert_idを0にする
MetaStorageContract MetaStorageInterfaceの実装が契約を満たすかを確かめるテストの共通部分(データベースに依存しない部分)
WpCliPharDeprecations TMSWPのmonorepoの統合テストで、本物のWP-CLIのプロセスの標準エラーから、WP-CLIのphar自身が出したPHPの非推奨の行(WP-CLI 2.12.0がPHP 8.5で出すもの)だけを取り除く
RealTables WordPressのテストライブラリ(WP_UnitTestCase)の統合テストで、CREATE TABLEの一時テーブルへの書き換えを外して実際のテーブルを作り、テストの後に、start()で宣言したテーブル(接頭辞を除いた名前)のうち、その時点に無かったものだけを名前で消す。DB全体の差分は使わないため、ほかの接続が作ったテーブルと宣言していないテーブルは消さない。MySQLのSHOW TABLESは一時テーブルを返さないため、MySQLでMigratorを使うテストに要る。DDLは暗黙にコミットするので、DDLより前に書いた行はonTearDown()で消す
IntegrationTestCase・MetaStorageContractTestCase・BootsKernelBeforeInit TMSWPのmonorepoの統合テストの基盤(IntegrationTestCase::useRealTables()はRealTablesをそのテストで使う)。monorepoのtests/bootstrap-integration.phpがfixtureのテーマ・プラグイン(tests/fixtures/)を有効にして起動したWordPressの上で動く。利用側のプロジェクトのテストでは使わない

IntegrationTestCase・MetaStorageContractTestCase・BootsKernelBeforeInitが使うWordPressのテストライブラリ(WP_UnitTestCaseと、それが使うPHPUnit 9.6)は、依存に含みません。

レシピ

  • ユニットテストを書く(PHPUnitの設定・bootstrap・Brain Monkey・Kernelをbootするテスト)と、MySQLでMigratorを使う統合テスト(RealTables): vendor/tmswp/testing/rules/testing.md
  • オプション・メタのテスト: vendor/tmswp/core/rules/options.md・vendor/tmswp/core/rules/meta.mdの「テスト」

テストの層の設計は、TMSWPのmonorepo(tmstack-io/tmswp)のdocs/10-quality.mdの「テスト構成(PHPUnit 2 層)」の節にあります。

開発

このパッケージはtmstack-io/tmswpのmonorepoで開発しています。単独で取り出したときは、composer install && composer testでユニットテストを実行できます。

ライセンス

GPL-2.0-or-later(LICENSE)