Как предотвратить перестройку кеша Symfony в каждом запросе в тестовой среде - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть Symfony 3.3 / 3.4, и с тех пор мои функциональные тесты начали работать очень медленно.Тесты, которые заняли 10 минут, начали занимать 1 час и более.

Мы используем следующие пакеты:

"symfony/symfony": "^3.4",
"doctrine/orm": "^2.6",
"doctrine/doctrine-bundle": "^1.9",
"doctrine/doctrine-cache-bundle": "^1.3",
"symfony/swiftmailer-bundle": "^3.2",
"symfony/monolog-bundle": "^3.3",
"symfony/polyfill-apcu": "^1.0",
"sensio/distribution-bundle": "^5.0",
"sensio/framework-extra-bundle": "^5.2",
"incenteev/composer-parameter-handler": "^2.0",
"jms/serializer-bundle": "^2.4",
"jms/di-extra-bundle": "^1.9",
"firebase/php-jwt": "^4.0",
"snc/redis-bundle": "^2.0",
"graylog2/gelf-php": "^1.5",
"noiselabs/smarty-bundle": "^2.0",
"symfony/assetic-bundle": "^2.8",
"eightpoints/guzzle-bundle": "^7.3",
"aws/aws-sdk-php-symfony": "^2.0",
"beberlei/DoctrineExtensions": "^1.0",
"php-amqplib/rabbitmq-bundle": "^1.14",
"aws/aws-php-sns-message-validator": "^1.1",
"nelmio/api-doc-bundle": "^2.13",
"symfony/phpunit-bridge": "^4.1",
"phpunit/phpunit": "^7.3",
"dms/dms-filter-bundle": "^4.0",
"tiendanube/php-sdk": ">=1.0",
"liuggio/statsd-client-bundle": "1.6.*",
"instamojo/instamojo-php": "^0.3.0",
"pagarme/pagarme-php": "^3.6",
"friendsofsymfony/elastica-bundle": "^5.0",
"payprocessing/atol-online": "^1.0",
"paymentwall/paymentwall-php": "^2.2",
"yandex-money/yandex-checkout-sdk-php": "^1.0",
"stripe/stripe-php": "^6.4",
"okapon/doctrine-set-type-bundle": "^0.5.0",
"phpoffice/phpword": "^0.15",
"cloudconvert/cloudconvert-php": "^2.2",
"cleentfaar/slack-bundle": "^0.20.1"

Наши тесты расширены от нашего базового класса тестирования AbstractKernelTestCase.Этот класс расширяет базовый класс Symfony WebTestCase.

. Мы часто используем JMSDiExtraBundle для DI и объявления сервисов, но теперь мы стараемся избегать его использования и используем нативный autowire / autoconfigure и другие.

С помощью XDebug я обнаружил, что Symfony компилирует кеш контейнеров / пакетов почти каждый запрос, потому что ConfigCache считает, что кэш EntityManager устарел.Я пытался понять, как работает эта система кеша, но мне не удалось.Кэш-файл EntityManager обернут в Symfony\Component\Config\Resource\ClassExistenceResource, и я не могу понять идею метода isFresh.Другие файлы используют другие реализации Symfony\Component\Config\Resource\SelfCheckingResourceInterface.

Если у кого-то есть идея - добро пожаловать!

// Some methods were cut, because they don't give any useful information.
abstract class AbstractKernelTestCase extends WebTestCase
{
    /** @var Client */
    protected static $routerClient;

    /** @var BufferedOutput */
    private $errorBuffer;

    public function setUp()
    {
        self::$routerClient = self::createClient();
        $this->errorBuffer = new BufferedOutput();
    }

    public function tearDown()
    {
        $this->clearMemory();
        parent::tearDown();
    }

    public function getRouterClient()
    {
        return self::$routerClient;
    }

    protected function clearMemory(): void
    {
        $reflectionObject = new \ReflectionObject($this);
        foreach ($reflectionObject->getProperties() as $prop) {
            if (!$prop->isStatic() && strpos($prop->getDeclaringClass()->getName(), 'PHPUnit_') === false) {
                $prop->setAccessible(true);
                $prop->setValue($this, null);
            }
        }
    }
}
...