2009-05-12 8 views
16

Мой 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, я получаю детали для всех видов модулей, которые я предпочел бы игнорировать. Но я не могу использовать опцию , поскольку foo.py & bar.py не находятся в пакете . (См нить после http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.html для моих причин для не положить их в пакет.)

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

Update - Если предположить, что это не лучший ответ, чем Nadia-х ниже, я спросил следить за вопрос: "How do I write some (bash) shell script to convert all matching filenames in directory to command-line options?"

+0

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

ответ

21

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

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

я имел быстрый взгляд на нос исходный код для подтверждения: This is the line

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

Я впечатлен тем, что вы посмотрели на источник. (Я должен был подумать об этом.) Но это показывает, что мне нужно использовать «--cover-package = foo --cover-package = bar». Если вы измените свой ответ, я приму его (и проголосую). –

+1

Спасибо за примечание. Я исправил ответ. Раньше я никогда не использовал нос. Но я думал, что постараюсь ответить на вопрос, потому что никто не ответил. –

+0

Спасибо Nadia. Вам все равно нужно удалить расширения «.py», поскольку аргументы представляют собой имена пакетов, а не имена файлов. –

3

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

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

Будет хорошо, если вы сможете добавить некоторые детали к своему ответу. – akjoshi

12

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

--cover-package=. 

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

NOSE_COVER_PACKAGE=. 

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

+0

Это работает. Благодарю. – cnu

+0

Как можно добиться одного и того же с параметрами в setup.cfg? –

+9

Я получаю информацию о покрытии из пакетов сайтов, используя это:/ –

2

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

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

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

4

У меня есть много файлов и пакетов Python на верхнем уровне, и найти его раздражающим, чтобы перечислить их все вручную, используя --cover-package, поэтому я сделал два псевдонима для себя. Псевдоним 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 в команде сортировки.
  • Эти команды предполагают, что все ваши файлы/пакеты верхнего уровня 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.

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

2

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

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

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