У меня есть 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);
}
}
}
}