tmswp / testing
TMStack WordPress Framework - Testing support
Requires
- php: >=8.3
- brain/monkey: ^2.6
- mockery/mockery: ^1.6
- phpunit/phpunit: ^11.5
- psr/log: ^3.0
- tmswp/core: ^0.10
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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を依存として持ちます。
導入
composer require --dev tmswp/testingを実行します。require(本番の依存)には入れません。phpunit.xml.dist(bootstrapはtests/bootstrap.php、testsuiteはtests/Unit)と、Composerのオートローダを読むだけのtests/bootstrap.phpを置きます。スターターから作ったテーマ・プラグインには既にあります。- テストのクラスは
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)