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

StackOverflow https://stackoverflow.com/questions/855114

Вопрос

Мой СУТ выглядит как:

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?

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

Это было полезно?

Решение

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

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

Я быстро просмотрел исходный код nose, чтобы подтвердить: Это и есть линия

    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.
  • Они должны быть запущены из вашего каталога верхнего уровня.В противном случае имена пакетов будут неверными, и coverage не сможет их автоматически обработать (т.е.вместо того, чтобы сообщить вам, что ваш --cover-package неверен, он будет действовать так, как будто вы вообще не указывали эту опцию).
  • В настоящее время я использую Python 2.7.6 в Ubuntu 13.10 с версией nose 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 -- Сортирует оставшиеся строки в обратном числовом порядке по 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top