30
loading...
This website collects cookies to deliver better user experience
integration
and functional
tests, if I wanna run the entire tests in my local development. It reduces the duration of the execution time from 9 minutes
to 50 seconds
. It is great, right? Sure, I switch the test database in CI/CD back to MySQl
to ensure that everything will be executed against the real test database.## I installed the extension in alpine docker
RUN apk add --update \
...
php7-mysqli \
...
sqlite
installed and enabledphp -i | grep sqlite
## app/config/packages/test/doctrine.yaml
doctrine:
dbal:
connections:
default:
driver: 'pdo_sqlite'
url: '%env(resolve:DATABASE_URL)%'
env
file## app/.env.test.local
## :memory: will create the database in memory
DATABASE_URL="sqlite:///:memory:"
## %kernel.project_dir%/db/sqlite3.db3 will breate the database on filesystem
# DATABASE_URL="sqlite:///%kernel.project_dir%/db/sqlite3.db3"
DatabaseTestCase
<?php
declare(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);
}
}
Repository
class in symfonyfinal 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();
}
}
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.composer require --dev dama/doctrine-test-bundle
dama_doctrine_test_bundle.yaml
## app/config/packages/test/dama_doctrine_test_bundle.yaml
dama_doctrine_test:
enable_static_connection: true
enable_static_meta_data_cache: true
enable_static_query_cache: true
bundles.php
if ($env === 'test') {
$bundles[] = new DAMA\DoctrineTestBundle\DAMADoctrineTestBundle();
}
<phpunit>
...
<listeners>
<listener class="\DAMA\DoctrineTestBundle\PHPUnit\PHPUnitListener" />
</listeners>
</phpunit>