이 번들은 격리된 테스트를 통해 Symfony 프레임워크 기반 앱의 테스트 모음을 보다 효율적으로 실행하는 데 도움이 되는 기능을 제공합니다.
이는 원래 구성된 Driver
클래스(예: DBALDriverPDOMysqlDriver
)를 래핑하고 현재 PHP 프로세스에서 데이터베이스 연결을 정적으로 유지하는 StaticDriver
를 제공합니다.
PHPUnit 확장 클래스의 도움으로 모든 테스트 케이스 전에 트랜잭션을 시작하고 구성된 모든 DBAL 연결에 대해 테스트가 완료된 후 다시 롤백합니다. 결과적으로 스키마를 재구축하거나, 백업 SQL 덤프를 가져오거나, 모든 테스트 케이스 전에 픽스처를 다시 삽입할 필요가 없으므로 성능이 향상됩니다. 암시적 트랜잭션 커밋(예: ALTER TABLE
, DROP TABLE
등, https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analytic 참조)을 초래할 수 있는 DDL 쿼리 실행을 피하는 한 테스트는 격리되고 모두 동일한 데이터베이스 상태.
또한 모든 EntityManager에 대한 메타 데이터 및 쿼리 캐시로 자동 구성되는 Psr6StaticArrayCache
도 포함되어 있습니다. 이로 인해 테스트 스위트의 속도와 메모리 사용량이 극적으로 향상되었습니다! 이는 커널을 부팅하고(예: 컨트롤러 테스트 또는 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
PHPUnit XML 구성에 확장 추가
PHPUnit 8 또는 9:
<php단위> ... <확장자> <extension class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </확장자> </phpunit>
PHPUnit 10+:
<php단위> ... <확장자> <bootstrap class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </확장자> </phpunit>
테스트를 실행하려면 phpunit/phpunit
dev
종속성( 버전 8, 9 및 10은 내장 확장으로 지원됨 )으로 사용할 수 있는지 확인하세요. 또는 이 번들은 symfony/phpunit-bridge
및 해당 simple-phpunit
스크립트와도 호환됩니다. (참고: 환경 변수 SYMFONY_PHPUNIT_VERSION
사용하여 phpunit-bridge에 올바른 PHPUnit 8+ 버전이 필요한지 확인해야 할 수도 있습니다).
그게 다야! 이제부터 각 단일 테스트 케이스( 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
설정하면 구성된 모든 교리 dbal 연결에 대해 활성화된다는 의미입니다.
필요한 경우 일부 연결에 대해서만 선택적으로 활성화할 수 있습니다.
dama_doctrine_test:enable_static_connection:connection_a: 참
기본적으로 구성된 모든 교리 DBAL 연결에는 현재 PHP 프로세스에서 관리되는 자체 드라이버 연결이 있습니다. 이 동작을 사용자 정의해야 하는 경우 드라이버 연결을 선택하는 데 사용되는 다른 "연결 키"를 선택할 수 있습니다.
동일한 드라이버 연결 인스턴스를 재사용하는 2개의 연결에 대한 예:
교리:dbal:connections:default:url: '%database.url1%'foo:url: '%database.url2%'dama_doctrine_test:connection_keys:# 동일한 키를 할당하면 동일한 내부 드라이버 연결이 재사용됩니다. 두 DBAL 연결기본값: custom_keyfoo: custom_key
v8.1.0부터 : 읽기/쓰기 복제본과의 연결의 경우 번들은 기본적으로 기본 및 복제본에 대해 동일한 기본 드라이버 연결을 사용합니다. 이는 다른 연결을 읽고 쓸 때 불일치가 발생하는 문제를 해결합니다. 다음과 같이 사용자 정의할 수도 있습니다.
교리: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 데모 테스트 스위트에서도 사용됩니다: https://github.com/symfony/demo
때로는 테스트가 실패했을 때 데이터베이스 내용을 디버깅할 수 있으면 유용할 수 있습니다. 일반적으로 모든 변경 사항은 자동으로 롤백되므로 수동으로 롤백할 수 있습니다.
공개 함수 testMyTestCaseThatINeedToDebug() {// ... DB 상태를 변경하는 것DAMADoctrineTestBundleDoctrineDBALStaticDriver::commit(); die;// 이제 DB 변경 사항이 실제로 유지되므로 디버깅할 수 있습니다.}
테스트 중에 공개 트랜잭션을 암시적으로 커밋하는 쿼리를 실행 중인 경우(아마도 이를 알지 못한 채)(예를 들어 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도 참조하세요