Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Performance with LiipTestFixturesBundle v2.6.0 #252

Open
alexislefebvre opened this issue Nov 30, 2023 · 7 comments
Open

Performance with LiipTestFixturesBundle v2.6.0 #252

alexislefebvre opened this issue Nov 30, 2023 · 7 comments

Comments

@alexislefebvre
Copy link
Collaborator

I am experiencing significant performance issues with LiipTestFixturesBundle version 2.6.0 when using the loadFixtures method with zero insertions. Even with an empty set of fixtures as shown below, tests take 7 to 9 seconds to run, which seems abnormally high. And without loadFixtures() 260 ms

$this->databaseTool->loadFixtures([ ExempleFixtures::class]);

 <?php

namespace App\DataFixtures;

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class ExempleFixtures extends Fixture
{
    public function load(ObjectManager $manager)
    {

    }
}

Originally posted by @Dekrikh in #12 (comment)

@alexislefebvre
Copy link
Collaborator Author

@Dekrikh do the database schema has lots of entites with many columns?

You can try to keep the schema: #12 (comment)

@Dekrikh
Copy link

Dekrikh commented Nov 30, 2023

@alexislefebvre
Yes, the reason is that generating the table takes a significant amount of time.

I measured the command's execution time using the following:

Measure-Command { php bin/console --env=test doctrine:schema:update --force }
The result was:

TotalMilliseconds: 6489.8295


Now, I have good performance with #12 (comment), thank you.

However, I encountered another issue. In my test, I send a request with the method api of the paht ID of one. The problem is that the test doesn't start with ID 1; it uses the previous ID plus one (AUTO_INCREMENT)."

I thought of using the Event https://github.com/liip/LiipTestFixturesBundle/blob/2.x/doc/events.md to reset an AUTO_INCREMENT. Any thoughts to share with me?

@alexislefebvre
Copy link
Collaborator Author

@Dekrikh Try to set the id to 1 in the fixtures of the entity, it should ignore the auto increment. Or try with the event.

@Dekrikh
Copy link

Dekrikh commented Dec 8, 2023

I chose simplicity a "DELETE FROM table_name" looping over all tables with a reset of AUTO_INCREMENT = 1; at each start of the test

if someone has the same need, this code using doctrine in symfony :

public function clearAllTablesInDatabaseAndResetAutoIncrement(){
        $em = $this->getContainer()->get('doctrine.orm.entity_manager');

        $em->getConnection()->exec('SET FOREIGN_KEY_CHECKS = 0');
        // clear all the tables
        foreach ($em->getMetadataFactory()->getAllMetadata() as $metadata) {
            $queryBuilder = $em->createQueryBuilder();
            $queryBuilder->delete($metadata->getName());
            $queryBuilder->getQuery()->execute();
        }

        foreach ($em->getMetadataFactory()->getAllMetadata() as $metadata) {
            $em->getConnection()->exec('ALTER TABLE ' . $metadata->getTableName() . ' AUTO_INCREMENT = 1;');
        }

        $em->getConnection()->exec('SET FOREIGN_KEY_CHECKS = 1');
    }

@alexislefebvre
Copy link
Collaborator Author

@Dekrikh thanks for sharing the code. Is it faster if you keep the tables but remove the data with TRUNCATE and reset the AUTO_INCREMENT?

@Dekrikh
Copy link

Dekrikh commented Jan 14, 2024

@alexislefebvre yes, that's a better idea.

@alexislefebvre
Copy link
Collaborator Author

Actually, is your code already doing this? I'm not sure if the call to delete remove only the rows or the table entirely.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants