#php #unit-testing #memory-leaks #tdd #phpunit
#php #модульное тестирование #утечки памяти #tdd #phpunit
Вопрос:
У меня ~ 700 тестов с ~ 1500 утверждениями, тесты выполняются на sqlite на RAM-диске. Я запускаю это с помощью phpunit /dir/name
, без каких-либо дополнительных настроек набора.
Тесты написаны хорошо (я надеюсь на это), приложение и каждый тест выполняются быстро, а использование памяти для каждого из них невелико (никогда не превышает 10 м).
После разделения тестов все в порядке. Но когда я запускаю все тесты вместе, PHPUnit сообщает об использовании памяти около 450 МБ.
- 500M в порядке? Должен ли я обновить
memory_limit
до 700 МБ, чтобы быть в безопасности? - Как избежать такого использования памяти?
Я понимаю, что ответ зависит от приложения, но мне интересно, какой уровень памяти могут тестировать для приложения среднего уровня.
Обновить:
Мы используем транзакции и откат изменений БД в tearDown()
Комментарии:
1. Вы можете указать phpunit запускать все тесты отдельно. Проверьте также, что вы не увеличиваете базу данных SQLLite от теста к тесту.
Ответ №1:
PHPUnit создает экземпляр тестового примера для каждого метода тестирования и каждого массива аргументов для каждого поставщика данных перед запуском любых тестов. При загрузке любое исключение и ошибка утверждения имеют ссылку на экземпляр, который его выдал. Это делает очень важным отменить все переменные экземпляра, которые вы назначили тесту, tearDown()
как сказал MasterCassim.
Но в основном это означает, что вы должны принять растущую потребность в памяти по мере увеличения количества тестов. Если вы также генерируете покрытие кода, это значительно возрастает. Наш основной проект веб-сайта работает с ограничением в 2 ГБ.
Вы можете запускать тесты в отдельных процессах, но вы заплатите высокую цену за увеличение времени выполнения.
Проблема # 10 Примечание: предполагается решить эту проблему, но я не знаю, каков ее статус в 3.6.
Комментарии:
1. Насколько я знаю, выпуск 10 не будет частью первоначального выпуска 3.6, который выйдет в ближайшем будущем. Так что написание разрывов определенно не потрачено впустую.
Ответ №2:
Если вы запускаете тесты вместе, вам нужно использовать метод tearDown() для «освобождения» памяти.