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

Мой 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 по моим причинам не помещать их в пакет.)

  • Обработка исключений в Python Behave Testing framework
  • Проблемы с использованием носа в virtualenv
  • Список всех тестов, найденных Nosetest
  • Изменение имен тестов, созданных генераторами носовых тестов
  • Могу ли я ограничить вывод покрытия только foo.py & bar.py?

    Обновление. Предполагая, что нет лучшего ответа, чем Nadia ниже, я задал следующий вопрос: «Как написать сценарий оболочки (bash) для преобразования всех совпадающих имен файлов в каталог в параметры командной строки? "

  • Изменение имен тестов, созданных генераторами носовых тестов
  • Проблемы с использованием носа в virtualenv
  • Список всех тестов, найденных Nosetest
  • Обработка исключений в Python Behave Testing framework
  • 8 Solutions collect form web for “Могу ли я ограничить вывод покрытия носа в каталог (а не пакет)?”

    Вы можете использовать его следующим образом:

     --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, поэтому я сделал для себя два псевдонима. Alias nosetests_cover будет запускать покрытие со всеми вашими файлами / пакетами Python верхнего уровня, перечисленными в пакете -cover. Alias 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»). Если это неверно для вас, прочтите раздел «Сведения» ниже, чтобы понять детали команды, а затем, при необходимости, измените команды.

    Детали:

    Я не утверждаю, что это самые эффективные команды для достижения желаемых результатов. Это всего лишь команды, с которыми мне приходилось сталкиваться. = Р

    Главное, чтобы объяснить, было бы аргументом в –cover-package. Он строит список имен файлов / пакетов верхнего уровня Python верхнего уровня (с «.py», разделенным на имена файлов) следующим образом:

    • \$ – Сбрасывает символ $ в строке с двумя кавычками.
    • $( ) – Вставляет результат команды, содержащейся внутри.
    • ls – перечисляет все имена в текущем каталоге (должен быть каталог Python верхнего уровня).
    • | sed -r 's/[.]py$//' | sed -r 's/[.]py$//' – В списке заменяется «foo_bar.py» на «foo_bar».
    • | fgrep -v '.' – В списке удаляются все имена без точки (например, удаляются файлы foo_bar.pyc и notes.txt).
    • | paste -s -d ',' | paste -s -d ',' – Изменяет список из разделенного строки, разделенного запятыми.

    Я также должен объяснить сортировку.

    • 2>&1 – присоединяется к stderr и stdout.
    • | fgrep '%' | fgrep '%' – Удаляет все выходные строки без символа % .
    • | sort -nr -k 4 | sort -nr -k 4 – Сортирует оставшиеся строки в обратном порядке по четвертому столбцу (который является столбцом для процентной доли покрытия). Если вы хотите нормальный порядок вместо обратного порядка, замените -nr на -n .

    Надеюсь, это поможет кому-то! знак равно

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

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

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

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

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

     [nosetests] with-coverage=1 cover-html=1 cover-package=module1,module2 
     touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'` 

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

    Python - лучший язык программирования в мире.