Могу ли я ограничить вывод покрытия носа каталогом (а не пакетом)?
Моя 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 Alramli, я задал следующий вопрос: "Как мне написать некоторый (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 верхнего уровня, перечисленных в --cover-package. кличка 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-package неверен, он будет действовать так, как будто вы вообще не указали эту опцию).
- В настоящее время я использую Python 2.7.6 в Ubuntu 13.10, с версией носа 1.3.0 и версией покрытия 3.7.1. Это единственная установка, в которой я тестировал эти команды.
- В вашем случае, удалите --cover-erase и --cover-inclusive, если они не соответствуют вашим потребностям.
- Если вы хотите отсортировать в обычном порядке, а не в обратном порядке, замените
-nr
с-n
в команде сортировки. - Эти команды предполагают, что все ваши файлы / пакеты Python верхнего уровня названы без точки (кроме точки в ".py"). Если это не так, прочтите раздел "Подробности" ниже, чтобы понять части команд, а затем измените команды соответствующим образом.
Подробности:
Я не утверждаю, что это самые эффективные команды для достижения желаемых результатов. Это просто команды, которые мне довелось придумать. = Р
Главным объяснением будет аргумент --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
- Сортирует оставшиеся строки в обратном числовом порядке по 4-му столбцу (который является столбцом для процента покрытия). Если вы хотите нормальный порядок вместо обратного, замените-nr
с-n
,
Надеюсь, это поможет кому-то! знак равно
Если вы используете покрытие: py 3.0, то код в каталоге Python по умолчанию игнорируется, включая стандартную библиотеку и все установленные пакеты.
Для тех, кто пытается сделать это с помощью setup.cfg, работает следующее. У меня возникли проблемы с выяснением, как указать несколько пакетов.
[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
Я бы сделал это:
nosetests --with-coverage --cover-package=foo,bar tests/*
Я предпочитаю это решение другим предложенным; все просто, но вы точно знаете, на какие пакеты вы хотите получить покрытие. Ответ Надии включает в себя гораздо более избыточную типизацию, ответ Стюарта использует sed и все еще создает пакет, вызывая touch __init__.py
, а также--cover-package=.
не работает для меня
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`
Вы можете улучшить принятый ответ следующим образом --cover-package=foo,bar