Este paquete proporciona funciones que te ayudarán a ejecutar el conjunto de pruebas de tu aplicación basada en el marco Symfony de manera más eficiente con pruebas aisladas.
Proporciona un StaticDriver
que envolverá su clase Driver
configurada originalmente (como DBALDriverPDOMysqlDriver
) y mantiene estáticamente una conexión de base de datos en el proceso php actual.
Con la ayuda de una clase de extensión PHPUnit, comenzará una transacción antes de cada caso de prueba y la revertirá una vez finalizada la prueba para todas las conexiones DBAL configuradas. Esto da como resultado un aumento del rendimiento, ya que no es necesario reconstruir el esquema, importar un volcado de SQL de respaldo o volver a insertar accesorios antes de cada caso de prueba. Siempre que evite emitir consultas DDL que puedan resultar en confirmaciones de transacciones implícitas (como ALTER TABLE
, DROP TABLE
etc.; consulte https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis), sus pruebas estarán aisladas y todas verán el mismo estado de la base de datos.
También incluye un Psr6StaticArrayCache
que se configurará automáticamente como metadatos y caché de consultas para todos los EntityManagers. ¡Esto mejoró drásticamente la velocidad y el uso de memoria de mis conjuntos de pruebas! Esto es especialmente beneficioso si tiene muchas pruebas que arrancan núcleos (como pruebas de controlador o pruebas de ContainerAware) y utilizan entidades de Doctrine.
instalar a través del compositor
compositor requiere --dev dama/doctrine-test-bundle
Si no está utilizando Flex, habilite el paquete agregando la clase a bundles.php
<?php// config/bundles.phpreturn [//...DAMADoctrineTestBundleDAMADoctrineTestBundle::class => ['test' => true],//...];
A partir de la versión 8 y solo cuando use DBAL < 4, debe asegurarse de tener use_savepoints
habilitados en la configuración DBAL de su doctrina para todas las conexiones relevantes:
doctrina: dbal: conexiones: predeterminado: use_savepoints: verdadero
Agregue la extensión a su configuración XML de PHPUnit
PHPUnidad 8 o 9:
<unidad php> ... <extensiones> <extensión class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </extensiones> </phpunidad>
Unidad PHP 10+:
<unidad php> ... <extensiones> <bootstrap class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </extensiones> </phpunidad>
Asegúrese de tener también phpunit/phpunit
disponible como dependencia dev
( las versiones 8, 9 y 10 son compatibles con la extensión incorporada ) para ejecutar sus pruebas. Alternativamente, este paquete también es compatible con symfony/phpunit-bridge
y su script simple-phpunit
. (Nota: es posible que deba asegurarse de que phpunit-bridge requiera la versión PHPUnit 8+ correcta utilizando la variable de entorno SYMFONY_PHPUNIT_VERSION
).
¡Eso es todo! De ahora en adelante, cualquier cambio que realice en la base de datos dentro de cada caso de prueba (ya sea un WebTestCase
o un KernelTestCase
o cualquier prueba personalizada) se revertirá automáticamente.
Habilite la extensión en su configuración de Behat (por ejemplo, behat.yml
)
por defecto: # ... extensiones: DAMADoctrineTestBundleBehatServiceContainerDoctrineExtension: ~
¡Eso es todo! De ahora en adelante, cualquier cambio que realice en la base de datos dentro de cada escenario se revertirá automáticamente.
Tenga en cuenta que esto solo funciona si las pruebas se ejecutan en el mismo proceso que Behat. Esto significa que no puede funcionar cuando se utiliza, por ejemplo, Selenium para llamar a su aplicación.
El paquete expone una configuración que se parece a esta de forma predeterminada:
dama_doctrine_test:enable_static_connection: verdaderoenable_static_meta_data_cache: verdaderoenable_static_query_cache: verdadero
Configurar enable_static_connection: true
significa que lo habilitará para todas las conexiones dbal de doctrina configuradas.
Solo puede habilitarlo selectivamente para algunas conexiones si es necesario:
dama_doctrine_test:enable_static_connection:connection_a: verdadero
De forma predeterminada, cada conexión DBAL de doctrina configurada tendrá su propia conexión de controlador que se administra en el proceso php actual. En caso de que necesite personalizar este comportamiento, puede elegir diferentes "claves de conexión" que se utilizan para seleccionar las conexiones del controlador.
Ejemplo de 2 conexiones que reutilizarán la misma instancia de conexión del controlador:
doctrina:dbal:connections:default:url: '%database.url1%'foo:url: '%database.url2%'dama_doctrine_test:connection_keys:# asignar la misma clave dará como resultado que se reutilice la misma conexión de controlador interno para ambas conexiones DBALpredeterminado: custom_keyfoo: custom_key
Desde v8.1.0 : para conexiones con réplicas de lectura/escritura, el paquete utilizará la misma conexión de controlador subyacente de forma predeterminada para el primario y también para las réplicas. Esto soluciona un problema por el cual se producían inconsistencias al leer/escribir en diferentes conexiones. Esto también se puede personalizar de la siguiente manera:
doctrina:dbal:connections:default:url: '%database.url%'replicas:replica_one:url: '%database.url_replica%'dama_doctrine_test:connection_keys:# la asignación de diferentes claves dará como resultado que se utilicen conexiones de controladores internas separadas para los controladores primario y replicadefault:primary: custom_key_primaryreplicas:replica_one: custom_key_replica
Se puede ver un ejemplo de uso en las pruebas funcionales incluidas en este paquete: https://github.com/dmaicher/doctrine-test-bundle/tree/master/tests
El arranque inicial de la base de datos se realiza utilizando el archivo de arranque PHPUnit: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/bootstrap.php
varias pruebas que garantizan que se reviertan los cambios de las pruebas anteriores: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/Functional/PhpunitTest.php
Este paquete también se utiliza en el conjunto de pruebas de demostración oficial de Symfony: https://github.com/symfony/demo
A veces puede resultar útil poder depurar el contenido de la base de datos cuando falla una prueba. Como normalmente todos los cambios se revierten automáticamente, puedes hacerlo manualmente:
función pública testMyTestCaseThatINeedToDebug() {//... algo que cambia el estado de la base de datosDAMADoctrineTestBundleDoctrineDBALStaticDriver::commit(); die;// ahora los cambios de la base de datos persisten y puedes depurarlos}
En caso de que esté ejecutando (tal vez sin saberlo) consultas durante sus pruebas que implícitamente confirman cualquier transacción abierta (consulte https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html por ejemplo) es posible que veas un error como este:
DoctrineDBALDriverPDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT DOCTRINE2_SAVEPOINT_2 does not exist
Actualmente, no hay forma de que este paquete funcione con esas consultas, ya que simplemente no se pueden revertir una vez finalizado el caso de prueba.
Véase también el n.º 58