В настоящее время проект настроен для запуска покрытия с помощью команды управления Django следующим образом:
./manage.py test --with-coverage --cover-package=notify --cover-branches --cover-inclusive --cover-erase
В результате появляется отчет следующего вида:
Name Stmts Miss Branch BrMiss Cover Missing
--------------------------------------------------------------------------
notify.decorators 4 1 0 0 75% 4
notify.handlers 6 1 2 0 88% 11
notify.notification_types 46 39 2 0 19% 8-55, 59, 62, 66
notify.notifications 51 51 0 0 0% 11-141
--------------------------------------------------------------------------
TOTAL 107 92 4 0 17%
Однако проблема с этим отчетом. Это неправильно. Охват означает отсутствие пропусков линий, несмотря на то, что они действительно покрываются испытаниями. Например, если я запускаю тесты через nosetests
вместо команды управления django, я получаю следующий правильный отчет:
Name Stmts Miss Branch BrMiss Cover Missing
-----------------------------------------------------------------------------
notify.decorators 4 0 0 0 100%
notify.handlers 6 0 2 0 100%
notify.notification_types 46 0 2 0 100%
notify.notifications 51 25 0 0 51% 13, 18, 23, 28, 33, 38, 43, 48, 53, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 116, 121, 126, 131, 136, 141
-----------------------------------------------------------------------------
TOTAL 107 25 4 0 77%
Google привел меня на часто задаваемые вопросы о веб-сайте покрытия, http://nedbatchelder.com/code/coverage/faq.html
В: Почему тела функций (или классов) отображаются как выполненные, но строки def не?
Это происходит потому, что покрытие запускается после того, как функции определены. Строки определения выполняются без измерения покрытия, затем начинается освещение, затем вызывается функция. Это означает, что тело измеряется, но определение самой функции не является.
Чтобы исправить это, начните покрытие раньше. Если вы используете командную строку для запуска вашей программы с охватом, ваша программа будет контролироваться. Если вы используете API, перед импортом модулей, которые определяют ваши функции, вы должны вызвать функцию coverage.start().
Вопрос в том, могу ли я правильно запускать отчеты о покрытии с помощью команды управления Django? Или мне нужно обойти управление, чтобы избежать ситуации, когда покрытие запускается после выполнения "отсутствующих" строк?