ucmitz では、CakePHPのテストの仕組み を使用してユニットテストを作成します。
ユニットテストを実行する際はユニットテスト用のセキュリティトークンを有効にするためDEBUGモードを有効にして実行する必要があります。
フィクスチャファクトリー導入により、テスト開始時にプラグインも含めて全てのスキーマを生成する。
プラグインが追加になった場合は、スキーマ生成処理を tests/bootstrap.php
に記入する。
なお、スキーマの生成処理の際、default 接続側に対象のテーブルが存在しないと生成に失敗するため、コアプラグインは、初期化処理にて、スキーマを生成しておく必要がある。
(2022/09/30時点では、docker/init.sh
)
フィクスチャマネージャーによるデータ生成もまだ存在するが、フィクスチャーファクトリーに全て移行予定。
BaserCore以外の各プラグインのテストにおけるプラグインの有効化状態は、シナリオなどを用いて独自実装する。(pluginsテーブルでの有効化状態)
事前にコンテナにログインし Composer で、PHPUnit などをインストールしておく必要があります。
composer install
/plugins/baser-core/tests/[Type]
ディレクトリ
[type]
は、 TestCase
か、Fixture
となります。
ファイル名の最後を Test.php
とします。
クラス名もファイル名と同じにします。(もちろん、拡張子を除く)
BaserCore\TestSuite\BcTestCase
クラスを継承します。
以前は、BaserTestCase
でしたが、BcTestCase
にクラス名が変更となりました。
テストを含むメソッドは、先頭を test
とします。
// (例)BcTestHelper の hoge メソッド
// /plugins/baser-core/tests/TestCase/View/Helper/BcTestHelperTest.php
class BcTestHelperTest extends BaserCore\TestSuite\BcTestCase {
public function testHoge() {
}
}
プライベートメソッドに対するテストはパブリックメソッド経由で行うものとします。
ただ、パブリックメソッドで担保できない場合はプライベートメソッドのテストを書くことを推奨します。
テストを実行するには、事前にコンテナにログインし次のコマンドを実行します。
vendor/bin/phpunit
vendor/bin/phpunit plugins/baser-core/tests/TestCase/Model/Table/ArticlesTableTest.php
vendor/bin/phpunit plugins/baser-core/tests/TestCase/Model/Table/ArticlesTableTest.php --filter testSave
vendor/bin/phpunit plugins/baser-core/tests/TestCase/Model/Table/ArticlesTableTest.php --filter '/::testSave\b/'
値を切り替えてテストを実行する場合は、 @dataProvider
アノテーションを利用してデータプロバイダーを定義します。
データプロバイダーのメソッド名は、原則、次の命名規則とし、データプロバイダーを利用するメソッドのすぐ下に配置し、コメントヘッダーは書きません。
public function {テスト対象のメソッド名}DataProvider()
{
}
※ テスト対象のメソッド名には、test
は含めません。
/phpunit.xml.dist
ファイルに、新しいプラグインの <testsuite>
セクションを追加することでプラグインのテストを一緒に実行することができます。
fixtures
プロパティを定義することでフィクスチャを利用することができます。
class UsersTableTest extends TestCase
{
protected $fixtures = ['plugin.BaserCore.Users'];
}
標準で使うフィクスチャは、Default フォルダに入っていましたが、ucmitz では、Fixture フォルダ直下に移動して利用します。
また、baserCMS4系のフィクスチャを移行するには次の変更を行ってください。
BaserTestFixture
から TextFixture
に変更import
プロパティを宣言class UsersFixture extends TestFixture
{
public $import = ['table' => 'users'];
}
class UsersTableTest extends TestCase
{
protected $fixtures = ['plugin.BaserCore.Users'];
// autoFixtures を false に設定する必要あり
protected $autoFixtures = false;
public funciton testMethod()
{
$this->loadFixtures('Users', 'etc...');
}
}
フィクスチャを利用する場合、tests/bootstrap.php
にて、マイグレーションの実行が必要となります。
本来であれば、プラグインディレクトリ配下の tests/bootstrap.php
にてマイグレーションの実行処理を記述すべきですが、そうするとテストの実行が面倒となるので、 CakePHP4.3のフィクスチャファクトリとプラグインのユニットテスト に記載しているとおり、
コアプラグインの場合は、アプリケーションルート直下の tests/bootstrap.php
に追記する事とします。
(new Migrator())->runMany([
['plugin' => 'BaserCore'],
['plugin' => 'BcBlog']
]);
テストで、DIコンテナを利用して、新しいプラグインのサービスを呼び出す場合、サービスプロバイダの定義が必要です。
BcTestCase::setUp() にて次のように定義します。
// 例
$container->addServiceProvider(new BcSearchIndexServiceProvider());