Могу ли я ограничить вывод покрытия носа в каталог (а не пакет)?
Мой 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