Покрытие кода Python и многопроцессорность
Я использую coveralls в сочетании с coverage.py для отслеживания покрытия кода моего скрипта. Я использую следующие команды:
coverage run --parallel-mode --source=mysource --omit=*/stuff/idont/need.py ./mysource/tests/run_all_tests.py
coverage combine
coveralls --verbose
Это работает довольно хорошо, за исключением multiprocessing. Код, выполняемый пулами работников или дочерними процессами, не отслеживается.
Есть ли возможность отслеживать многопроцессорный код? Какой-то конкретный вариант мне не хватает? Может быть, добавление оберток в библиотеку многопроцессорности для запуска покрытия каждый раз, когда создается новый процесс?
ИЗМЕНИТЬ
I (и jonrsharpe, также:-) нашел обезьяна-патч для многопроцессорности.
Однако это не работает для меня, моя Tracis-CI build убивается почти сразу после начала. Я проверил проблему на своей локальной машине и, по-видимому, добавил патч к многопроцессорной работе, разоряя мою память. Тесты, которые занимают менее 1 ГБ памяти, нуждаются в более чем 16 ГБ с этим исправлением.
EDIT2
Обезьяна-патч работает после небольшой модификации: Удаление
анализ config_file
(config_file=os.environ['COVERAGE_PROCESS_START']
) сделал трюк. Это решило проблему раздутой памяти. Соответственно, соответствующая строка просто становится:
cov = coverage(data_suffix=True)
Ответы
Ответ 1
Coverage 4.0 включает параметр командной строки --concurrency=multiprocessing
, чтобы справиться с этим. Вы должны использовать coverage combine
позже. Например, если ваши тесты находятся в regression_tests.py
, вы просто сделаете это в командной строке:
coverage run --concurrency=multiprocessing regression_tests.py
coverage combine
Ответ 2
Я потратил некоторое время на то, чтобы убедиться, что покрытие работает с multiprocessing.Pool
, но оно никогда не срабатывало.
Наконец-то я сделал исправление, которое заставляет его работать - было бы счастливо, если бы кто-то направил меня, если я что-то делаю неправильно.
https://gist.github.com/andreycizov/ee59806a3ac6955c127e511c5e84d2b6