大码/doctrine-test-bundle

Symfony扩展包,用于隔离Doctrine数据库测试并提高测试性能

安装次数: 22,682,610

依赖者: 119

建议者: 3

安全性: 0

星标: 1,076

关注者: 8

分支: 60

开放问题: 6

类型:symfony-bundle

v8.2.0 2024-05-28 15:41 UTC

README

PHP Version Stable release

它做什么?😊

此扩展包提供功能,帮助您更高效地运行基于Symfony框架的应用程序的测试套件,并进行隔离测试。

它提供了一个StaticDriver,将包装您最初配置的Driver类(如DBAL\Driver\PDOMysql\Driver),并在当前PHP进程中静态地保持数据库连接。

借助PHPUnit扩展类,它将在每个测试用例之前开始一个事务,并在所有配置的DBAL连接在测试完成后回滚。这提高了性能,因为不需要在每次测试用例之前重建模式、导入备份SQL文件或重新插入固定数据。只要您避免发出可能导致隐式事务提交的DDL查询(如ALTER TABLEDROP TABLE等;请参阅https://wiki.postgresql.ac.cn/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis),您的测试将保持隔离,并且所有测试都将看到相同的数据库状态。

它还包括一个Psr6StaticArrayCache,它将被自动配置为所有EntityManagers的元数据和查询缓存。这显著提高了测试套件的速度和内存使用率!这对于拥有大量启动内核(如控制器测试或容器感知测试)并使用Doctrine实体的测试特别有益。

如何安装和使用此扩展包?

  1. 通过composer安装
composer require --dev dama/doctrine-test-bundle
  1. 如果您不使用Flex,通过将类添加到bundles.php中启用扩展包
<?php
// config/bundles.php

return [
    //...
    DAMA\DoctrineTestBundle\DAMADoctrineTestBundle::class => ['test' => true],
    //...
];
  1. 从版本8开始,并且仅当使用DBAL < 4时,您需要确保在所有相关连接上启用了doctrine DBAL配置的use_savepoints
doctrine:
   dbal:
       connections:
           default:
               use_savepoints: true

使用PHPUnit与扩展包一起使用

  1. 将扩展添加到您的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>
  2. 请确保您还有phpunit/phpunit作为dev依赖项可用(版本8、9和10支持内置扩展)以运行您的测试。或者,此扩展包也与symfony/phpunit-bridge及其simple-phpunit脚本兼容。(注意:您可能需要确保phpunit-bridge使用环境变量SYMFONY_PHPUNIT_VERSION要求正确的PHPUnit 8+版本)。

  3. 就这样!从现在起,您对每个单独测试用例数据库所做的任何更改(无论是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

此包也被用于官方 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