Тест на колбу - почему покрытие не включает импортные заявления и декораторы?

Мои тесты четко выполняют каждую функцию, и нет неиспользованных импортов. Тем не менее, согласно отчету о покрытии, 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

но когда я попытался добавить '@' для декораторов, исходный код из области декораторов был исключен. Уровень покрытия был неправильным. Могут быть и другие способы исключения декораторов.