このバンドルは、Symfony フレームワークベースのアプリのテストスイートを分離されたテストでより効率的に実行するのに役立つ機能を提供します。
これは、最初に構成されたDriver
クラス ( DBALDriverPDOMysqlDriver
など) をラップし、現在の PHP プロセスでデータベース接続を静的に維持するStaticDriver
を提供します。
PHPUnit 拡張クラスの助けを借りて、すべてのテストケースの前にトランザクションを開始し、構成されているすべての DBAL 接続のテストが終了した後にトランザクションを再度ロールバックします。これにより、各テストケースの前にスキーマを再構築したり、バックアップ SQL ダンプをインポートしたり、フィクスチャを再挿入したりする必要がなくなるため、パフォーマンスが向上します。暗黙的なトランザクション コミット ( ALTER TABLE
、 DROP TABLE
など、 https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Anaracy を参照) を引き起こす可能性のある DDL クエリの発行を回避している限り、テストは分離され、すべてのテストが表示されます。同じデータベース状態。
また、すべての EntityManager のメタ データおよびクエリ キャッシュとして自動的に構成されるPsr6StaticArrayCache
も含まれています。これにより、テストスイートの速度とメモリ使用量が劇的に改善されました。これは、カーネルを起動するテスト (Controller テストや ContainerAware テストなど) が多数あり、Doctrine エンティティを使用する場合に特に有益です。
Composer 経由でインストールする
作曲家には --dev dama/doctrine-test-bundle が必要です
Flex を使用していない場合は、クラスを Bundles.php に追加してバンドルを有効にします。
<?php// config/bundles.phpreturn [//...DAMADoctrineTestBundleDAMADoctrineTestBundle::class => ['test' => true],//...];
バージョン 8 以降、DBAL < 4 を使用する場合にのみ、関連するすべての接続に対して Doctrine DBAL 構成でuse_savepoints
有効になっていることを確認する必要があります。
ドクトリン: dbal: 接続: デフォルト: use_savepoints: true
PHPUnit XML 構成に拡張機能を追加します。
PHPUユニット8または9:
<phpunit> ... <拡張機能> <extension class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </拡張機能> </phpunit>
PHPUnit 10+:
<phpunit> ... <拡張機能> <bootstrap class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </拡張機能> </phpunit>
テストを実行するには、 phpunit/phpunit
dev
依存関係として利用可能であることも確認してください (バージョン 8、9、および 10 は組み込み拡張機能でサポートされています)。あるいは、このバンドルはsymfony/phpunit-bridge
およびそのsimple-phpunit
スクリプトとも互換性があります。 (注: 環境変数SYMFONY_PHPUNIT_VERSION
を使用して、phpunit-bridge が正しい PHPUnit 8+ バージョンを必要とすることを確認する必要がある場合があります)。
それでおしまい!今後は、各単一テストケース ( WebTestCase
、 KernelTestCase
、または任意のカスタム テスト) 内でデータベースに加えた変更はすべて自動的にロールバックされます。
Behat 設定で拡張機能を有効にします (例: behat.yml
)
デフォルト: # ... 拡張機能: DAMADoctrineTestBundleBehatServiceContainerDoctrineExtension: ~
それでおしまい!今後、各シナリオ内でデータベースに加えた変更はすべて自動的にロールバックされます。
これは、テストが Behat と同じプロセスで実行される場合にのみ機能することに注意してください。これは、Selenium を使用してアプリケーションを呼び出す場合には機能しないことを意味します。
バンドルは、デフォルトで次のような構成を公開します。
dama_doctrine_test:enable_static_connection: trueenable_static_meta_data_cache: trueenable_static_query_cache: true
enable_static_connection: true
を設定すると、設定されたすべての Doctrine dbal 接続に対して有効になります。
必要に応じて、一部の接続に対してのみ選択的に有効にすることができます。
dama_doctrine_test:enable_static_connection:connection_a: true
デフォルトでは、設定されたすべての Doctrine DBAL 接続には、現在の PHP プロセスで管理される独自のドライバー接続があります。この動作をカスタマイズする必要がある場合は、ドライバー接続の選択に使用される別の「接続キー」を選択できます。
同じドライバー接続インスタンスを再利用する 2 つの接続の例:
doctrine:dbal:connections:default:url: '%database.url1%'foo:url: '%database.url2%'dama_doctrine_test:connection_keys:# 同じキーを割り当てると、同じ内部ドライバ接続が再利用されます。両方の DBAL 接続デフォルト:custom_keyfoo:custom_key
v8.1.0 以降: 読み取り/書き込みレプリカとの接続の場合、バンドルはデフォルトでプライマリとレプリカに対して同じ基礎となるドライバー接続を使用します。これにより、異なる接続への読み取り/書き込み時に不一致が発生する問題が解決されました。これは次のようにカスタマイズすることもできます。
doctrine:dbal:connections:default:url: '%database.url%'replicas:replica_one:url: '%database.url_replica%'dama_doctrine_test:connection_keys:# 異なるキーを割り当てると、プライマリとプライマリに別々の内部ドライバ接続が使用されることになります。レプリカデフォルト:プライマリ: カスタムキー_プライマリレプリカ: レプリカ_ワン: カスタムキー_レプリカ
使用例は、このバンドルに含まれる機能テスト内で確認できます: https://github.com/dmaicher/doctrine-test-bundle/tree/master/tests
データベースの初期ブートストラップは、PHPUnit ブートストラップ ファイルを使用して行われます: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/bootstrap.php
以前のテストからの変更がロールバックされていることを確認するいくつかのテスト: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/Functional/PhpunitTest.php
このバンドルは、公式 Symfony デモ テストスイートでも使用されます: https://github.com/symfony/demo
テストが失敗したときにデータベースの内容をデバッグできると便利な場合があります。通常、すべての変更は自動的にロールバックされますが、これを手動で行うこともできます。
パブリック関数 testMyTestCaseThatINeedToDebug() {// ... DB の状態を変更するものDAMADoctrineTestBundleDoctrineDBALStaticDriver::commit(); die;// DB の変更が実際に永続化され、デバッグできるようになりました}
開いているトランザクションを暗黙的にコミットするテスト中に (おそらく気づかずに) クエリを実行している場合 (たとえば、https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html を参照)次のようなエラーが表示される場合があります。
DoctrineDBALDriverPDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT DOCTRINE2_SAVEPOINT_2 does not exist
現時点では、テスト ケースの終了後にクエリをロールバックできないため、このバンドルがこれらのクエリを処理する方法はありません。
#58も参照