Генерация покрытия кода PHPUnit, вызывающая исчерпание памяти

В настоящее время я использую Zend Framework в сочетании с PHPUnit для проведения модульного тестирования приложения. Когда Хадсон выполняет команду оболочки PHPUnit, максимальный предел памяти PHP достигается где-то во время генерации покрытия кода. В настоящее время у меня есть в общей сложности 41 тест с 334 утверждениями.

Я успешно устранил эту ошибку, увеличив параметр memory_limit до 768M с помощью переключателя -d memory_limit=768M; однако я беспокоюсь, что по мере увеличения сложности вместе с общим количеством тестов/утверждений у меня не будет достаточно памяти для создания HTML для статистики покрытия кода.

ОС: CentOS 5.5
Панель управления: WHM/cPanel
Сервер CI: Hudson

/usr/local/bin/phpunit 
  --verbose  
  -d memory_limit=512M  
  --log-junit ../../build/logs/phpunit.xml   
  --coverage-clover ../../build/logs/coverage/clover.xml   
  --coverage-html ../../build/logs/coverage-html/  

Фатальная ошибка: разрешенный размер памяти 536870912 байт исчерпан.

Прежде чем зафиксировать свои изменения и позволить Хадсону справиться с остальными, я использую Windows 7 для разработки. Использование памяти никогда не превышало 340 МБ при выполнении той же команды в W7.


person webjawns.com    schedule 08.10.2010    source источник
comment
Все ваши тестовые случаи находятся в одном классе?   -  person allnightgrocery    schedule 10.10.2010
comment
Нет, тесты разделены на четыре разных файла. Эти тесты относительно просты, особенно. по сравнению с тем, что мы запланировали.   -  person webjawns.com    schedule 13.10.2010
comment
:) спасибо за публикацию вашего решения. У меня была проблема, которую вы перечислили, и я действительно взломал ее. Каждый раз, когда что-то всплывало (исчерпана память в /pear/phpunit/framework/whatever.php в строке 1999), я набирал sudo vi /.../whatever.php и добавлял в строке set_ini("memory_limit","1000M"). Вероятно, это не лучшая практика ;)   -  person Alex C    schedule 26.01.2011
comment
Не беспокойтесь, мы все, как известно, время от времени нарушаем правила. Рад, что смог помочь!   -  person webjawns.com    schedule 01.04.2011


Ответы (3)


Уменьшив количество файлов, включенных в покрытие кода, а также увеличив общий лимит памяти в PHP, я смог практически устранить эту ошибку. Весь Zend Framework был включен в покрытие кода, которое было очень большим.

person webjawns.com    schedule 23.11.2010
comment
Чтобы упростить задачу, я поместил этот материал в XML-конфигурацию, например. ‹фильтр›‹белый список›‹каталог›MY_LIBRARY‹/каталог›‹/белый список›‹/фильтр›. Если вы назовете этот phpunit.xml и он находится в вашем текущем рабочем каталоге, модуль php применит это автоматически. - person Mark E. Haase; 17.12.2011
comment
Важно отметить, что сначала вы можете просто увидеть, как phpunit прекращает выполнение тестов без ошибок и показывает Returned: 255. - person Josh Woodcock; 23.10.2013
comment
Новая ссылка на покрытие кода в PHPUnit: phpunit. de/manual/current/en/ - person Pepijn; 04.08.2015

У вас включено профилирование xdebug, если да, попробуйте отключить его. Я сталкивался с этой проблемой раньше, и она сводилась к расширениям в php (в частности, профилированию xdebug и/или включенному просмотрщику иерархии)

person Kayla Rose    schedule 14.10.2010
comment
Я только что проверил, и я надеялся, что проблема была в этом, но профилирование отключено. Спасибо за ваш ответ. Любые другие идеи? - person webjawns.com; 15.10.2010
comment
Трудно сказать, не зная кодовой базы. Я бы просто следил за красными флажками (например, исчерпывающая __autoloading, кэширование данных в памяти и т. д.), которые обычно не являются проблемой, но могут вызвать проблемы во время тестирования из-за большого количества экземпляров и т. д. Также воспользуйтесь преимуществом tearDown( ) если возможно. - person Kayla Rose; 15.10.2010

С 2019 года вы можете использовать драйвер PCOV с PHPUnit для создания отчета о покрытии кода. По моему опыту, это лишь незначительно менее производительно, чем запуск простого пакета PHPUnit.

Прочтите Ускорьте покрытие кода PHPUnit Анализ некоторых хороших тестов, сравнивающих XDebug, PHPDebug и PCOV. В нем также есть инструкции о том, как включить PCOV на PHPUnit 8.

Прочитайте Настройка PHP PCOV для 5 раз более быстрое покрытие кода PHPUnit для получения инструкций по настройке PCOV на PHPUnit7 и более ранних версиях.

person Maxime Rainville    schedule 08.09.2020