Могу ли я ограничить вывод покрытия носа в каталог (а не пакет)?

Мой SUT выглядит следующим образом:

foo.py
bar.py
tests/__init__.py [empty]
tests/foo_tests.py
tests/bar_tests.py
tests/integration/__init__.py [empty]
tests/integration/foo_tests.py
tests/integration/bar_tests.py

Когда я запускаю nosetests --with-coverage, я получаю детали для всех видов модулей, которые я бы предпочел игнорировать. Но я не могу использовать --cover-package=PACKAGE, потому что foo.py и bar.py не находятся в пакет. (См. Поток после http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html из-за моих причин не помещать их в пакет.)

Могу ли я ограничить вывод покрытия только файлами foo.py и bar.py?

Обновить. Предполагая, что нет лучшего ответа, чем Nadia ниже, я задал следующий вопрос: Как написать некоторую (bash) оболочку script для преобразования всех совпадающих имен файлов в каталог в параметры командной строки?

Ответы

Ответ 1

Вы можете использовать его следующим образом:

--cover-package=foo --cover-package=bar

Я быстро просмотрел исходный код носа, чтобы подтвердить: Это строка

    if options.cover_packages:
        for pkgs in [tolist(x) for x in options.cover_packages]:

Ответ 2

Вы можете использовать:

--cover-package=.

или даже установить переменную среды

NOSE_COVER_PACKAGE=.

Протестировано носом 1.1.2

Ответ 3

У меня есть много файлов/пакетов Python верхнего уровня и нахожу это раздражающим, чтобы перечислить их все вручную, используя -cover-package, поэтому я сделал два псевдонима для себя. Alias ​​ nosetests_cover будет запускать покрытие со всеми вашими файлами/пакетами Python верхнего уровня, указанными в пакете -cover. Псевдоним nosetests_cover_sort будет делать то же самое и дополнительно сортировать ваши результаты по проценту покрытия.

nosetests_cover_cmd="nosetests --with-coverage --cover-erase --cover-inclusive --cover-package=\$( ls | sed -r 's/[.]py$//' | fgrep -v '.' | paste -s -d ',' )"
alias nosetests_cover=$nosetests_cover_cmd
alias nosetests_cover_sort="$nosetests_cover_cmd 2>&1 | fgrep '%' | sort -nr -k 4"

Примечания:

  • Это из моего .bashrc файла. Измените соответствующим образом, если вы не используете bash.
  • Они должны запускаться из вашего каталога верхнего уровня. В противном случае имена пакетов будут некорректными, и покрытие будет неактивно обрабатывать их (т.е. Вместо того, чтобы сообщать, что ваш --cover-пакет неверен, он будет действовать так, как будто вы не предоставили эту опцию вообще).
  • В настоящее время я использую Python 2.7.6 на Ubuntu 13.10 с носовой версией 1.3.0 и версией покрытия 3.7.1. Это единственная настройка, в которой я тестировал эти команды.
  • В вашем использовании удалите --cover-erase и -cover-inclusive, если они не соответствуют вашим потребностям.
  • Если вы хотите сортировать в обычном порядке вместо обратного порядка, замените -nr на -n в команде sort.
  • Эти команды предполагают, что все ваши файлы/пакеты верхнего уровня Python называются без точки (кроме точки в ".py" ). Если это неверно для вас, прочитайте раздел "Детали" ниже, чтобы понять детали команды, а затем, в случае необходимости, измените команды.

Подробнее:

Я не утверждаю, что это самые эффективные команды для достижения желаемых результатов. Это всего лишь команды, с которыми мне приходилось сталкиваться. = P

Главное, чтобы объяснить, будет аргумент --cover-package. Он создает список имен файлов/пакетов верхнего уровня Python верхнего уровня (с ".py", разделенным на имена файлов) следующим образом:

  • \$ - Сбрасывает символ $ в строке с двумя кавычками.
  • $( ) - Вставляет результат команды, содержащейся внутри.
  • ls - перечисляет все имена в текущем каталоге (должен быть каталог Python верхнего уровня).
  • | sed -r 's/[.]py$//' - В списке заменяется "foo_bar.py" на "foo_bar".
  • | fgrep -v '.' - В списке удаляются все имена без точки (например, удаляются файлы foo_bar.pyc и notes.txt).
  • | paste -s -d ',' - Изменяет список из разделенного строки, разделенного запятыми.

Я также должен объяснить сортировку.

  • 2>&1 - присоединяется к stderr и stdout.
  • | fgrep '%' - Удаляет все выходные строки без символа %.
  • | sort -nr -k 4 - Сортирует оставшиеся строки в обратном порядке по четвертому столбцу (который является столбцом для процентной доли покрытия). Если вы хотите нормальный порядок вместо обратного порядка, замените -nr на -n.

Надеюсь, это поможет кому-то! =)

Ответ 4

Если вы используете coverage: py 3.0, тогда код в каталоге Python игнорируется по умолчанию, включая стандартную библиотеку и все установленные пакеты.

Ответ 5

Я бы сделал это:

nosetests --with-coverage --cover-package=foo,bar tests/*

Я предпочитаю это решение другим предлагаемым; это просто, но вы четко о том, какие пакеты вы хотите охватить. Ответ Надии включает в себя гораздо более избыточную типизацию, ответ Стюарта использует sed и по-прежнему создает пакет, вызывая touch __init__.py, и --cover-package=. не работает для меня.

Ответ 6

Для тех, кто пытается это сделать с помощью setup.cfg, работает следующее. У меня возникли проблемы с выяснением того, как указать несколько пакетов.

[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2

Ответ 7

touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed '[email protected]*/@@g'`

Ответ 8

Вы можете улучшить принятый ответ так: --cover-package=foo,bar