Este pacote fornece recursos que ajudam você a executar o conjunto de testes do seu aplicativo baseado na estrutura Symfony de maneira mais eficiente com testes isolados.
Ele fornece um StaticDriver
que agrupará sua classe Driver
configurada originalmente (como DBALDriverPDOMysqlDriver
) e manterá uma conexão de banco de dados estaticamente no processo php atual.
Com a ajuda de uma classe de extensão PHPUnit, ele iniciará uma transação antes de cada caso de teste e a reverterá novamente após o término do teste para todas as conexões DBAL configuradas. Isso resulta em um aumento de desempenho, pois não há necessidade de reconstruir o esquema, importar um dump SQL de backup ou reinserir fixtures antes de cada caso de teste. Contanto que você evite emitir consultas DDL que possam resultar em confirmações de transação implícitas (como ALTER TABLE
, DROP TABLE
etc; consulte https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis) seus testes serão isolados e todos verão o mesmo estado do banco de dados.
Ele também inclui um Psr6StaticArrayCache
que será configurado automaticamente como metadados e cache de consulta para todos os EntityManagers. Isso melhorou drasticamente a velocidade e o uso de memória dos meus testes! Isso é especialmente benéfico se você tiver muitos testes que inicializam kernels (como testes de Controller ou testes de ContainerAware) e usam entidades Doctrine.
instalar via compositor
compositor requer --dev dama/doctrine-test-bundle
Se você não estiver usando Flex, habilite o pacote adicionando a classe em bundles.php
<?php// config/bundles.phpreturn [//...DAMADoctrineTestBundleDAMADoctrineTestBundle::class => ['test' => true],//...];
A partir da versão 8 e somente ao usar DBAL < 4 você precisa ter certeza de ter use_savepoints
habilitado em sua configuração DBAL de doutrina para todas as conexões relevantes:
doutrina: dbal: conexões: padrão: use_savepoints: true
Adicione a extensão à configuração XML do PHPUnit
PHPUnit 8 ou 9:
<phpunit> ... <extensões> <extension class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </extensões> </phpunit>
PHPUnit 10+:
<phpunit> ... <extensões> <bootstrap class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </extensões> </phpunit>
Certifique-se de ter phpunit/phpunit
disponível como uma dependência dev
( as versões 8, 9 e 10 são suportadas com a extensão integrada ) para executar seus testes. Alternativamente, este pacote também é compatível com symfony/phpunit-bridge
e seu script simple-phpunit
. (Nota: você pode precisar ter certeza de que o phpunit-bridge requer a versão correta do PHPUnit 8+ usando a variável de ambiente SYMFONY_PHPUNIT_VERSION
).
É isso! De agora em diante, quaisquer alterações que você fizer no banco de dados em cada caso de teste (seja um WebTestCase
ou um KernelTestCase
ou qualquer teste personalizado) serão automaticamente revertidas para você
Habilite a extensão em sua configuração do Behat (por exemplo, behat.yml
)
padrão: # ... extensões: DAMADoctrineTestBundleBehatServiceContainerDoctrineExtension: ~
É isso! De agora em diante, quaisquer alterações feitas no banco de dados em cada cenário serão revertidas automaticamente para você.
Observe que isso só funciona se os testes forem executados no mesmo processo do Behat. Isso significa que não pode funcionar ao usar, por exemplo, Selenium para chamar seu aplicativo.
O pacote expõe uma configuração semelhante a esta por padrão:
dama_doctrine_test:enable_static_connection: trueenable_static_meta_data_cache: trueenable_static_query_cache: verdadeiro
Definir enable_static_connection: true
significa que irá habilitá-lo para todas as conexões dbal de doutrina configuradas.
Você pode habilitá-lo seletivamente apenas para algumas conexões, se necessário:
dama_doctrine_test:enable_static_connection:connection_a: verdadeiro
Por padrão, cada conexão DBAL de doutrina configurada terá sua própria conexão de driver que é gerenciada no processo php atual. Caso você precise personalizar este comportamento você pode escolher diferentes "chaves de conexão" que são usadas para selecionar as conexões do driver.
Exemplo para 2 conexões que reutilizarão a mesma instância de conexão do driver:
doutrina:dbal:connections:default:url: '%database.url1%'foo:url: '%database.url2%'dama_doctrine_test:connection_keys:# atribuir a mesma chave resultará na reutilização da mesma conexão do driver interno para ambas as conexões DBAL padrão: custom_keyfoo: custom_key
Desde a v8.1.0 : Para conexões com réplicas de leitura/gravação, o pacote usará a mesma conexão de driver subjacente por padrão para o primário e também para réplicas. Isso resolve um problema em que ocorriam inconsistências ao ler/gravar em conexões diferentes. Isso também pode ser personalizado da seguinte forma:
doutrina:dbal:connections:default:url: '%database.url%'replicas:replica_one:url: '%database.url_replica%'dama_doctrine_test:connection_keys:# atribuir chaves diferentes resultará em conexões de driver internas separadas sendo usadas para primário e replicadefault:primary: custom_key_primaryreplicas:replica_one: custom_key_replica
Um exemplo de uso pode ser visto nos testes funcionais incluídos neste pacote: https://github.com/dmaicher/doctrine-test-bundle/tree/master/tests
A inicialização inicial do banco de dados é feita usando o arquivo de inicialização PHPUnit: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/bootstrap.php
vários testes que garantem que quaisquer alterações dos testes anteriores sejam revertidas: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/Functional/PhpunitTest.php
Este pacote também é usado no testsuite oficial do Symfony Demo: https://github.com/symfony/demo
Às vezes pode ser útil poder depurar o conteúdo do banco de dados quando um teste falha. Como normalmente todas as alterações são revertidas automaticamente, você pode fazer isso manualmente:
função pública testMyTestCaseThatINeedToDebug() {// ... algo que altera o banco de dados stateDAMADoctrineTestBundleDoctrineDBALStaticDriver::commit(); die;// agora as alterações do banco de dados são realmente persistidas e você pode depurá-las}
Caso você esteja executando (talvez sem saber) consultas durante seus testes que estão comprometendo implicitamente qualquer transação aberta (veja https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html por exemplo) você pode ver um erro como este:
DoctrineDBALDriverPDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT DOCTRINE2_SAVEPOINT_2 does not exist
Atualmente não há como esse pacote funcionar com essas consultas, pois elas simplesmente não podem ser revertidas após a conclusão do caso de teste.
Veja também #58