Я играл сcoverage.py, но не могу заставить его собрать покрытие для модуля __main__.
Я работаю в Windows и люблю создавать сценарии с помощью IDLE. Цикл редактирования-нажатия-F5 действительно удобен, быстр и интересен. К сожалению, похоже, что cover.py не может (или не хочет) собрать покрытие основного модуля - в приведенном ниже коде он сообщает, что данные не собираются. Мой код выглядит так:
import coverage
cov = coverage.coverage()
cov.start()
def CodeUnderTest():
print 'do stuff'
return True
assert CodeUnderTest()
cov.stop()
cov.save()
cov.html_report()
У кого-нибудь есть идеи? Пробовал разные варианты покрытия, но безрезультатно. Похоже, что среда, которую создает IDLE, не очень дружелюбна к покрытию, поскольку sys.modules['__main__'] указывает на файл idle.pyw, а не на файл, в котором он запущен.
Ответ 1 · рейтинг 1 · Ned Batchelder
Вы не сказали, какое поведение вы видите, но я ожидаю, что две строки в CodeUnderTest будут отображаться как закрытые, но ни одна из других строк в файле не будет. Coverage.py не может измерить выполнение, которое произошло до его запуска, и здесь он не запускается до тех пор, пока модуль не будет выполнен. Например, строка import coverage уже была выполнена к моменту запуска покрытия. Кроме того, как только покрытие было начато, измерение действительно начинается только при следующем вызове функции.
Самый простой способ запустить cover.py - использовать его из командной строки. Таким образом, вы знаете, что он начинается как можно раньше:
$ coverage run my_prog.py arg1 arg2 ...
Если вы должны использовать его программно, организуйте свой файл так, чтобы все интересующие вас действия происходили внутри функции, которая вызывается после запуска покрытия.