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


Мой СУТ выглядит так:

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?

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

8 17

8 ответов:

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

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

Я быстро взглянул на исходный код нос, чтобы подтвердить: это строка

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

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

--cover-package=.

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

NOSE_COVER_PACKAGE=.

Испытано с носом 1.1.2

У меня есть много файлов/пакетов Python верхнего уровня, и мне неприятно перечислять их все вручную, используя --cover-package, поэтому я сделал два псевдонима для себя. Псевдоним nosetests_cover будет работать освещение с верхнего уровня на языке Python файлов/пакеты, перечисленные в ... чехол-пакет. Alias 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.
  • это должны быть запуск из каталога верхнего уровня. В противном случае имена пакетов будут неверными, и coverage будет молча не обрабатывать их (т. е. вместо того, чтобы сообщить вам, что ваш-coverage-package неверен, он будет действовать так, как будто вы вообще не предоставляли опцию).
  • в настоящее время я использую Python 2.7.6 на Ubuntu 13.10, с носом версии 1.3.0 и покрытием версии 3.7.1. Это единственная установка, в которой я протестировал эти команды.
  • в ваше использование, удаление покрытия-очистка и ... крышка-включительно если они не соответствуют вашим потребностям.
  • Если вы хотите сортировать в обычном порядке, а не в обратном, замените -nr на -n в команде сортировки.
  • эти команды предполагают, что все ваши файлы/пакеты Python верхнего уровня имеют имена без точки (кроме точки в ".py"). если это не так, прочитайте раздел ниже, чтобы понять части команд, а затем измените команды соответствующим образом.

Подробности:

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

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

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

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

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

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

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

Я бы сделал так:

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

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

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

[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`

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