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

Моя 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

Другие вопросы по тегам