2014-01-03 4 views
4

Я использую py.test (версия 2.4, в Windows 7) с помощью xdist для запуска ряда числовых тестов регрессии и интерфейса для библиотеки C++, которая предоставляет интерфейс Python через модуль С.Py.test: чрезмерное использование памяти с большим количеством тестов

С течением времени количество тестов выросло до ~ 2000, но теперь мы сталкиваемся с некоторыми проблемами памяти. Является ли использование xdist или нет, использование памяти для процесса python, выполняющего тесты, кажется, постоянно увеличивается.

В режиме одиночного процесса мы даже видели несколько проблем с плохими ошибками размещения, тогда как при использовании общей памяти xdist может привести к снижению ОС (8 процессов, каждая из которых использует> 1 ГБ к концу).

Ожидается ли такое поведение? Или кто-то другой испытывает ту же проблему при использовании py.test для большого количества тестов? Есть ли что-то, что я могу сделать в tearDown (класс), чтобы уменьшить использование памяти с течением времени?

На данный момент я не могу исключить возможность проблемы, лежащей где-то внутри кода C/C++, но при запуске какой-то долговременной программы, использующей этот код через интерфейс Python вне py.test, я вижу относительно постоянную использование памяти во времени. Я также не вижу чрезмерного использования памяти при использовании носа вместо py.test (мы используем py.test, так как нам нужны отчеты junit-xml для работы с несколькими процессами)

+0

Есть ли состояние/данные, хранящиеся на любом экземпляре тестового класса/случая? Не могли бы вы попытаться найти небольшой пример, который использует «растущее» поведение памяти? – hpk42

+0

Проблема заключалась в том, что данные хранились на тестовых классах в методах setUpClass. Использование нескольких операторов self.x = None в методе tearDownClass решило проблему. Спасибо, что указали мне в правильном направлении. – tt293

+0

В py.test также есть проблема, которая способствует этому: https://github.com/pytest-dev/pytest/issues/1649 – dbn

ответ

2

Использование памяти py.test будет расти вместе с количество тестов. Каждый тест собирается до того, как они будут выполнены, и для каждого тестового запуска тестовый отчет хранится в памяти, что будет намного больше для сбоев, так что вся информация может быть сообщена в конце. Так что в некоторой степени это ожидается и нормально.

Однако у меня нет твердых чисел и я никогда не исследовал это. Раньше у нас не хватало памяти на некоторых CI-хостах, но просто давало им больше памяти для ее решения, а не для расследования. В настоящее время наши хосты CI имеют 2G памяти и запускают около 3500 тестов за один тестовый прогон, вероятно, это будет работать на половину из них, но может включать в себя большую замену. Pypy также является проектом, который управляет огромным набором тестов с py.test, поэтому это, безусловно, возможно.

Если вы подозреваете, что код C для утечки памяти, я рекомендую создать (небольшой) тестовый скрипт, который просто проверяет API модуля расширения (с или без py.test) и вызывает это в бесконечном цикле при сборе статистики памяти после каждого петля. После нескольких циклов память больше не должна увеличиваться.

0

У нас также возникают подобные проблемы. В нашем случае мы запускаем около 4600 тестовых случаев. Мы используем обширные экраны pytest, и нам удалось сэкономить несколько МБ, немного изменив размеры светильников (показывая несколько от «сеанса» до «класса» «функции»). Однако мы упали в тестах.

Смежные вопросы