Можно ли ограничить выходные данные покрытия носом каталогом (а не пакетом)?
Мой СУТ выглядит так:
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 ответов:
Вы можете использовать его следующим образом:
--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 файлов/пакеты, перечисленные в ... чехол-пакет. Aliasnosetests_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=.
не работает на меня.