В настоящее время у вас есть проект, настроенный для запуска покрытия с помощью команды управления 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
В: Почему тела функций (или классов) отображаются как выполненные, а строки определения — нет?
Это происходит потому, что покрытие начинается после определения функций. Линии определения выполняются без измерения покрытия, затем запускается покрытие, затем вызывается функция. Это означает, что тело измеряется, а определение самой функции — нет.
Чтобы исправить это, начните охват раньше. Если вы используете командную строку для запуска вашей программы с покрытием, то вся ваша программа будет отслеживаться. Если вы используете API, перед импортом модулей, определяющих ваши функции, необходимо вызвать покрытие.start().
Вопрос в том, могу ли я правильно запускать отчеты о покрытии с помощью команды управления Django? Или мне нужно обойти, чтобы избежать ситуации, когда покрытие начинается после выполнения «недостающих» строк?