此套裝組合提供的功能可協助您透過隔離測試更有效地執行基於 Symfony 框架的應用程式的測試套件。
它提供了一個StaticDriver
,它將包裝您最初配置的Driver
類別(如DBALDriverPDOMysqlDriver
)並在目前 php 進程中靜態保持資料庫連接。
在 PHPUnit 擴充類別的幫助下,它將在每個測試案例之前開始一個事務,並在所有配置的 DBAL 連接的測試完成後再次回滾。這會導致效能提升,因為無需重建架構、匯入備份 SQL 轉儲或在每個測試案例之前重新插入固定裝置。只要您避免發出可能導致隱性交易提交的 DDL 查詢(例如ALTER TABLE
、 DROP TABLE
等;請參閱https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis),您的測試將被隔離,並且所有測試都會看到相同的資料庫狀態。
它還包括一個Psr6StaticArrayCache
,它將自動配置為所有 EntityManager 的元資料和查詢快取。這極大地提高了我的測試套件的速度和記憶體使用率!如果您有大量啟動核心的測試(例如 Controller 測試或 ContainerAware 測試)並使用 Doctrine 實體,這尤其有用。
透過作曲家安裝
作曲家要求 --dev dama/doctrine-test-bundle
如果您不使用 Flex,請透過將類別新增至bundles.php 來啟用捆綁包
<?php// config/bundles.phpreturn [//...DAMADoctrineTestBundleDAMADoctrineTestBundle::class => ['test' => true],//...];
從版本 8 開始,僅當使用 DBAL < 4 時,您需要確保在所有相關連線的 DBAL 設定上啟用use_savepoints
:
學說: dbal:連接:預設:use_savepoints:true
將擴充功能新增至您的 PHPUnit XML 配置
PHP 單元 8 或 9:
<php單元> … <副檔名> <extension class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </擴展名> </phpunit>
PHPUnit 10+:
<php單元> … <副檔名> <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
表示它將為所有配置的dbal連線啟用它。
如果需要,您可以選擇性地僅對某些連接啟用它:
dama_doctrine_test:enable_static_connection:connection_a:true
預設情況下,每個配置的 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:# 分配不同的鍵將導致單獨的內部驅動程式連接用於主要和副本預設:主:custom_key_primaryreplicas:replica_one:custom_key_replica
可以在該捆綁包中包含的功能測試中看到範例用法: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() {// ...改變資料庫狀態的東西DAMADoctrineTestBundleDoctrineDBALStaticDriver::commit(); die;// 現在資料庫變更實際上已保留,您可以調試它們}
如果您在測試期間執行(可能不知道)隱含提交任何開放事務的查詢(例如,請參閱 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