Этот пакет предоставляет функции, которые помогут вам более эффективно запускать набор тестов вашего приложения на базе Symfony с помощью изолированных тестов.
Он предоставляет StaticDriver
, который будет обертывать ваш первоначально настроенный класс Driver
(например, DBALDriverPDOMysqlDriver
) и статически сохраняет соединение с базой данных в текущем процессе php.
С помощью класса расширения PHPUnit он будет начинать транзакцию перед каждым тестовым примером и откатывать ее снова после завершения теста для всех настроенных соединений DBAL. Это приводит к повышению производительности, поскольку нет необходимости перестраивать схему, импортировать резервный дамп SQL или повторно вставлять фикстуры перед каждым тестовым примером. Пока вы избегаете выполнения запросов DDL, которые могут привести к неявной фиксации транзакций (например, ALTER TABLE
, DROP TABLE
и т. д.; см. https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Anaанализ), ваши тесты будут изолированы, и все они будут видеть то же состояние базы данных.
Он также включает в себя Psr6StaticArrayCache
, который будет автоматически настроен как кэш метаданных и запросов для всех EntityManager. Это значительно улучшило скорость и использование памяти моими тестовыми наборами! Это особенно полезно, если у вас много тестов, которые загружают ядра (например, тесты контроллера или тесты 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
Добавьте расширение в вашу XML-конфигурацию PHPUnit.
PHPUnit 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
. (Примечание: вам может потребоваться убедиться, что для phpunit-bridge требуется правильная версия PHPUnit 8+, используя переменную среды SYMFONY_PHPUNIT_VERSION
).
Вот и все! С этого момента любые изменения, которые вы вносите в базу данных в каждом отдельном тестовом примере (будь то 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
означает, что он будет включен для всех настроенных подключений Doctor Dbal.
При необходимости вы можете выборочно включить его только для некоторых соединений:
dama_doctrine_test:enable_static_connection:connection_a: true
По умолчанию каждое настроенное соединение Doctor DBAL будет иметь собственное соединение драйвера, которое управляется текущим процессом php. Если вам необходимо настроить это поведение, вы можете выбрать разные «ключи подключения», которые будут использоваться для выбора подключений драйверов.
Пример для двух подключений, которые будут повторно использовать один и тот же экземпляр подключения драйвера:
Doctrine:dbal:connections:default:url: '%database.url1%'foo:url: '%database.url2%'dama_doctrine_test:connection_keys:# назначение того же ключа приведет к повторному использованию того же внутреннего соединения драйвера для оба соединения DBALdefault: custom_keyfoo: custom_key
Начиная с версии 8.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 Demo: 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.