An Interest In:
Web News this Week
- April 19, 2024
- April 18, 2024
- April 17, 2024
- April 16, 2024
- April 15, 2024
- April 14, 2024
- April 13, 2024
Tips for testing the database in Symfony application
Use SQLite Memory DB
SQLite In-memory database is a great alternative to test the interaction with database. As they exist only in the memory of the application, they are truly disposable. And it is also very easy to set up with Symfony applications that use Doctrine.
Install php extension to support SQLite
: more about install sqlite for php
## I installed the extension in alpine dockerRUN apk add --update \ ... php7-mysqli \ ...
Check if sqlite
installed and enabled
php -i | grep sqlite
Config Memory DB in Symfony
## app/config/packages/test/doctrine.yamldoctrine: dbal: connections: default: driver: 'pdo_sqlite' url: '%env(resolve:DATABASE_URL)%'
Config app env
file
## app/.env.test.local## :memory: will create the database in memoryDATABASE_URL="sqlite:///:memory:"## %kernel.project_dir%/db/sqlite3.db3 will breate the database on filesystem# DATABASE_URL="sqlite:///%kernel.project_dir%/db/sqlite3.db3"
Create a DatabaseTestCase
<?phpdeclare(strict_types = 1);namespace App\Tests\Utils;use Doctrine\ORM\EntityManagerInterface;use Doctrine\ORM\Tools\SchemaTool;use LogicException;use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;use Symfony\Component\HttpKernel\KernelInterface;class DatabaseTestCase extends KernelTestCase{ protected EntityManagerInterface $entityManager; protected function setUp(): void { $kernel = self::bootKernel(); if ('test' !== $kernel->getEnvironment()) { throw new LogicException('Execution only in Test environment possible!'); } $this->initDatabase($kernel); $this->entityManager = $kernel->getContainer() ->get('doctrine') ->getManager(); } private function initDatabase(KernelInterface $kernel): void { $entityManager = $kernel->getContainer()->get('doctrine.orm.entity_manager'); $metaData = $entityManager->getMetadataFactory()->getAllMetadata(); $schemaTool = new SchemaTool($entityManager); $schemaTool->updateSchema($metaData); }}
Example to test the Repository
class in symfony
final class ScheduleRepositoryTest extends DatabaseTestCase{ private ?ScheduleRepository $repository; protected function setUp(): void { parent::setUp(); $this->repository = ScheduleRepositoryTest::$container->get(ScheduleRepository::class); } public function testFindDefault(): void { $this->assertEmpty($this->repository->findDefault()); $this->insertDefaultSchedule(); $this->assertInstanceOf(Schedule::class, $this->repository->findDefault()); } private function insertDefaultSchedule(): void { $default = Schedule::defaultSchedule(); $this->entityManager->persist($default); $this->entityManager->flush(); }}
The execution of the tests is pretty fast, see the screenshot
Use symfony Test-bundle to benefit from transaction and caching
By using this test bundle, it will begin a transaction
before every testcase and roll it back again after the test finished for all configured DBAL connections. This results in a performance boost as there is no need to rebuild the schema, import a backup SQL dump or re-insert fixtures before every testcase. It also includes a StaticArrayCache
that will be automatically configured as meta data & query cache for all EntityManagers. This improved the speed and memory usage for all testsuites dramatically.
install the package
composer require --dev dama/doctrine-test-bundle
Config the bundle in dama_doctrine_test_bundle.yaml
## app/config/packages/test/dama_doctrine_test_bundle.yamldama_doctrine_test: enable_static_connection: true enable_static_meta_data_cache: true enable_static_query_cache: true
Enable the bundle in bundles.php
if ($env === 'test') { $bundles[] = new DAMA\DoctrineTestBundle\DAMADoctrineTestBundle();}
Enable the PHPunit listner in phpunit.xml.dist
: example for php7.4
, more config info
<phpunit> ... <listeners> <listener class="\DAMA\DoctrineTestBundle\PHPUnit\PHPUnitListener" /> </listeners></phpunit>
Original Link: https://dev.to/vikbert/tips-for-testing-the-database-in-symfony-application-1pd5
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To