大码 / doctrine-test-bundle
Symfony扩展包,用于隔离Doctrine数据库测试并提高测试性能
Requires
- php: ^7.4 || ^8.0
- doctrine/dbal: ^3.3 || ^4.0
- doctrine/doctrine-bundle: ^2.11.0
- psr/cache: ^1.0 || ^2.0 || ^3.0
- symfony/cache: ^5.4 || ^6.3 || ^7.0
- symfony/framework-bundle: ^5.4 || ^6.3 || ^7.0
Requires (Dev)
- behat/behat: ^3.0
- friendsofphp/php-cs-fixer: ^3.27
- phpstan/phpstan: ^1.2
- phpunit/phpunit: ^8.0 || ^9.0 || ^10.0 || ^11.0
- symfony/phpunit-bridge: ^6.3
- symfony/process: ^5.4 || ^6.3 || ^7.0
- symfony/yaml: ^5.4 || ^6.3 || ^7.0
- dev-master / 8.x-dev
- v8.2.0
- v8.1.0
- v8.0.2
- v8.0.1
- v8.0.0
- v8.0.0-BETA8
- v8.0.0-BETA7
- v8.0.0-BETA6
- v8.0.0-BETA5
- v8.0.0-BETA4
- v8.0.0-BETA3
- v8.0.0-BETA2
- v8.0.0-BETA1
- 7.x-dev
- v7.3.0
- v7.2.1
- v7.2.0
- v7.1.1
- v7.1.0
- v7.0.0
- v6.7.5
- v6.7.4
- v6.7.3
- v6.7.2
- v6.7.1
- v6.7.0
- v6.6.0
- v6.5.0
- v6.4.0
- v6.3.3
- v6.3.2
- v6.3.1
- v6.3.0
- v6.2.1
- v6.2.0
- v6.1.0
- v6.0.0
- 5.x-dev
- v5.0.5
- v5.0.4
- v5.0.3
- v5.0.2
- v5.0.1
- v5.0.0
- v4.0.2
- v4.0.1
- v4.0.0
- v3.2.0
- v3.1.0
- v3.0.0
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- 1.x-dev
- v1.0.13
- v1.0.12
- v1.0.10
- v1.0.9
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- dev-connection_key
This package is auto-updated.
Last update: 2024-08-28 16:21:52 UTC
README
它做什么?😊
此扩展包提供功能,帮助您更高效地运行基于Symfony框架的应用程序的测试套件,并进行隔离测试。
它提供了一个StaticDriver
,将包装您最初配置的Driver
类(如DBAL\Driver\PDOMysql\Driver
),并在当前PHP进程中静态地保持数据库连接。
借助PHPUnit扩展类,它将在每个测试用例之前开始一个事务,并在所有配置的DBAL连接在测试完成后回滚。这提高了性能,因为不需要在每次测试用例之前重建模式、导入备份SQL文件或重新插入固定数据。只要您避免发出可能导致隐式事务提交的DDL查询(如ALTER TABLE
、DROP TABLE
等;请参阅https://wiki.postgresql.ac.cn/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis),您的测试将保持隔离,并且所有测试都将看到相同的数据库状态。
它还包括一个Psr6StaticArrayCache
,它将被自动配置为所有EntityManagers的元数据和查询缓存。这显著提高了测试套件的速度和内存使用率!这对于拥有大量启动内核(如控制器测试或容器感知测试)并使用Doctrine实体的测试特别有益。
如何安装和使用此扩展包?
- 通过composer安装
composer require --dev dama/doctrine-test-bundle
- 如果您不使用Flex,通过将类添加到bundles.php中启用扩展包
<?php // config/bundles.php return [ //... DAMA\DoctrineTestBundle\DAMADoctrineTestBundle::class => ['test' => true], //... ];
- 从版本8开始,并且仅当使用DBAL < 4时,您需要确保在所有相关连接上启用了doctrine DBAL配置的
use_savepoints
。
doctrine: dbal: connections: default: use_savepoints: true
使用PHPUnit与扩展包一起使用
-
将扩展添加到您的PHPUnit XML配置中
-
PHPUnit 8或9
<phpunit> ... <extensions> <extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension" /> </extensions> </phpunit>
-
PHPUnit 10+
<phpunit> ... <extensions> <bootstrap class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension" /> </extensions> </phpunit>
-
-
请确保您还有
phpunit/phpunit
作为dev
依赖项可用(版本8、9和10支持内置扩展)以运行您的测试。或者,此扩展包也与symfony/phpunit-bridge
及其simple-phpunit
脚本兼容。(注意:您可能需要确保phpunit-bridge使用环境变量SYMFONY_PHPUNIT_VERSION
要求正确的PHPUnit 8+版本)。 -
就这样!从现在起,您对每个单独测试用例数据库所做的任何更改(无论是
WebTestCase
还是KernelTestCase
或任何自定义测试)都将自动为您回滚。
使用Behat与扩展包一起使用
在Behat配置(例如behat.yml
)中启用扩展
default: # ... extensions: DAMA\DoctrineTestBundle\Behat\ServiceContainer\DoctrineExtension: ~
就这样!从现在起,您在每个场景中对数据库所做的任何更改都将自动为您回滚。
请注意,这仅在测试与Behat在同一个进程中执行时才有效。这意味着在使用例如Selenium调用您的应用程序时无法工作。
配置
该扩展包默认公开的配置如下所示
dama_doctrine_test: enable_static_connection: true enable_static_meta_data_cache: true enable_static_query_cache: true
将enable_static_connection: true
设置为true意味着它将为所有配置的doctrine dbal连接启用。
如果需要,您可以有选择地仅对某些连接启用它
dama_doctrine_test: enable_static_connection: connection_a: true
控制如何在当前PHP进程中静态保持连接
默认情况下,每个配置的 doctrine DBAL 连接都将拥有自己的驱动连接,这些连接在当前 PHP 进程中管理。如果您需要自定义此行为,可以选择不同的“连接键”,用于选择驱动连接。
以下是一个示例,展示两个将重用相同驱动连接实例的连接。
doctrine: dbal: connections: default: url: '%database.url1%' foo: url: '%database.url2%' dama_doctrine_test: connection_keys: # assigning the same key will result in the same internal driver connection being re-used for both DBAL connections default: custom_key foo: custom_key
自 v8.1.0 开始:对于具有读/写副本的连接,默认情况下,该包将为主连接和副本使用相同的底层驱动连接。这解决了问题,当对不同的连接进行读写操作时,可能会出现不一致的情况。这也可以按照以下方式进行自定义
doctrine: dbal: connections: default: url: '%database.url%' replicas: replica_one: url: '%database.url_replica%' dama_doctrine_test: connection_keys: # assigning different keys will result in separate internal driver connections being used for primary and replica default: primary: custom_key_primary replicas: 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 Demo 测试套件:https://github.com/symfony/demo
调试
有时在测试失败时能够调试数据库内容可能很有用。由于通常所有更改都会自动回滚,您可以手动进行此操作。
public function testMyTestCaseThatINeedToDebug() { // ... something thats changes the DB state \DAMA\DoctrineTestBundle\Doctrine\DBAL\StaticDriver::commit(); die; // now the DB changes are actually persisted and you can debug them }
故障排除
如果您在测试期间运行(可能没有意识到)隐式提交任何打开事务的查询(例如,请参阅https://dev.mysqlserver.cn/doc/refman/8.0/en/implicit-commit.html),您可能会看到如下错误
Doctrine\DBAL\Driver\PDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT DOCTRINE2_SAVEPOINT_2 does not exist
目前此包无法与这些查询一起工作,因为测试用例结束后,它们无法被回滚。
另请参阅#58