该捆绑包提供的功能可帮助您通过隔离测试更有效地运行基于 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