Тест на колбу - почему покрытие не включает импортные заявления и декораторы?
Мои тесты четко выполняют каждую функцию, и нет неиспользованных импортов. Тем не менее, согласно отчету о покрытии, 62% кода никогда не выполнялись в следующем файле:
![enter image description here]()
Кто-нибудь может указать, что я могу делать неправильно?
Вот как я инициализирую тестовый набор и зону покрытия:
cov = coverage(branch=True, omit=['website/*', 'run_test_suite.py'])
cov.start()
try:
unittest.main(argv=[sys.argv[0]])
except:
pass
cov.stop()
cov.save()
print "\n\nCoverage Report:\n"
cov.report()
print "HTML version: " + os.path.join(BASEDIR, "tmp/coverage/index.html")
cov.html_report(directory='tmp/coverage')
cov.erase()
Ответы
Ответ 1
Это третий вопрос в вопросе о покрытии .ppp.:
В: Почему тела функций (или классов) отображаются как выполненные, но линии def не?
Это происходит потому, что покрытие запускается после того, как функции определены. Строки определения выполняются без покрытия измерение, затем начинается освещение, затем вызывается функция. Это означает, что тело измеряется, но определение функции сам не является.
Чтобы исправить это, начните покрытие раньше. Если вы используете командную строку для запустите свою программу с охватом, тогда вся ваша программа будет мониторинг. Если вы используете API, вам нужно позвонить в службу покрытия .start() перед импортом модулей, которые определяют ваши функции.
Простейшая вещь, которую нужно сделать, - это запустить тесты в рамках покрытия:
$ coverage run -m unittest discover
Ваш пользовательский тест script не делает ничего сверх того, что будет делать в командной строке покрытия, проще будет просто использовать командную строку.
Ответ 2
Для исключения операторов импорта вы можете добавить следующие строки в .coveragerc
[report]
exclude_lines =
# Ignore imports
from
import
но когда я попытался добавить '@' для декораторов, исходный код из области декораторов был исключен. Уровень покрытия был неправильным. Могут быть и другие способы исключения декораторов.