8

Я использую coveralls в сочетании с coverage.py для отслеживания покрытия кода моего скрипта. Я использую следующие команды:Покрытие кода Python и многопроцессорность

coverage run --parallel-mode --source=mysource --omit=*/stuff/idont/need.py ./mysource/tests/run_all_tests.py 
coverage combine 
coveralls --verbose 

Это работает довольно хорошо, за исключением multiprocessing. Код, выполняемый пулами работников или дочерними процессами, не отслеживается.

Есть ли возможность отслеживать многопроцессорный код? Какой-то конкретный вариант мне не хватает? Может быть, добавление оберток в библиотеку многопроцессорности для запуска покрытия каждый раз, когда возникает новый процесс?

EDIT:

I (и jonrsharpe, а также :-) нашли monkey-patch for multiprocessing.

Однако для меня это не сработает, моя сборная Tracis-CI убита почти сразу после начала. Я проверил проблему на своей локальной машине и, по-видимому, добавил патч к многопроцессорной работе, разоряя мою память. Тесты, которые занимают менее 1 ГБ памяти, нуждаются в более чем 16 ГБ с этим исправлением.

EDIT2:

Обезьяна-патч делает работу после небольшой модификации: Удаление config_file разбора (config_file=os.environ['COVERAGE_PROCESS_START']) сделал трюк. Это решило проблему раздутой памяти. Соответственно, соответствующая линия становится просто:

cov = coverage(data_suffix=True) 
+0

Вы не проверить код для этих дочерних процессов напрямую? – jonrsharpe

+0

Ну, да, большинство из них я делаю. Но есть некоторые части, которые полезны и выполняются только в том случае, если используется многопроцессорность (например, обертывание доступа к базе данных с помощью блокировок или многопроцессорной очереди для обеспечения последовательного хранения данных). И я знаю, что этот код работает из-за успешных тестов. Было бы неплохо, если бы это тоже появилось на комбинезонах :-) – SmCaterpillar

+1

См. Https://bitbucket.org/ned/coveragepy/issue/117/enable-coverage-measurement-of-code-run-by через http : //nedbatchelder.com/code/coverage/trouble.html – jonrsharpe

ответ

6

Покрытие 4,0 включает в себя параметр командной строки --concurrency=multiprocessing, чтобы иметь дело с этим. После этого вы должны использовать coverage combine.

+2

Спасибо, что указали на необходимость использования «комбинирования покрытия» после этого. Некоторое время я вращал колеса, пытаясь понять, почему «параллелизм = многопроцессорность», который я имел в моем файле .coveragerc, не работал. –

0

Я потратил некоторое время, пытаясь убедиться, что покрытие работает с multiprocessing.Pool, но оно никогда не срабатывало.

Я, наконец, сделал исправление, которое заставляет его работать - было бы счастливо, если бы кто-то руководил мной, если я делаю что-то неправильно.

https://gist.github.com/andreycizov/ee59806a3ac6955c127e511c5e84d2b6

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