Получение покрытия Python.py для сбора покрытия для модуля, который его импортирует?

Я играл с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, а не на файл, в котором он запущен.


person Richard Levasseur    schedule 06.02.2012    source источник


Ответы (1)


Вы не сказали, какое поведение вы видите, но я ожидаю, что две строки в CodeUnderTest будут отображаться как закрытые, но ни одна из других строк в файле не будет. Coverage.py не может измерить выполнение, которое произошло до его запуска, и здесь он не запускается до тех пор, пока модуль не будет выполнен. Например, строка import coverage уже была выполнена к моменту запуска покрытия. Кроме того, как только покрытие было начато, измерение действительно начинается только при следующем вызове функции.

Самый простой способ запустить cover.py — использовать его из командной строки. Таким образом, вы знаете, что он начинается как можно раньше:

$ coverage run my_prog.py arg1 arg2 ...

Если вы должны использовать его программно, организуйте свой файл так, чтобы все интересующие вас действия происходили внутри функции, которая вызывается после запуска покрытия.

person Ned Batchelder    schedule 06.02.2012
comment
Извините, я добавлю, какое поведение я вижу к вопросу: он сообщает, что данные не собраны - person Richard Levasseur; 06.02.2012
comment
Кроме того, я бы не хотел запускать его в командной строке, потому что цикл редактирования-нажатия-f5 очень удобен. Я запускаю unittest.main, и он печатает тестовый вывод прямо в окне. Никакой работы с дрянной командной строкой Windows. - person Richard Levasseur; 06.02.2012
comment
Хм, должно быть что-то с IDLE, потому что когда я пробую ваш код в командной строке, он ведет себя так, как я и ожидал. IDLE не очень подходит для серьезной разработки, вы можете быть первым, кто будет использовать cover.py и IDLE вместе! - person Ned Batchelder; 07.02.2012
comment
@NedBatchelder Но как запустить покрытие из командной строки в Windows. Я установил покрытие с помощью pip. Теперь покрытие устанавливается в папку C:\Python\Lib\site-packages\coverage. Как использовать его как отдельную команду? Извините, если мои сомнения очень глупы, но, поскольку покрытие представляет собой модуль Python, я предполагаю, что мы должны использовать его с помощью интерпретатора Python или виртуальной машины Python. Тогда как я могу использовать его как отдельную программу? - person VaidAbhishek; 15.07.2012